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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hc_isp116x_rh.c

?? 嵌入式USB主控制器ISP1161的驅動編程
?? C
字號:
/*-------------------------------------------------------------------------*//*-------------------------------------------------------------------------* * ISP116x virtual root hub * Roman Weissgaerber weissg@vienna.at * based on usb-ohci.c by R. Weissgaerber et al. *-------------------------------------------------------------------------* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * *-------------------------------------------------------------------------*//*-------------------------------------------------------------------------* * Virtual Root Hub  *-------------------------------------------------------------------------*/ /* Device descriptor */static __u8 root_hub_dev_des[] ={	0x12,       /*  __u8  bLength; */	0x01,       /*  __u8  bDescriptorType; Device */	0x10,	    /*  __u16 bcdUSB; v1.1 */	0x01,	0x09,	    /*  __u8  bDeviceClass; HUB_CLASSCODE */	0x00,	    /*  __u8  bDeviceSubClass; */	0x00,       /*  __u8  bDeviceProtocol; */	0x08,       /*  __u8  bMaxPacketSize0; 8 Bytes */	0x00,       /*  __u16 idVendor; */	0x00,	0x00,       /*  __u16 idProduct; */ 	0x00,	0x00,       /*  __u16 bcdDevice; */ 	0x00,	0x00,       /*  __u8  iManufacturer; */	0x02,       /*  __u8  iProduct; */	0x01,       /*  __u8  iSerialNumber; */	0x01        /*  __u8  bNumConfigurations; */};/* Configuration descriptor */static __u8 root_hub_config_des[] ={	0x09,       /*  __u8  bLength; */	0x02,       /*  __u8  bDescriptorType; Configuration */	0x19,       /*  __u16 wTotalLength; */	0x00,	0x01,       /*  __u8  bNumInterfaces; */	0x01,       /*  __u8  bConfigurationValue; */	0x00,       /*  __u8  iConfiguration; */	0x40,       /*  __u8  bmAttributes;                  Bit 7: Bus-powered, 6: Self-powered, 5 Remote-wakwup, 4..0: resvd */	0x00,       /*  __u8  MaxPower; */      	/* interface */	  	0x09,       /*  __u8  if_bLength; */	0x04,       /*  __u8  if_bDescriptorType; Interface */	0x00,       /*  __u8  if_bInterfaceNumber; */	0x00,       /*  __u8  if_bAlternateSetting; */	0x01,       /*  __u8  if_bNumEndpoints; */	0x09,       /*  __u8  if_bInterfaceClass; HUB_CLASSCODE */	0x00,       /*  __u8  if_bInterfaceSubClass; */	0x00,       /*  __u8  if_bInterfaceProtocol; */	0x00,       /*  __u8  if_iInterface; */     	/* endpoint */	0x07,       /*  __u8  ep_bLength; */	0x05,       /*  __u8  ep_bDescriptorType; Endpoint */	0x81,       /*  __u8  ep_bEndpointAddress; IN Endpoint 1 */ 	0x03,       /*  __u8  ep_bmAttributes; Interrupt */ 	0x02,       /*  __u16 ep_wMaxPacketSize; ((MAX_ROOT_PORTS + 1) / 8 */ 	0x00,	0xff        /*  __u8  ep_bInterval; 255 ms */};/* Hub class-specific descriptor is constructed dynamically *//*-------------------------------------------------------------------------*//* prepare Interrupt pipe data; HUB INTERRUPT ENDPOINT */  static int rh_send_irq (hci_t * hci, void * rh_data, int rh_len){	int num_ports;	int i;	int ret;	int len;	__u8 data[8];	num_ports = READ_REG32 (hci, HcRhDescriptorA) & RH_A_NDP; 		*(__u8 *) data = (READ_REG32 (hci, HcRhStatus) & (RH_HS_LPSC | RH_HS_OCIC))		? 1: 0;	ret = *(__u8 *) data;	for ( i = 0; i < num_ports; i++) {		*(__u8 *) (data + (i + 1) / 8) |= 			((READ_REG32 (hci, HcRhPortStatus + i) &				(RH_PS_CSC | RH_PS_PESC | RH_PS_PSSC | RH_PS_OCIC | RH_PS_PRSC))			    ? 1: 0) << ((i + 1) % 8);		ret += *(__u8 *) (data + (i + 1) / 8);	}	len = i/8 + 1;  	if (ret > 0) { 		memcpy (rh_data, data, min (len, min (rh_len, sizeof(data))));		return len;	}	return 0;}/*-------------------------------------------------------------------------*//* Virtual Root Hub INTs are polled by this timer every "interval" ms */ static void rh_int_timer_do (unsigned long ptr){	int len; 	struct urb * urb = (struct urb *) ptr;	hci_t * hci = urb->dev->bus->hcpriv;#if 0	if (hci->disabled)//		return;	/* ignore timers firing during PM suspend, etc */	if ((hci->hc_control & OHCI_CTRL_HCFS) != OHCI_USB_OPER)		goto out;#endif	if(hci->rh.send) { 		len = rh_send_irq (hci, urb->transfer_buffer, urb->transfer_buffer_length);		if (len > 0) {			urb->actual_length = len;			if (urb->complete)				urb->complete (urb);		}	}// out:	rh_init_int_timer (urb);}/*-------------------------------------------------------------------------*//* Root Hub INTs are polled by this timer */static int rh_init_int_timer (struct urb * urb) {	hci_t * hci = urb->dev->bus->hcpriv;	hci->rh.interval = urb->interval;	init_timer (&hci->rh.rh_int_timer);	hci->rh.rh_int_timer.function = rh_int_timer_do;	hci->rh.rh_int_timer.data = (unsigned long) urb;	hci->rh.rh_int_timer.expires = 			jiffies + (HZ * (urb->interval < 30? 30: urb->interval)) / 1000;	add_timer (&hci->rh.rh_int_timer);		return 0;}/*-------------------------------------------------------------------------*/#define OK(x) 			len = (x); break#define WR_RH_STAT(x) 		WRITE_REG32 (hci, (x), HcRhStatus)#define WR_RH_PORTSTAT(x) 	WRITE_REG32 (hci, (x), HcRhPortStatus + wIndex - 1)#define RD_RH_STAT		READ_REG32 (hci, HcRhStatus)#define RD_RH_PORTSTAT		READ_REG32 (hci, HcRhPortStatus + wIndex - 1)/* request to virtual root hub */static int rh_submit_urb (struct urb * urb){	struct usb_device * usb_dev = urb->dev;	hci_t * hci = usb_dev->bus->hcpriv;	unsigned int pipe = urb->pipe;//	devrequest * cmd = (devrequest *) urb->setup_packet;	struct usb_ctrlrequest *cmd = (struct usb_ctrlrequest *) urb->setup_packet;	void * data = urb->transfer_buffer;	int leni = urb->transfer_buffer_length;	int len = 0;	int status = TD_CC_NOERROR;	__u32 datab[4];	__u8  * data_buf = (__u8 *) datab; 	__u16 bmRType_bReq;	__u16 wValue;	__u16 wIndex;	__u16 wLength;	if (usb_pipeint(pipe)) {		hci->rh.urb =  urb;		hci->rh.send = 1;		hci->rh.interval = urb->interval;		rh_init_int_timer(urb);		urb->status = cc_to_error [TD_CC_NOERROR];		return 0;	}/*	bmRType_bReq  = cmd->requesttype | (cmd->request << 8);	wValue        = le16_to_cpu (cmd->value);	wIndex        = le16_to_cpu (cmd->index);	wLength       = le16_to_cpu (cmd->length);*/      	bmRType_bReq = cmd->bRequestType | (cmd->bRequest << 8);	wValue = le16_to_cpu (cmd->wValue);	wIndex = le16_to_cpu (cmd->wIndex);	wLength = le16_to_cpu (cmd->wLength);	dbg ("rh_submit_urb, req = %d(%x) len=%d", bmRType_bReq,		bmRType_bReq, wLength);	switch (bmRType_bReq) {	/* Request Destination:	   without flags: Device, 	   RH_INTERFACE: interface, 	   RH_ENDPOINT: endpoint,	   RH_CLASS means HUB here, 	   RH_OTHER | RH_CLASS  almost ever means HUB_PORT here 	*/  		case RH_GET_STATUS: 				 						*(__u16 *) data_buf = cpu_to_le16 (1); OK (2);		case RH_GET_STATUS | RH_INTERFACE: 	 						*(__u16 *) data_buf = cpu_to_le16 (0); OK (2);		case RH_GET_STATUS | RH_ENDPOINT:	 						*(__u16 *) data_buf = cpu_to_le16 (0); OK (2);   		case RH_GET_STATUS | RH_CLASS: 								*(__u32 *) data_buf = cpu_to_le32 (					RD_RH_STAT & ~(RH_HS_CRWE | RH_HS_DRWE));				OK (4);		case RH_GET_STATUS | RH_OTHER | RH_CLASS: 					*(__u32 *) data_buf = cpu_to_le32 (RD_RH_PORTSTAT); OK (4);		case RH_CLEAR_FEATURE | RH_ENDPOINT:  			switch (wValue) {				case (RH_ENDPOINT_STALL): OK (0);			}			break;		case RH_CLEAR_FEATURE | RH_CLASS:			switch (wValue) {				case RH_C_HUB_LOCAL_POWER:					OK(0);				case (RH_C_HUB_OVER_CURRENT): 						WR_RH_STAT(RH_HS_OCIC); OK (0);			}			break;				case RH_CLEAR_FEATURE | RH_OTHER | RH_CLASS:			switch (wValue) {				case (RH_PORT_ENABLE): 									WR_RH_PORTSTAT (RH_PS_CCS ); OK (0);				case (RH_PORT_SUSPEND):									WR_RH_PORTSTAT (RH_PS_POCI); OK (0);				case (RH_PORT_POWER):									WR_RH_PORTSTAT (RH_PS_LSDA); OK (0);				case (RH_C_PORT_CONNECTION):							WR_RH_PORTSTAT (RH_PS_CSC ); OK (0);				case (RH_C_PORT_ENABLE):								WR_RH_PORTSTAT (RH_PS_PESC); OK (0);				case (RH_C_PORT_SUSPEND):								WR_RH_PORTSTAT (RH_PS_PSSC); OK (0);				case (RH_C_PORT_OVER_CURRENT):							WR_RH_PORTSTAT (RH_PS_OCIC); OK (0);				case (RH_C_PORT_RESET):									WR_RH_PORTSTAT (RH_PS_PRSC); OK (0); 			}			break; 		case RH_SET_FEATURE | RH_OTHER | RH_CLASS:			switch (wValue) {				case (RH_PORT_SUSPEND):									WR_RH_PORTSTAT (RH_PS_PSS ); OK (0); 				case (RH_PORT_RESET): /* BUG IN HUB CODE *********/						if (RD_RH_PORTSTAT & RH_PS_CCS)							WR_RH_PORTSTAT (RH_PS_PRS);							OK (0);				case (RH_PORT_POWER):									WR_RH_PORTSTAT (RH_PS_PPS ); OK (0); 				case (RH_PORT_ENABLE): /* BUG IN HUB CODE *********/						if (RD_RH_PORTSTAT & RH_PS_CCS)							WR_RH_PORTSTAT (RH_PS_PES );							OK (0);			}			break;		case RH_SET_ADDRESS: hci->rh.devnum = wValue; OK(0);		case RH_GET_DESCRIPTOR:			switch ((wValue & 0xff00) >> 8) {				case (0x01): /* device descriptor */					len = min (leni, min (sizeof (root_hub_dev_des), wLength));					data_buf = root_hub_dev_des; OK(len);				case (0x02): /* configuration descriptor */					len = min (leni, min (sizeof (root_hub_config_des), wLength));					data_buf = root_hub_config_des; OK(len);				case (0x03): /* string descriptors */					len = usb_root_hub_string (wValue & 0xff,						(int)(long) 0, "ISP116x",						data, wLength);					if (len > 0) {						data_buf = data;						OK (min (leni, len));					}					// else fallthrough				default: 					status = TD_CC_STALL;			}			break;				case RH_GET_DESCRIPTOR | RH_CLASS:		    {			    __u32 temp = READ_REG32 (hci, HcRhDescriptorA);			    data_buf [0] = 9;		// min length;			    data_buf [1] = 0x29;			    data_buf [2] = temp & RH_A_NDP;			    data_buf [3] = 0;			    if (temp & RH_A_PSM) 	/* per-port power switching? */				data_buf [3] |= 0x1;			    if (temp & RH_A_NOCP)	/* no overcurrent reporting? */				data_buf [3] |= 0x10;			    else if (temp & RH_A_OCPM)	/* per-port overcurrent reporting? */				data_buf [3] |= 0x8;			    datab [1] = 0;			    data_buf [5] = (temp & RH_A_POTPGT) >> 24;			    temp = READ_REG32 (hci, HcRhDescriptorB);			    data_buf [7] = temp & RH_B_DR;			    if (data_buf [2] < 7) {				data_buf [8] = 0xff;			    } else {				data_buf [0] += 2;				data_buf [8] = (temp & RH_B_DR) >> 8;				data_buf [10] = data_buf [9] = 0xff;			    }							    len = min (leni, min (data_buf [0], wLength));			    OK (len);			} 		case RH_GET_CONFIGURATION: 	*(__u8 *) data_buf = 0x01; OK (1);		case RH_SET_CONFIGURATION: 	WR_RH_STAT (0x10000); OK (0);		default: 			dbg ("unsupported root hub command");			status = TD_CC_STALL;	}	#ifdef	DEBUG	// hci_dump_roothub (ohci, 0);#endif	len = min(len, leni);	if (data != data_buf)	    memcpy (data, data_buf, len);  	urb->actual_length = len;	urb->status = cc_to_error [status];		// hci_return_urb (hci, urb, NULL); 	urb->hcpriv = NULL;//	usb_dec_dev_use (usb_dev);	urb->dev = NULL;	if (urb->complete)	    	urb->complete (urb);		return 0;}/*-------------------------------------------------------------------------*/static int rh_unlink_urb (struct urb * urb){	hci_t * hci = urb->dev->bus->hcpriv; 	if (hci->rh.urb == urb) {		hci->rh.send = 0;		del_timer (&hci->rh.rh_int_timer);		hci->rh.urb = NULL;		urb->hcpriv = NULL;		usb_dec_dev_use(urb->dev);		urb->dev = NULL;		if (urb->transfer_flags & USB_ASYNC_UNLINK) {			urb->status = -ECONNRESET;			if (urb->complete)				urb->complete (urb);		} else			urb->status = -ENOENT;	}	return 0;}/*-------------------------------------------------------------------------*//* connect the virtual root hub */ static int rh_connect_rh (hci_t * hci) {         struct usb_device  * usb_dev;         hci->rh.devnum = 0;        usb_dev = usb_alloc_dev (NULL, hci->bus);        if (!usb_dev)            return -ENOMEM;         hci->bus->root_hub = usb_dev;        usb_connect (usb_dev);        if (usb_new_device (usb_dev) != 0) {                usb_free_dev (usb_dev);                return -ENODEV;        }         return 0;} 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
jiyouzz国产精品久久| 免费观看在线色综合| 欧美猛男男办公室激情| 激情久久五月天| 亚洲二区在线视频| 日韩一区欧美小说| 国产午夜亚洲精品午夜鲁丝片| 欧美片在线播放| 精品婷婷伊人一区三区三| 不卡av电影在线播放| 国产制服丝袜一区| 精品一区二区三区欧美| 偷拍一区二区三区四区| 亚洲免费在线观看视频| 国产精品久久久久天堂| 国产目拍亚洲精品99久久精品| 欧美日韩日日骚| 欧美性猛片xxxx免费看久爱| 91蝌蚪porny九色| 91麻豆福利精品推荐| 99精品欧美一区二区三区小说| 男女男精品视频| 人人爽香蕉精品| 香港成人在线视频| 偷窥国产亚洲免费视频| 亚洲va欧美va人人爽午夜| 国产精品色噜噜| 中文字幕中文字幕在线一区 | 国产呦精品一区二区三区网站| 丝袜美腿成人在线| 开心九九激情九九欧美日韩精美视频电影 | 欧美人牲a欧美精品| 亚洲精品一区二区三区蜜桃下载| 欧美激情一区在线观看| 天天综合日日夜夜精品| 国产一区 二区 三区一级| 一本久道久久综合中文字幕| 欧美一区二区美女| 亚洲精选一二三| 狠狠色丁香久久婷婷综合丁香| 99这里只有精品| 精品欧美一区二区在线观看| 综合欧美一区二区三区| 精品在线一区二区| 欧美日韩一区二区三区在线看| 久久久久久麻豆| 日韩av电影免费观看高清完整版在线观看| 国产精品中文有码| 欧美电影影音先锋| 亚洲精品高清在线| 成人精品gif动图一区| 欧美一区二区福利视频| 一区二区免费在线播放| 国产成人综合精品三级| 日韩欧美黄色影院| 午夜私人影院久久久久| 色综合中文字幕国产| 日韩一级片网址| 日韩中文字幕av电影| 在线免费不卡视频| 自拍视频在线观看一区二区| 国产精品资源在线看| 91精品国产综合久久久久久| 一区二区三区在线观看欧美 | 亚洲大尺度视频在线观看| 成人亚洲一区二区一| 久久精品一区四区| 国产呦萝稀缺另类资源| 精品久久久久久久人人人人传媒| 日本在线不卡一区| 欧美精品xxxxbbbb| 丝袜脚交一区二区| 7777精品伊人久久久大香线蕉的 | 欧美日韩高清一区二区| 亚洲午夜电影网| 欧美丝袜第三区| 亚洲国产日韩一级| 欧美一区日本一区韩国一区| 亚洲国产精品久久久久秋霞影院| 欧美私模裸体表演在线观看| 亚洲在线中文字幕| 欧美日韩久久久一区| 无吗不卡中文字幕| 日韩女优毛片在线| 国产一区视频导航| 国产精品女人毛片| 日本韩国精品在线| 日日摸夜夜添夜夜添国产精品| 制服丝袜中文字幕一区| 蜜臀久久久99精品久久久久久| 精品久久人人做人人爱| 国产a精品视频| 亚洲精品国产高清久久伦理二区| 91在线观看下载| 亚洲国产三级在线| 欧美成人精品3d动漫h| 国产一区二区三区| 亚洲欧美日韩久久| 日韩欧美成人一区| 99天天综合性| 日本不卡一二三区黄网| 国产日产欧美精品一区二区三区| 91麻豆免费观看| 青青草国产成人99久久| 欧美韩国日本综合| 26uuu亚洲综合色| 91丝袜高跟美女视频| 日一区二区三区| 国产精品视频免费| 777a∨成人精品桃花网| 白白色亚洲国产精品| 午夜av一区二区| 中文字幕乱码久久午夜不卡| 在线观看欧美精品| 国产成人免费在线视频| 亚洲成人av中文| 中文字幕欧美国产| 日韩欧美中文字幕精品| 91蜜桃在线免费视频| 极品少妇一区二区三区精品视频 | 91精品国产91久久久久久一区二区| 国内成人免费视频| 亚洲高清免费观看| 中日韩av电影| 欧美成人a∨高清免费观看| 91丨九色丨黑人外教| 韩国一区二区视频| 五月天一区二区| 亚洲人成7777| 欧美激情在线免费观看| 欧美成人激情免费网| 欧美最猛性xxxxx直播| 国产成人在线影院| 久久精品99久久久| 日韩中文字幕1| 亚洲午夜激情av| 亚洲精品国产成人久久av盗摄| 国产三级精品视频| 精品国产凹凸成av人导航| 7777精品久久久大香线蕉| 在线视频亚洲一区| 91免费版pro下载短视频| aaa国产一区| 91免费看视频| 色综合欧美在线视频区| 99久免费精品视频在线观看 | 精品一区二区三区在线观看| 亚洲6080在线| 亚洲影院理伦片| 亚洲国产中文字幕在线视频综合| 亚洲欧美日韩成人高清在线一区| 国产精品女人毛片| 亚洲天堂精品视频| 亚洲天堂中文字幕| 亚洲自拍偷拍av| 亚洲成va人在线观看| 亚洲一区二区中文在线| 亚洲成av人**亚洲成av**| 亚洲国产精品综合小说图片区| 亚洲国产一区二区三区| 性做久久久久久久免费看| 日韩高清不卡一区二区三区| 日韩不卡一二三区| 国产一区二区三区四区五区入口 | 色先锋久久av资源部| 91小视频免费看| 精品视频在线免费| 日韩欧美在线影院| 久久久精品免费免费| 国产精品伦理在线| 亚洲伊人伊色伊影伊综合网| 丝袜亚洲另类欧美| 国产传媒欧美日韩成人| 99国产精品国产精品久久| 欧美日韩精品久久久| 精品不卡在线视频| 中文字幕亚洲电影| 日韩精品一二三区| 粉嫩嫩av羞羞动漫久久久| 色婷婷久久久亚洲一区二区三区 | 亚洲国产电影在线观看| 一区二区在线观看免费视频播放| 丝袜诱惑亚洲看片| 成人永久免费视频| 欧美日本国产一区| 日本一区二区三区国色天香| 一区二区成人在线观看| 激情综合色播五月| 日本韩国欧美一区二区三区| 欧美zozozo| 亚洲国产欧美在线| 成人国产精品免费观看动漫 | 国产不卡视频在线播放| 欧美性大战久久久久久久蜜臀 | 亚洲免费观看高清完整版在线| 日韩精品亚洲一区二区三区免费| 国产精品 欧美精品| 欧美日韩一区二区三区视频| 久久久久久久久久美女| 天天色天天操综合|