亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? hc_crisv10.c

?? host usb 主設(shè)備程序 支持sd卡 mouse keyboard 的最單單的驅(qū)動(dòng)程序 gcc編譯
?? C
?? 第 1 頁 / 共 5 頁
字號(hào):
{	usb_isoc_complete_data_t *comp_data = (usb_isoc_complete_data_t*)data;	struct urb *urb;	int epid;	int epid_done;	etrax_urb_priv_t *urb_priv;	DBFENTER;	dbg_isoc("dma8_sub3_descr (ISOC) bottom half.");	for (epid = 0; epid < NBR_OF_EPIDS - 1; epid++) {		unsigned long flags;		save_flags(flags);		cli();		epid_done = 0;		/* The descriptor interrupt handler has marked all transmitted isoch. out		   URBs with TRANSFER_DONE.  Now we traverse all epids and for all that 		   have isoch. out traffic traverse its URB list and complete the		   transmitted URB.		*/		while (!epid_done) {			/* Get the first urb (if any). */			urb = urb_list_first(epid);			if (urb == 0) {				epid_done = 1;				continue;			}			if (usb_pipetype(urb->pipe) != PIPE_ISOCHRONOUS) {					epid_done = 1;					continue;			}			if (!usb_pipeout(urb->pipe)) {				/* descr interrupts are generated only for out pipes. */				epid_done = 1;				continue;			}			dbg_isoc("Check epid %d, SB 0x%p", epid, (char*)TxIsocEPList[epid].sub);			urb_priv = (etrax_urb_priv_t *)urb->hcpriv;			assert(urb_priv);			if (urb_priv->urb_state == TRANSFER_DONE) {				int i;				struct usb_iso_packet_descriptor *packet;				/* This urb has been sent. */				dbg_isoc("Completing isoc out URB 0x%p", urb);				for (i = 0; i < urb->number_of_packets; i++) {					packet = &urb->iso_frame_desc[i];					packet->status = 0;					packet->actual_length = packet->length;				}				etrax_usb_complete_isoc_urb(urb, 0);				if (urb_list_empty(epid)) {					etrax_usb_free_epid(epid);					epid_done = 1;				}			} else {				epid_done = 1;			}		}		restore_flags(flags);	}	kmem_cache_free(isoc_compl_cache, comp_data);	DBFEXIT;}static irqreturn_t etrax_usb_rx_interrupt(int irq, void *vhc){	struct urb *urb;	etrax_urb_priv_t *urb_priv;	int epid = 0;	unsigned long flags;	/* Isoc diagnostics. */	static int curr_fm = 0;	static int prev_fm = 0;	DBFENTER;	/* Clear this interrupt. */	*R_DMA_CH9_CLR_INTR = IO_STATE(R_DMA_CH9_CLR_INTR, clr_eop, do);	/* Note that this while loop assumes that all packets span only	   one rx descriptor. */	/* The reason we cli here is that we call the driver's callback functions. */	save_flags(flags);	cli();	while (myNextRxDesc->status & IO_MASK(USB_IN_status, eop)) {		epid = IO_EXTRACT(USB_IN_status, epid, myNextRxDesc->status);		urb = urb_list_first(epid);		//printk("eop for epid %d, first urb 0x%lx\n", epid, (unsigned long)urb);		if (!urb) {			err("No urb for epid %d in rx interrupt", epid);			__dump_ept_data(epid);			goto skip_out;		}		/* Note that we cannot indescriminately assert(usb_pipein(urb->pipe)) since		   ctrl pipes are not. */		if (myNextRxDesc->status & IO_MASK(USB_IN_status, error)) {			__u32 r_usb_ept_data;			int no_error = 0;			assert(test_bit(epid, (void *)&epid_usage_bitmask));			*R_USB_EPT_INDEX = IO_FIELD(R_USB_EPT_INDEX, value, epid);			nop();			if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {				r_usb_ept_data = *R_USB_EPT_DATA_ISO;				if ((r_usb_ept_data & IO_MASK(R_USB_EPT_DATA_ISO, valid)) &&				    (IO_EXTRACT(R_USB_EPT_DATA_ISO, error_code, r_usb_ept_data) == 0) &&				    (myNextRxDesc->status & IO_MASK(USB_IN_status, nodata))) {					/* Not an error, just a failure to receive an expected iso					   in packet in this frame.  This is not documented					   in the designers reference.					*/					no_error++;				} else {					warn("R_USB_EPT_DATA_ISO for epid %d = 0x%x", epid, r_usb_ept_data);				}			} else {				r_usb_ept_data = *R_USB_EPT_DATA;				warn("R_USB_EPT_DATA for epid %d = 0x%x", epid, r_usb_ept_data);			}			if (!no_error){				warn("error in rx desc->status, epid %d, first urb = 0x%lx",				     epid, (unsigned long)urb);				__dump_in_desc(myNextRxDesc);				warn("R_USB_STATUS = 0x%x", *R_USB_STATUS);				/* Check that ept was disabled when error occurred. */				switch (usb_pipetype(urb->pipe)) {				case PIPE_BULK:					assert(!(TxBulkEPList[epid].command & IO_MASK(USB_EP_command, enable)));					break;				case PIPE_CONTROL:					assert(!(TxCtrlEPList[epid].command & IO_MASK(USB_EP_command, enable)));					break;				case PIPE_INTERRUPT:					assert(!(TxIntrEPList[epid].command & IO_MASK(USB_EP_command, enable)));					break;				case PIPE_ISOCHRONOUS:					assert(!(TxIsocEPList[epid].command & IO_MASK(USB_EP_command, enable)));					break;				default:					warn("etrax_usb_rx_interrupt: bad pipetype %d in urb 0x%p",					     usb_pipetype(urb->pipe),					     urb);				}				etrax_usb_complete_urb(urb, -EPROTO);				goto skip_out;			}		}		urb_priv = (etrax_urb_priv_t *)urb->hcpriv;		assert(urb_priv);		if ((usb_pipetype(urb->pipe) == PIPE_BULK) ||		    (usb_pipetype(urb->pipe) == PIPE_CONTROL) ||		    (usb_pipetype(urb->pipe) == PIPE_INTERRUPT)) {			if (myNextRxDesc->status & IO_MASK(USB_IN_status, nodata)) {				/* We get nodata for empty data transactions, and the rx descriptor's				   hw_len field is not valid in that case. No data to copy in other				   words. */			} else {				/* Make sure the data fits in the buffer. */				assert(urb_priv->rx_offset + myNextRxDesc->hw_len				       <= urb->transfer_buffer_length);				memcpy(urb->transfer_buffer + urb_priv->rx_offset,				       phys_to_virt(myNextRxDesc->buf), myNextRxDesc->hw_len);				urb_priv->rx_offset += myNextRxDesc->hw_len;			}			if (myNextRxDesc->status & IO_MASK(USB_IN_status, eot)) {				if ((usb_pipetype(urb->pipe) == PIPE_CONTROL) &&				    ((TxCtrlEPList[urb_priv->epid].command & IO_MASK(USB_EP_command, enable)) ==				     IO_STATE(USB_EP_command, enable, yes))) {					/* The EP is still enabled, so the OUT packet used to ack					   the in data is probably not processed yet.  If the EP					   sub pointer has not moved beyond urb_priv->last_sb mark					   it for a descriptor interrupt and complete the urb in					   the descriptor interrupt handler.					*/					USB_SB_Desc_t *sub = TxCtrlEPList[urb_priv->epid].sub ? phys_to_virt(TxCtrlEPList[urb_priv->epid].sub) : 0;					while ((sub != NULL) && (sub != urb_priv->last_sb)) {						sub = sub->next ? phys_to_virt(sub->next) : 0;					}					if (sub != NULL) {						/* The urb has not been fully processed. */						urb_priv->urb_state = WAITING_FOR_DESCR_INTR;					} else {						warn("(CTRL) epid enabled and urb (0x%p) processed, ep->sub=0x%p", urb, (char*)TxCtrlEPList[urb_priv->epid].sub);						etrax_usb_complete_urb(urb, 0);					}				} else {					etrax_usb_complete_urb(urb, 0);				}			}		} else if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {			struct usb_iso_packet_descriptor *packet;			if (urb_priv->urb_state == UNLINK) {				info("Ignoring rx data for urb being unlinked.");				goto skip_out;			} else if (urb_priv->urb_state == NOT_STARTED) {				info("What? Got rx data for urb that isn't started?");				goto skip_out;			}			packet = &urb->iso_frame_desc[urb_priv->isoc_packet_counter];			packet->status = 0;			if (myNextRxDesc->status & IO_MASK(USB_IN_status, nodata)) {				/* We get nodata for empty data transactions, and the rx descriptor's				   hw_len field is not valid in that case. We copy 0 bytes however to				   stay in synch. */				packet->actual_length = 0;			} else {				packet->actual_length = myNextRxDesc->hw_len;				/* Make sure the data fits in the buffer. */				assert(packet->actual_length <= packet->length);				memcpy(urb->transfer_buffer + packet->offset,				       phys_to_virt(myNextRxDesc->buf), packet->actual_length);			}			/* Increment the packet counter. */			urb_priv->isoc_packet_counter++;			/* Note that we don't care about the eot field in the rx descriptor's status.			   It will always be set for isoc traffic. */			if (urb->number_of_packets == urb_priv->isoc_packet_counter) {				/* Out-of-synch diagnostics. */				curr_fm = (*R_USB_FM_NUMBER & 0x7ff);				if (((prev_fm + urb_priv->isoc_packet_counter) % (0x7ff + 1)) != curr_fm) {					/* This test is wrong, if there is more than one isoc					   in endpoint active it will always calculate wrong					   since prev_fm is shared by all endpoints.					   FIXME Make this check per URB using urb->start_frame.					*/					dbg_isoc("Out of synch? Previous frame = %d, current frame = %d",						 prev_fm, curr_fm);				}				prev_fm = curr_fm;				/* Complete the urb with status OK. */				etrax_usb_complete_isoc_urb(urb, 0);			}		}	skip_out:		/* DMA IN cache bug. Flush the DMA IN buffer from the cache. (struct etrax_dma_descr		   has the same layout as USB_IN_Desc for the relevant fields.) */		prepare_rx_descriptor((struct etrax_dma_descr*)myNextRxDesc);		myPrevRxDesc = myNextRxDesc;		myPrevRxDesc->command |= IO_MASK(USB_IN_command, eol);		myLastRxDesc->command &= ~IO_MASK(USB_IN_command, eol);		myLastRxDesc = myPrevRxDesc;		myNextRxDesc->status = 0;		myNextRxDesc = phys_to_virt(myNextRxDesc->next);	}	restore_flags(flags);	DBFEXIT;        return IRQ_HANDLED;}/* This function will unlink the SB descriptors associated with this urb. */static int etrax_remove_from_sb_list(struct urb *urb){	USB_SB_Desc_t *next_sb, *first_sb, *last_sb;	etrax_urb_priv_t *urb_priv;	int i = 0;	DBFENTER;	urb_priv = (etrax_urb_priv_t *)urb->hcpriv;	assert(urb_priv);	/* Just a sanity check. Since we don't fiddle with the DMA list the EP descriptor	   doesn't really need to be disabled, it's just that we expect it to be. */	if (usb_pipetype(urb->pipe) == PIPE_BULK) {		assert(!(TxBulkEPList[urb_priv->epid].command & IO_MASK(USB_EP_command, enable)));	} else if (usb_pipetype(urb->pipe) == PIPE_CONTROL) {		assert(!(TxCtrlEPList[urb_priv->epid].command & IO_MASK(USB_EP_command, enable)));	}	first_sb = urb_priv->first_sb;	last_sb = urb_priv->last_sb;	assert(first_sb);	assert(last_sb);	while (first_sb != last_sb) {		next_sb = (USB_SB_Desc_t *)phys_to_virt(first_sb->next);		kmem_cache_free(usb_desc_cache, first_sb);		first_sb = next_sb;		i++;	}	kmem_cache_free(usb_desc_cache, last_sb);	i++;	dbg_sb("%d SB descriptors freed", i);	/* Compare i with urb->number_of_packets for Isoc traffic.	   Should be same when calling unlink_urb */	DBFEXIT;	return i;}static int etrax_usb_submit_bulk_urb(struct urb *urb){	int epid;	int empty;	unsigned long flags;	etrax_urb_priv_t *urb_priv;	DBFENTER;	/* Epid allocation, empty check and list add must be protected.	   Read about this in etrax_usb_submit_ctrl_urb. */	spin_lock_irqsave(&urb_list_lock, flags);	epid = etrax_usb_setup_epid(urb);	if (epid == -1) {		DBFEXIT;		spin_unlock_irqrestore(&urb_list_lock, flags);		return -ENOMEM;	}	empty = urb_list_empty(epid);	urb_list_add(urb, epid);	spin_unlock_irqrestore(&urb_list_lock, flags);	dbg_bulk("Adding bulk %s urb 0x%lx to %s list, epid %d",		 usb_pipein(urb->pipe) ? "IN" : "OUT", (unsigned long)urb, empty ? "empty" : "", epid);	/* Mark the urb as being in progress. */	urb->status = -EINPROGRESS;	/* Setup the hcpriv data. */	urb_priv = kzalloc(sizeof(etrax_urb_priv_t), KMALLOC_FLAG);	assert(urb_priv != NULL);	/* This sets rx_offset to 0. */	urb_priv->urb_state = NOT_STARTED;	urb->hcpriv = urb_priv;	if (empty) {		etrax_usb_add_to_bulk_sb_list(urb, epid);	}	DBFEXIT;	return 0;}static void etrax_usb_add_to_bulk_sb_list(struct urb *urb, int epid){	USB_SB_Desc_t *sb_desc;	etrax_urb_priv_t *urb_priv = (etrax_urb_priv_t *)urb->hcpriv;	unsigned long flags;	char maxlen;	DBFENTER;	dbg_bulk("etrax_usb_add_to_bulk_sb_list, urb 0x%lx", (unsigned long)urb);	maxlen = usb_maxpacket(urb->dev, urb->pipe, usb_pipeout(urb->pipe));	sb_desc = kmem_cache_zalloc(usb_desc_cache, SLAB_FLAG);	assert(sb_desc != NULL);	if (usb_pipeout(urb->pipe)) {		dbg_bulk("Grabbing bulk OUT, urb 0x%lx, epid %d", (unsigned long)urb, epid);		/* This is probably a sanity check of the bulk transaction length		   not being larger than 64 kB. */		if (urb->transfer_buffer_length > 0xffff) {			panic("urb->transfer_buffer_length > 0xffff");		}		sb_desc->sw_len = urb->transfer_buffer_length;		/* The rem field is don't care if it's not a full-length transfer, so setting		   it shouldn't hurt. Also, rem isn't used for OUT traffic. */		sb_desc->command = (IO_FIELD(USB_SB_command, rem, 0) |				    IO_STATE(USB_SB_command, tt, out) |				    IO_STATE(USB_SB_command, eot, yes) |				    IO_STATE(USB_SB_command, eol, yes));		/* The full field is set to yes, even if we don't actually check that this is		   a full-length transfer (i.e., that transfer_buffer_length % maxlen = 0).		   Setting full prevents the USB controller from sending an empty packet in		   that case.  However, if URB_ZERO_PACKET was set we want that. */		if (!(urb

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区三区四区五区六区| 美腿丝袜在线亚洲一区| 国产亚洲综合性久久久影院| 欧美另类一区二区三区| 欧美视频完全免费看| 色久优优欧美色久优优| 色婷婷av一区二区三区软件| 99久久精品国产麻豆演员表| 成人av电影免费观看| 成人福利在线看| 成人不卡免费av| 色综合久久中文字幕| 欧美在线综合视频| 欧美另类变人与禽xxxxx| 欧美日韩一区久久| 欧美日本国产一区| 91麻豆精品国产91久久久久久久久| 欧洲一区二区av| 欧美狂野另类xxxxoooo| 欧美一区二区三区爱爱| 久久综合中文字幕| 国产精品欧美极品| 亚洲精品国产第一综合99久久| 亚洲欧美日韩综合aⅴ视频| 亚洲在线视频一区| 日韩福利电影在线| 国产精品1区2区| 91在线观看污| 日韩视频在线永久播放| 中文字幕电影一区| 亚洲国产精品久久人人爱蜜臀| 日本aⅴ亚洲精品中文乱码| 日本视频一区二区三区| 成人激情动漫在线观看| 欧美无砖砖区免费| 精品国产青草久久久久福利| 欧美国产欧美综合| 亚洲18影院在线观看| 国产资源精品在线观看| 91论坛在线播放| 日韩欧美国产系列| 中文字幕亚洲欧美在线不卡| 五月婷婷综合网| 成人免费福利片| 欧美一区二区三区四区五区| 亚洲欧美影音先锋| 久久99久久99精品免视看婷婷| 972aa.com艺术欧美| 精品久久国产字幕高潮| 亚洲欧美一区二区三区国产精品 | 三级一区在线视频先锋| 成人性视频网站| 日韩欧美aaaaaa| 亚洲已满18点击进入久久| 国产99久久久精品| 精品日韩在线观看| 婷婷一区二区三区| 91蝌蚪porny九色| 国产精品免费久久久久| 精东粉嫩av免费一区二区三区| 欧美在线观看一区| 樱花影视一区二区| 99久久精品国产一区| 国产欧美日韩亚州综合| 久久99久久久久| 中文幕一区二区三区久久蜜桃| 五月天激情综合网| 91国产丝袜在线播放| 日韩毛片高清在线播放| 国产精品一区二区果冻传媒| 精品国产乱码久久久久久久久| 天天色综合成人网| 制服丝袜av成人在线看| 婷婷成人激情在线网| 欧美乱熟臀69xxxxxx| 五月天激情综合网| 欧美久久婷婷综合色| 亚洲制服丝袜在线| 欧美亚洲丝袜传媒另类| 亚洲国产美女搞黄色| 欧美午夜精品久久久| 亚洲国产成人高清精品| 在线视频国内自拍亚洲视频| 1区2区3区精品视频| 色综合久久综合中文综合网| 国产日韩亚洲欧美综合| 成熟亚洲日本毛茸茸凸凹| 国产女主播一区| 成人夜色视频网站在线观看| 中文字幕乱码久久午夜不卡| av不卡免费电影| 亚洲视频在线一区观看| 在线中文字幕不卡| 日韩成人免费看| 日韩一区二区精品在线观看| 日本va欧美va瓶| 久久婷婷国产综合精品青草| 国产91富婆露脸刺激对白| 亚洲人一二三区| 欧美三级午夜理伦三级中视频| 日韩一区精品视频| 精品区一区二区| thepron国产精品| 亚洲成人免费电影| 精品国产一区二区亚洲人成毛片| 国产精品主播直播| 一区二区三区日本| 日韩一区二区免费视频| www.亚洲色图| 亚洲国产精品久久不卡毛片| 91久久国产最好的精华液| 日本中文字幕一区二区有限公司| 久久久综合网站| 欧美色窝79yyyycom| 九色综合国产一区二区三区| 久久嫩草精品久久久久| 99久久伊人久久99| 肉丝袜脚交视频一区二区| 精品国产乱码久久| 色呦呦网站一区| 精品一区二区日韩| 一级特黄大欧美久久久| 国产精品国产精品国产专区不蜜 | 精品久久人人做人人爽| av资源网一区| 韩国中文字幕2020精品| 一区二区三区日韩| 亚洲天堂精品在线观看| 欧美一级黄色片| 欧美综合久久久| eeuss鲁一区二区三区| 日韩vs国产vs欧美| 一区二区成人在线观看| 国产精品视频yy9299一区| 欧美人伦禁忌dvd放荡欲情| 国产成人啪午夜精品网站男同| 日韩二区在线观看| 亚洲国产综合视频在线观看| 中文字幕在线不卡视频| 国产亚洲精品超碰| 精品国产一区二区在线观看| 欧美精品欧美精品系列| 91黄色免费看| 一本色道久久加勒比精品| 成人午夜免费视频| 国产成人免费视| 国产在线播放一区| 九色|91porny| 美女视频黄 久久| 性做久久久久久| 亚洲国产成人porn| 亚洲高清视频中文字幕| 一区二区三区日韩精品视频| 亚洲裸体在线观看| 中文字幕在线观看不卡| 亚洲欧美国产毛片在线| 国产精品成人免费| 亚洲人成网站影音先锋播放| 国产精品国产自产拍高清av| 中文字幕av不卡| 国产精品视频yy9299一区| 国产精品久久久久久久第一福利| 亚洲国产精品ⅴa在线观看| 欧美激情一区二区三区蜜桃视频| 精品免费国产二区三区| 亚洲精品一区二区三区99| 日韩欧美国产一区二区在线播放| 欧美一区二区三区影视| 久久一区二区三区国产精品| 久久久99久久精品欧美| 久久久一区二区三区捆绑**| 欧美经典一区二区三区| 久久久久久电影| 中文字幕永久在线不卡| 亚洲裸体在线观看| 日日摸夜夜添夜夜添精品视频| 男女激情视频一区| 精品一区二区在线免费观看| 国产一区二区日韩精品| 国产精品99精品久久免费| 不卡视频在线看| 欧洲亚洲精品在线| 欧美日韩三级在线| 久久精品一区二区三区av| 亚洲欧美韩国综合色| 久久99久久精品| 色婷婷一区二区三区四区| 日韩午夜激情免费电影| 国产精品网站在线观看| 亚洲午夜精品网| 国产馆精品极品| 欧美亚日韩国产aⅴ精品中极品| 6080日韩午夜伦伦午夜伦| 久久久国产一区二区三区四区小说 | 国产欧美一区二区三区在线老狼| 一区二区理论电影在线观看| 蜜桃av一区二区三区| jizzjizzjizz欧美| 日韩欧美一二区| 一区二区三区在线高清|