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

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

?? hcd_1161.c

?? isp116x系列USB芯片在LINUX下的驅動程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* * Philips 1161 HCD (Host Controller Driver) for USB. * *  Original Source from Linux 2.4.5 kernel OHCI HCD *  modified for Phlips Semi Conductors *  * Copyright  2002	Philips Semiconductors, * * File Name:	hcd_1161.c * * History:	 * *	Version	Date		Author		Comments * ------------------------------------------------- * 	1.0		03/14/02	SYARRA		Initial Release * 	1.1		04/24/03	SYARRA		NO_PTD_BIT5_5 flag * 									dependancy of td_t on 16 byte start  * 									address is removed. * *  1.11	05/15/03	SYARRA		enabling OHCI_CTRL_CLE/OHCI_CTRL_BLE * 									in dl_del_list function * 									Skip RH-timer processing in ISR *									proper clearing of ATL & SOF interrupts * *  * Note: Use tab space 4 */ #include <linux/config.h>#define MODULE#include <linux/module.h>#include <linux/pci.h>#include <linux/kernel.h>#include <linux/delay.h>#include <linux/ioport.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/smp_lock.h>#include <linux/errno.h>#include <linux/init.h>#include <linux/timer.h>#include <linux/list.h>#include <linux/interrupt.h>  /* for in_interrupt() */#undef DEBUG#include <linux/usb.h>#include <asm/io.h>#include <asm/irq.h>#include <asm/system.h>#include <asm/unaligned.h>#include "hcd_1161.h"typedef	__u32		ULONG;typedef	__u8		UCHAR;typedef	void		VOID;static      td_tree_addr_t   		tstAtlBridge[MAX_GTD+1];static      td_t             		*pstDoneHead_hcd ;static		isotd_map_buffer_t		aIsoTdMapBuffer[2];			/* One for each ITL */static 		LIST_HEAD (ohci_1161_hcd_list);static 		spinlock_t 				usb_ed_lock = SPIN_LOCK_UNLOCKED;#define		MAX_BULK_TD_BUFF_SIZE		512#define		MAX_CNTL_TD_BUFF_SIZE		1024#define		hc_1161_name	"ISP116x_HCD"	#define		OHCI_UNLINK_TIMEOUT			(HZ / 10)void print_int_ed_list(ohci_t	*ohci);/* 1161 HC accessing functions decleration */void 	fnvIsp1161HcorWrite	(ohci_t 	*ohci,ULONG 	uReg, ULONG 	uRegData);void 	fnvIsp1161HcorRead	(ohci_t 	*ohci,ULONG 	uReg, ULONG 	*puRegData);void 	fnvIsp1161HcRead	(ULONG	uReg, ULONG 	*puRegData);void 	fnvIsp1161HcWrite	(ULONG 	uReg, ULONG 	uRegData);void 	fnvIsp1161AtlRead	(__u8* 	pbyChar, __u32 	uTotalByte);void 	fnvIsp1161AtlWrite	(__u8* 	pbyChar, __u32 	uTotalByte);void 	fnvIsp1161ItlRead	(__u8* 	pbyChar, __u32 	uTotalByte);void 	fnvIsp1161ItlWrite	(__u8* 	pbyChar, __u32 	uTotalByte);/* 1161 HC Initialization functions decleration */ULONG 	fnvIsp1161HostReset	(ohci_t 	*ohci);ULONG 	fnuIsp1161HostDetect	(void);void 	fnvHcHardwareConfig	(ohci_t	*ohci, ULONG	uIntLevel);void 	fnvHcIntEnable	(ohci_t 	*ohci);void 	fnvHcControlInit	(ohci_t 	*ohci);void 	fnvHcInterruptInit	(ohci_t 	*ohci);void 	fnvHcFmIntervalInit	(ohci_t 	*ohci);void 	fnvHcRhPower	(ohci_t 	*ohci);int	 	fnuHci1161HostInit	(ohci_t 	*ohci);/* 1161 HC Interrupt Functions */static 	void 	fnvHci1161IrqHandler (int 	irq, void 	*__ohci, struct 	pt_regs *r);void 	fnvProcessSofItlInt	(ohci_t *ohci);/* TD functions decleration */static 	void 	td_fill (unsigned int info, void * data, int len, struct urb * urb, int index);static 	void 	td_submit_urb (struct urb * urb);/* EP handling functions */static int ep_int_ballance (ohci_t * ohci, int interval, int load);static int ep_2_n_interval (int inter);static int ep_rev (int num_bits, int word);static int ep_link (ohci_t * ohci, ed_t * edi);static int ep_unlink (ohci_t * ohci, ed_t * ed);static void ep_rm_ed (struct usb_device * usb_dev, ed_t * ed);static ed_t * ep_add_ed (struct usb_device * usb_dev, unsigned int pipe, int interval, int load);/* Done List handling functions */static void dl_transfer_length(td_t * td);static void dl_del_urb (struct urb * urb);static void dl_del_list (ohci_t  * ohci, unsigned int frame);static td_t * dl_reverse_done_list (ohci_t * ohci, td_t *td_list);static void dl_done_list (ohci_t * ohci, td_t * td_list);/* Root Hub function declerations */static int rh_send_irq (ohci_t * ohci, void * rh_data, int rh_len);static void rh_int_timer_do (unsigned long ptr);static int rh_init_int_timer (struct urb * urb);static int rh_submit_urb (struct urb * urb);static int rh_unlink_urb (struct urb * urb);/* URB support functions */static void urb_free_priv( struct ohci	*hc, urb_priv_t	*urb_priv);static void urb_rm_priv_locked (struct urb	*urb);static void urb_rm_priv (struct urb	*urb);/* SOHCI functions */static int s1161_alloc_dev (struct usb_device *usb_dev);static int s1161_free_dev (struct usb_device *usb_dev);static int s1161_get_current_frame_number (struct usb_device *usb_dev);static int s1161_return_urb (struct urb * urb);static int s1161_submit_urb (struct urb	*urb);static int s1161_unlink_urb (struct urb	*urb);/* OHCI functions */static void hc_release_1161 (ohci_t * ohci);static ohci_t * __devinit hc_alloc_1161 (struct pci_dev *dev);static int __devinit hc_found_1161 ( void) ;#define  outb(x,y)		outb(y,x)#define  inb	        inb#define  outw_hcd(x,y)	outw_p(y,x)#define  inw_hcd		inw_p#define	 sti_hcd		sti#define	 cli_hcd		cli#define	 iodelay_hcd()	udelay(1)#define	cmd_delay_hcd()		do{udelay(1);}while(0)#define	data_delay_hcd()	do{}while(0)/*--------------------------------------------------------------* * 1161 Host Controller operational registers write *--------------------------------------------------------------*/void fnvIsp1161HcorWrite(ohci_t *ohci,ULONG uReg, ULONG uRegData){	ULONG	uData;	/* Check if the registers are controlled by software */	if ((uReg == uHcHcdControl ) || (uReg == (uHcHcdControl | 0x80))) {		ohci->uHcHcdControl_hcd = uRegData;		return;	}	if ((uReg == uHcHcdCommandStatus) || (uReg == (uHcHcdCommandStatus | 0x80))) {		ohci->uHcHcdCommandStatus_hcd = uRegData;		return;	}	/* Write the register index to the command register */	outw_hcd(HC_COM, uReg | 0x80);	/* Write the data to the data register */	uData = uRegData & 0x0000FFFF;				/* Write lower 16-bit first */	outw_hcd(HC_DATA, uData);	uData = (uRegData & 0xFFFF0000) >> 16;		/* Then the higher 16-bit */	outw_hcd(HC_DATA, uData);} /* fnvIsp1161HcorWrite() *//*--------------------------------------------------------------* * 1161 Host Controller operational registers read *--------------------------------------------------------------*/void fnvIsp1161HcorRead(ohci_t *ohci,ULONG uReg, ULONG *puRegData){	ULONG	uData;	/* Service the HCD HC transfer control registers first */	if (uReg == uHcHcdControl ) {		*puRegData = ohci->uHcHcdControl_hcd;		return;	}	if (uReg == uHcHcdCommandStatus) {		*puRegData = ohci->uHcHcdCommandStatus_hcd;		return;	}	/* Write the register index to the command register */	outw_hcd(HC_COM, uReg);	/* Read the data from the data register */	uData = inw_hcd(HC_DATA);	*puRegData = uData & 0x0000FFFF;			/* Save the lower 16-bit value */	uData = inw_hcd(HC_DATA);	*puRegData |= (uData & 0x0000FFFF) << 16;		/* Take the higher 16-bit */} /* fnvIsp1161HcorRead() *//*--------------------------------------------------------------* * 1161 Host Controller registers read *--------------------------------------------------------------*/void fnvIsp1161HcRead(ULONG uReg, ULONG *puRegData){	ULONG	uData;	/* Write the register index to the command register */	outw_hcd(HC_COM, uReg);	/* Read the data from the data register */	uData = inw_hcd(HC_DATA);	*puRegData = uData;} /* fnvIsp1161HcRead() *//*--------------------------------------------------------------* * 1161 Host Controller registers write *--------------------------------------------------------------*/void fnvIsp1161HcWrite(ULONG uReg, ULONG uRegData){	/* Write the register index to the command register */	outw_hcd(HC_COM, uReg | 0x80);	/* Write the data to the data register */	outw_hcd(HC_DATA, uRegData);} /* fnvIsp1161HcWrite() *//*--------------------------------------------------------------* * 1161 Host Controller Atl Buffer Reading  *--------------------------------------------------------------*/void fnvIsp1161AtlRead(__u8* pbyChar, __u32 uTotalByte){	__u32           uTotalDoubleWord;	__u32*          puLong;	__u32           uIndex;	__u32           uData1;	__u32           uData2;#ifdef __TRACE_MID_LEVEL__	printk("fnvIsp1161AtlRead( buff = 0x%p, bytes = %d)\n",pbyChar,uTotalByte);#endif /* __TRACE_MID_LEVEL__ */	/* Program the transfer counter */	fnvIsp1161HcWrite(REG_XFER_CNTR, uTotalByte);	/* 2. Pass HCD ATL to ISP1161 internal ATL through the 32-bit ATLBuffer register */	/* Use PIO for the time being. Will use DMA */	uTotalDoubleWord = uTotalByte >> 2;             /* Number of double words to move from ISP1161 ATL */	puLong = (__u32*) pbyChar;      /* Convert the HCD byte buffer to double-word buffer */	cli_hcd();	/* Send the command */	outw_hcd(HC_COM,REG_ATL_BUFF_IO);	iodelay_hcd();	/* Read data from data port */	for (uIndex = 0; uIndex < uTotalDoubleWord; uIndex ++) {		uData1 = inw_hcd(HC_DATA);              /* Read lower 16-bit first */		uData2 = inw_hcd(HC_DATA);              /* then higher 16-bit */		/* Combine to 32-bit double word */		puLong[uIndex] = (uData1 & 0x0000FFFF) | ((uData2 & 0x0000FFFF) << 16);         /* Take the higher 16-bit */	} /* for */	sti_hcd();} /* End of fnvIsp1161AtlRead() *//*--------------------------------------------------------------* * 1161 Host Controller Atl Buffer Reading  *--------------------------------------------------------------*/void fnvIsp1161AtlWrite(__u8* pbyChar, __u32 uTotalByte){	__u32           uTotalDoubleWord;	__u32*          puLong;	__u32           uIndex;	__u32           uData1;	__u32           uData2;#ifdef __TRACE_MID_LEVEL__	printk("fnvIsp1161AtlWrite( buff = 0x%p, bytes = %d)\n",pbyChar,uTotalByte);#endif /* __TRACE_MID_LEVEL__ */	/* Program the transfer counter */	fnvIsp1161HcWrite(REG_XFER_CNTR, uTotalByte);	/* 2. Pass HCD ATL to ISP1161 internal ATL through the 32-bit ATLBuffer register */	/* Use PIO for the time being. Will use DMA */	uTotalDoubleWord = uTotalByte >> 2;			/* Number of double words to move from ISP1161 ATL */	puLong = (__u32*) pbyChar;					/* Convert the HCD byte buffer to double-word buffer */	/* Send the command */	outw_hcd(HC_COM,(REG_ATL_BUFF_IO | 0x80));		/* Don't forget to set bit 7 for write*/	iodelay_hcd();	cli_hcd();	/* Write data to the data port */	for (uIndex = 0; uIndex < uTotalDoubleWord; uIndex ++) {		uData1 = puLong[uIndex] & 0x0000FFFF;		/* Take the lower 16-bit of the double word */		uData2 = (puLong[uIndex] & 0xFFFF0000) >> 16;	/* Take the higher 16-bit of the double word */		/* Write them to ATL */		outw_hcd(HC_DATA,uData1);				/* Write lower 16-bit first */		outw_hcd(HC_DATA,uData2);				/* Write higher 16-bit */	} /* for */	sti_hcd();} /* End of fnvIsp1161AtlWrite() *//*--------------------------------------------------------------* * 1161 Host Controller Itl Buffer Reading  *--------------------------------------------------------------*/void fnvIsp1161ItlRead(__u8* pbyChar, __u32 uTotalByte){	__u32           uTotalDoubleWord;	__u32*          puLong;	__u32           uIndex;	__u32           uData1;	__u32           uData2;#ifdef __TRACE_MID_LEVEL__	printk("fnvIsp1161ItlRead( buff = 0x%p, bytes = %d)\n",pbyChar,uTotalByte);#endif /* __TRACE_MID_LEVEL__ */	outw_hcd(HC_COM, REG_XFER_CNTR | 0x80);	outw_hcd(HC_DATA, uTotalByte);	/* 2. Pass HCD ITL to ISP1161 internal ITL through the 32-bit ITLBuffer register */	/* Use PIO for the time being. Will use DMA */	uTotalDoubleWord = uTotalByte >> 2;             /* Number of double words to move from ISP1161 ATL */	puLong = (__u32*) pbyChar;      /* Convert the HCD byte buffer to double-word buffer */	cli_hcd();	/* Send the command */	outw_hcd(HC_COM,REG_ITL_BUFF_IO);	/* Read data from data port */	for (uIndex = 0; uIndex < uTotalDoubleWord; uIndex ++) {		uData1 = inw_hcd(HC_DATA);              /* Read lower 16-bit first */		uData2 = inw_hcd(HC_DATA);              /* then higher 16-bit */		/* Combine to 32-bit double word */		puLong[uIndex] = (uData1 & 0x0000FFFF) | ((uData2 & 0x0000FFFF) << 16);         /* Take the higher 16-bit */	} /* for */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
看片网站欧美日韩| 91偷拍与自偷拍精品| 国产一区二区三区| 91久久国产综合久久| 久久久天堂av| 老司机午夜精品| 欧美日韩国产123区| 亚洲视频中文字幕| 国产乱码字幕精品高清av | 精品国产免费人成电影在线观看四季| 国产精品女同一区二区三区| 亚洲国产精品久久久久秋霞影院| 国产成人精品影视| 日韩一二三区视频| 日韩精品亚洲专区| 欧美曰成人黄网| 亚洲精品久久久蜜桃| 懂色一区二区三区免费观看| 欧美大度的电影原声| 午夜一区二区三区视频| 色94色欧美sute亚洲线路一ni| 国产精品天天看| 懂色av中文一区二区三区| 精品国产sm最大网站免费看| 免费在线视频一区| 日韩一区二区免费在线观看| 亚洲二区视频在线| 欧美男男青年gay1069videost| 亚洲精品亚洲人成人网| 91亚洲精华国产精华精华液| 国产人成亚洲第一网站在线播放 | 久久午夜免费电影| 久久国产综合精品| 欧美岛国在线观看| 久久精品噜噜噜成人av农村| 3d动漫精品啪啪1区2区免费| 丝袜美腿亚洲色图| 日韩美女一区二区三区四区| 蜜臀av在线播放一区二区三区 | 99re热这里只有精品免费视频| 中文字幕精品综合| 99在线精品观看| 亚洲精品国产精华液| 91国产视频在线观看| 亚洲国产成人av好男人在线观看| 欧美日韩国产bt| 久久成人av少妇免费| 久久久久久久久一| 99国内精品久久| 亚洲国产毛片aaaaa无费看| 欧美喷水一区二区| 国产在线播放一区二区三区| 国产香蕉久久精品综合网| 国产91精品精华液一区二区三区| 国产精品你懂的| 欧美伦理视频网站| 国产精品99久久久久久久女警| 中文字幕中文乱码欧美一区二区| 色噜噜久久综合| 免费的国产精品| 国产精品午夜在线观看| 在线观看三级视频欧美| 久草这里只有精品视频| 国产精品久久久久久久久果冻传媒| 欧洲一区在线观看| 国产一区在线观看视频| 最新热久久免费视频| 欧美老人xxxx18| 成人免费不卡视频| 日本成人在线网站| 1024精品合集| 26uuu精品一区二区| 色综合久久88色综合天天6 | 欧美第一区第二区| 色94色欧美sute亚洲13| 麻豆国产91在线播放| 18涩涩午夜精品.www| 日韩欧美国产1| 91黄色免费看| 国产ts人妖一区二区| 午夜精彩视频在线观看不卡| 日本一区二区免费在线观看视频| 欧美精三区欧美精三区| 972aa.com艺术欧美| 国产尤物一区二区| 日韩电影免费在线观看网站| 中文字幕精品一区二区三区精品| 欧美精品色一区二区三区| 波多野洁衣一区| 国产成人综合在线观看| 日韩综合小视频| 亚洲综合色在线| 日韩一区欧美小说| 国产精品午夜春色av| 精品奇米国产一区二区三区| 欧美色综合影院| 91免费小视频| av男人天堂一区| 国产成人精品在线看| 精品一区二区影视| 美国十次综合导航| 五月婷婷另类国产| 亚洲一区二区不卡免费| 亚洲欧美日韩精品久久久久| 国产精品妹子av| 日本一区二区免费在线| 久久夜色精品一区| 精品国产91九色蝌蚪| 欧美一级淫片007| 91精品国产综合久久福利软件| 欧美在线观看一区二区| 在线亚洲一区二区| 在线免费观看日本欧美| 在线影院国内精品| 欧美一a一片一级一片| 在线观看国产日韩| 欧美日韩精品一区二区三区四区 | 色素色在线综合| 在线观看日韩国产| 欧美理论片在线| 日韩欧美一区二区三区在线| 日韩免费观看高清完整版| 精品国产在天天线2019| 久久综合九色综合欧美就去吻| 2023国产精品| 国产精品久久看| 亚洲免费观看高清完整| 艳妇臀荡乳欲伦亚洲一区| 亚洲精品视频在线看| 亚洲图片欧美综合| 开心九九激情九九欧美日韩精美视频电影 | 日韩精品每日更新| 国产一区日韩二区欧美三区| 国产精品亚洲一区二区三区在线| 成人毛片在线观看| 色综合天天性综合| 制服.丝袜.亚洲.另类.中文 | 欧美在线观看视频一区二区| 欧美性色综合网| 精品久久久久久无| 亚洲少妇最新在线视频| 婷婷六月综合网| 国产精品亚洲一区二区三区妖精| 99久久久国产精品免费蜜臀| 欧洲精品一区二区三区在线观看| 欧美一区二区视频网站| 久久精品在线免费观看| 亚洲激情男女视频| 精品一区二区在线看| 91麻豆国产自产在线观看| 在线电影院国产精品| 国产欧美一区二区精品仙草咪 | 国产精品久久久久7777按摩| 亚洲免费资源在线播放| 美腿丝袜亚洲综合| 91丝袜美腿高跟国产极品老师 | 国产主播一区二区三区| 99视频有精品| 精品国产凹凸成av人网站| 亚洲色欲色欲www在线观看| 日本欧美一区二区三区| 99久久婷婷国产| 精品日韩在线一区| 亚洲一区二区黄色| 不卡av电影在线播放| 6080日韩午夜伦伦午夜伦| 国产精品久久综合| 国产精品一区二区三区乱码 | 国产欧美精品区一区二区三区| 亚洲成人资源在线| 97aⅴ精品视频一二三区| 久久午夜色播影院免费高清 | 99国产精品国产精品毛片| 日韩一级欧美一级| 爽好多水快深点欧美视频| 99久久精品情趣| 国产亚洲精品久| 久久se精品一区二区| 欧美视频在线观看一区| 中文字幕一区二区三区乱码在线| 激情六月婷婷久久| 日韩一区二区在线观看| 一区二区三区四区国产精品| 成人一区二区三区在线观看| 欧美电影免费观看高清完整版在| 日本不卡1234视频| 欧美日韩一区二区三区在线看 | 色94色欧美sute亚洲线路二| 中文字幕一区在线| 懂色av一区二区夜夜嗨| 久久亚洲精华国产精华液| 另类人妖一区二区av| 欧美刺激脚交jootjob| 男男视频亚洲欧美| 欧美电影精品一区二区| 黄色成人免费在线| 久久久久综合网| 国产激情91久久精品导航 | 亚洲一区二区三区小说| 色综合婷婷久久|