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

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

?? sl811-hcd.c

?? host usb 主設備程序 支持sd卡 mouse keyboard 的最單單的驅動程序 gcc編譯
?? C
?? 第 1 頁 / 共 4 頁
字號:
		(mask & SL11H_INTMASK_DONE_B) ? " done_b" : "",		(mask & SL11H_INTMASK_SOFINTR) ? " sof" : "",		(mask & SL11H_INTMASK_INSRMV) ? " ins/rmv" : "",		(mask & SL11H_INTMASK_RD) ? " rd" : "",		(mask & SL11H_INTMASK_DP) ? " dp" : "");}static int proc_sl811h_show(struct seq_file *s, void *unused){	struct sl811		*sl811 = s->private;	struct sl811h_ep	*ep;	unsigned		i;	seq_printf(s, "%s\n%s version %s\nportstatus[1] = %08x\n",		sl811_to_hcd(sl811)->product_desc,		hcd_name, DRIVER_VERSION,		sl811->port1);	seq_printf(s, "insert/remove: %ld\n", sl811->stat_insrmv);	seq_printf(s, "current session:  done_a %ld done_b %ld "			"wake %ld sof %ld overrun %ld lost %ld\n\n",		sl811->stat_a, sl811->stat_b,		sl811->stat_wake, sl811->stat_sof,		sl811->stat_overrun, sl811->stat_lost);	spin_lock_irq(&sl811->lock);	if (sl811->ctrl1 & SL11H_CTL1MASK_SUSPEND)		seq_printf(s, "(suspended)\n\n");	else {		u8	t = sl811_read(sl811, SL11H_CTLREG1);		seq_printf(s, "ctrl1 %02x%s%s%s%s\n", t,			(t & SL11H_CTL1MASK_SOF_ENA) ? " sofgen" : "",			({char *s; switch (t & SL11H_CTL1MASK_FORCE) {			case SL11H_CTL1MASK_NORMAL: s = ""; break;			case SL11H_CTL1MASK_SE0: s = " se0/reset"; break;			case SL11H_CTL1MASK_K: s = " k/resume"; break;			default: s = "j"; break;			}; s; }),			(t & SL11H_CTL1MASK_LSPD) ? " lowspeed" : "",			(t & SL11H_CTL1MASK_SUSPEND) ? " suspend" : "");		dump_irq(s, "irq_enable",				sl811_read(sl811, SL11H_IRQ_ENABLE));		dump_irq(s, "irq_status",				sl811_read(sl811, SL11H_IRQ_STATUS));		seq_printf(s, "frame clocks remaining:  %d\n",				sl811_read(sl811, SL11H_SOFTMRREG) << 6);	}	seq_printf(s, "A: qh%p ctl %02x sts %02x\n", sl811->active_a,		sl811_read(sl811, SL811_EP_A(SL11H_HOSTCTLREG)),		sl811_read(sl811, SL811_EP_A(SL11H_PKTSTATREG)));	seq_printf(s, "B: qh%p ctl %02x sts %02x\n", sl811->active_b,		sl811_read(sl811, SL811_EP_B(SL11H_HOSTCTLREG)),		sl811_read(sl811, SL811_EP_B(SL11H_PKTSTATREG)));	seq_printf(s, "\n");	list_for_each_entry (ep, &sl811->async, schedule) {		struct urb		*urb;		seq_printf(s, "%s%sqh%p, ep%d%s, maxpacket %d"					" nak %d err %d\n",			(ep == sl811->active_a) ? "(A) " : "",			(ep == sl811->active_b) ? "(B) " : "",			ep, ep->epnum,			({ char *s; switch (ep->nextpid) {			case USB_PID_IN: s = "in"; break;			case USB_PID_OUT: s = "out"; break;			case USB_PID_SETUP: s = "setup"; break;			case USB_PID_ACK: s = "status"; break;			default: s = "?"; break;			}; s;}),			ep->maxpacket,			ep->nak_count, ep->error_count);		list_for_each_entry (urb, &ep->hep->urb_list, urb_list) {			seq_printf(s, "  urb%p, %d/%d\n", urb,				urb->actual_length,				urb->transfer_buffer_length);		}	}	if (!list_empty(&sl811->async))		seq_printf(s, "\n");	seq_printf(s, "periodic size= %d\n", PERIODIC_SIZE);	for (i = 0; i < PERIODIC_SIZE; i++) {		ep = sl811->periodic[i];		if (!ep)			continue;		seq_printf(s, "%2d [%3d]:\n", i, sl811->load[i]);		/* DUMB: prints shared entries multiple times */		do {			seq_printf(s,				"   %s%sqh%d/%p (%sdev%d ep%d%s max %d) "					"err %d\n",				(ep == sl811->active_a) ? "(A) " : "",				(ep == sl811->active_b) ? "(B) " : "",				ep->period, ep,				(ep->udev->speed == USB_SPEED_FULL)					? "" : "ls ",				ep->udev->devnum, ep->epnum,				(ep->epnum == 0) ? ""					: ((ep->nextpid == USB_PID_IN)						? "in"						: "out"),				ep->maxpacket, ep->error_count);			ep = ep->next;		} while (ep);	}	spin_unlock_irq(&sl811->lock);	seq_printf(s, "\n");	return 0;}static int proc_sl811h_open(struct inode *inode, struct file *file){	return single_open(file, proc_sl811h_show, PDE(inode)->data);}static const struct file_operations proc_ops = {	.open		= proc_sl811h_open,	.read		= seq_read,	.llseek		= seq_lseek,	.release	= single_release,};/* expect just one sl811 per system */static const char proc_filename[] = "driver/sl811h";static void create_debug_file(struct sl811 *sl811){	struct proc_dir_entry *pde;	pde = create_proc_entry(proc_filename, 0, NULL);	if (pde == NULL)		return;	pde->proc_fops = &proc_ops;	pde->data = sl811;	sl811->pde = pde;}static void remove_debug_file(struct sl811 *sl811){	if (sl811->pde)		remove_proc_entry(proc_filename, NULL);}#endif/*-------------------------------------------------------------------------*/static voidsl811h_stop(struct usb_hcd *hcd){	struct sl811	*sl811 = hcd_to_sl811(hcd);	unsigned long	flags;	del_timer_sync(&hcd->rh_timer);	spin_lock_irqsave(&sl811->lock, flags);	port_power(sl811, 0);	spin_unlock_irqrestore(&sl811->lock, flags);}static intsl811h_start(struct usb_hcd *hcd){	struct sl811		*sl811 = hcd_to_sl811(hcd);	/* chip has been reset, VBUS power is off */	hcd->state = HC_STATE_RUNNING;	if (sl811->board) {		if (!device_can_wakeup(hcd->self.controller))			device_init_wakeup(hcd->self.controller,				sl811->board->can_wakeup);		hcd->power_budget = sl811->board->power * 2;	}	/* enable power and interupts */	port_power(sl811, 1);	return 0;}/*-------------------------------------------------------------------------*/static struct hc_driver sl811h_hc_driver = {	.description =		hcd_name,	.hcd_priv_size =	sizeof(struct sl811),	/*	 * generic hardware linkage	 */	.irq =			sl811h_irq,	.flags =		HCD_USB11 | HCD_MEMORY,	/* Basic lifecycle operations */	.start =		sl811h_start,	.stop =			sl811h_stop,	/*	 * managing i/o requests and associated device resources	 */	.urb_enqueue =		sl811h_urb_enqueue,	.urb_dequeue =		sl811h_urb_dequeue,	.endpoint_disable =	sl811h_endpoint_disable,	/*	 * periodic schedule support	 */	.get_frame_number =	sl811h_get_frame,	/*	 * root hub support	 */	.hub_status_data =	sl811h_hub_status_data,	.hub_control =		sl811h_hub_control,	.bus_suspend =		sl811h_bus_suspend,	.bus_resume =		sl811h_bus_resume,};/*-------------------------------------------------------------------------*/static int __devexitsl811h_remove(struct platform_device *dev){	struct usb_hcd		*hcd = platform_get_drvdata(dev);	struct sl811		*sl811 = hcd_to_sl811(hcd);	struct resource		*res;	remove_debug_file(sl811);	usb_remove_hcd(hcd);	/* some platforms may use IORESOURCE_IO */	res = platform_get_resource(dev, IORESOURCE_MEM, 1);	if (res)		iounmap(sl811->data_reg);	res = platform_get_resource(dev, IORESOURCE_MEM, 0);	if (res)		iounmap(sl811->addr_reg);	usb_put_hcd(hcd);	return 0;}static int __devinitsl811h_probe(struct platform_device *dev){	struct usb_hcd		*hcd;	struct sl811		*sl811;	struct resource		*addr, *data;	int			irq;	void __iomem		*addr_reg;	void __iomem		*data_reg;	int			retval;	u8			tmp, ioaddr = 0;	/* basic sanity checks first.  board-specific init logic should	 * have initialized these three resources and probably board	 * specific platform_data.  we don't probe for IRQs, and do only	 * minimal sanity checking.	 */	irq = platform_get_irq(dev, 0);	if (dev->num_resources < 3 || irq < 0)		return -ENODEV;	/* refuse to confuse usbcore */	if (dev->dev.dma_mask) {		DBG("no we won't dma\n");		return -EINVAL;	}	/* the chip may be wired for either kind of addressing */	addr = platform_get_resource(dev, IORESOURCE_MEM, 0);	data = platform_get_resource(dev, IORESOURCE_MEM, 1);	retval = -EBUSY;	if (!addr || !data) {		addr = platform_get_resource(dev, IORESOURCE_IO, 0);		data = platform_get_resource(dev, IORESOURCE_IO, 1);		if (!addr || !data)			return -ENODEV;		ioaddr = 1;		/*		 * NOTE: 64-bit resource->start is getting truncated		 * to avoid compiler warning, assuming that ->start		 * is always 32-bit for this case		 */		addr_reg = (void __iomem *) (unsigned long) addr->start;		data_reg = (void __iomem *) (unsigned long) data->start;	} else {		addr_reg = ioremap(addr->start, 1);		if (addr_reg == NULL) {			retval = -ENOMEM;			goto err2;		}		data_reg = ioremap(data->start, 1);		if (data_reg == NULL) {			retval = -ENOMEM;			goto err4;		}	}	/* allocate and initialize hcd */	hcd = usb_create_hcd(&sl811h_hc_driver, &dev->dev, dev->dev.bus_id);	if (!hcd) {		retval = -ENOMEM;		goto err5;	}	hcd->rsrc_start = addr->start;	sl811 = hcd_to_sl811(hcd);	spin_lock_init(&sl811->lock);	INIT_LIST_HEAD(&sl811->async);	sl811->board = dev->dev.platform_data;	init_timer(&sl811->timer);	sl811->timer.function = sl811h_timer;	sl811->timer.data = (unsigned long) sl811;	sl811->addr_reg = addr_reg;	sl811->data_reg = data_reg;	spin_lock_irq(&sl811->lock);	port_power(sl811, 0);	spin_unlock_irq(&sl811->lock);	msleep(200);	tmp = sl811_read(sl811, SL11H_HWREVREG);	switch (tmp >> 4) {	case 1:		hcd->product_desc = "SL811HS v1.2";		break;	case 2:		hcd->product_desc = "SL811HS v1.5";		break;	default:		/* reject case 0, SL11S is less functional */		DBG("chiprev %02x\n", tmp);		retval = -ENXIO;		goto err6;	}	/* The chip's IRQ is level triggered, active high.  A requirement	 * for platform device setup is to cope with things like signal	 * inverters (e.g. CF is active low) or working only with edge	 * triggers (e.g. most ARM CPUs).  Initial driver stress testing	 * was on a system with single edge triggering, so most sorts of	 * triggering arrangement should work.	 */	retval = usb_add_hcd(hcd, irq, IRQF_DISABLED | IRQF_SHARED);	if (retval != 0)		goto err6;	create_debug_file(sl811);	return retval; err6:	usb_put_hcd(hcd); err5:	if (!ioaddr)		iounmap(data_reg); err4:	if (!ioaddr)		iounmap(addr_reg); err2:	DBG("init error, %d\n", retval);	return retval;}#ifdef	CONFIG_PM/* for this device there's no useful distinction between the controller * and its root hub, except that the root hub only gets direct PM calls * when CONFIG_USB_SUSPEND is enabled. */static intsl811h_suspend(struct platform_device *dev, pm_message_t state){	struct usb_hcd	*hcd = platform_get_drvdata(dev);	struct sl811	*sl811 = hcd_to_sl811(hcd);	int		retval = 0;	switch (state.event) {	case PM_EVENT_FREEZE:		retval = sl811h_bus_suspend(hcd);		break;	case PM_EVENT_SUSPEND:	case PM_EVENT_PRETHAW:		/* explicitly discard hw state */		port_power(sl811, 0);		break;	}	if (retval == 0)		dev->dev.power.power_state = state;	return retval;}static intsl811h_resume(struct platform_device *dev){	struct usb_hcd	*hcd = platform_get_drvdata(dev);	struct sl811	*sl811 = hcd_to_sl811(hcd);	/* with no "check to see if VBUS is still powered" board hook,	 * let's assume it'd only be powered to enable remote wakeup.	 */	if (dev->dev.power.power_state.event == PM_EVENT_SUSPEND			|| !device_can_wakeup(&hcd->self.root_hub->dev)) {		sl811->port1 = 0;		port_power(sl811, 1);		usb_root_hub_lost_power(hcd->self.root_hub);		return 0;	}	dev->dev.power.power_state = PMSG_ON;	return sl811h_bus_resume(hcd);}#else#define	sl811h_suspend	NULL#define	sl811h_resume	NULL#endif/* this driver is exported so sl811_cs can depend on it */struct platform_driver sl811h_driver = {	.probe =	sl811h_probe,	.remove =	__devexit_p(sl811h_remove),	.suspend =	sl811h_suspend,	.resume =	sl811h_resume,	.driver = {		.name =	(char *) hcd_name,		.owner = THIS_MODULE,	},};EXPORT_SYMBOL(sl811h_driver);/*-------------------------------------------------------------------------*/static int __init sl811h_init(void){	if (usb_disabled())		return -ENODEV;	INFO("driver %s, %s\n", hcd_name, DRIVER_VERSION);	return platform_driver_register(&sl811h_driver);}module_init(sl811h_init);static void __exit sl811h_cleanup(void){	platform_driver_unregister(&sl811h_driver);}module_exit(sl811h_cleanup);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美va亚洲va| 一区二区视频免费在线观看| 91亚洲精品一区二区乱码| 日日摸夜夜添夜夜添亚洲女人| 欧美激情在线看| 日韩一区二区麻豆国产| 91精品1区2区| 成人短视频下载 | 欧美一区二区三区免费视频| 9人人澡人人爽人人精品| 国产成人8x视频一区二区| 激情丁香综合五月| 日本不卡中文字幕| 日本中文字幕一区二区有限公司| 成人午夜精品一区二区三区| 国产suv一区二区三区88区| 91精品国产综合久久久久久久 | 亚洲欧美视频在线观看| 国产精品久久福利| 国产欧美日本一区视频| 国产精品素人视频| 亚洲综合在线免费观看| 国产成人精品免费在线| av网站一区二区三区| 亚洲精品视频免费看| 国产精品三级av| 精品一区二区三区影院在线午夜| 久久99精品国产.久久久久| 欧美日韩一级二级| 91精品国产一区二区| 亚洲综合激情另类小说区| 日韩精品免费视频人成| 在线观看日韩电影| 国产欧美一二三区| 久草热8精品视频在线观看| 91精品国产色综合久久ai换脸| 亚洲综合色在线| 欧美中文字幕一二三区视频| 亚洲黄色尤物视频| 在线免费观看日韩欧美| 亚洲一区二区三区三| 在线观看精品一区| 性做久久久久久久久| 国产一区二区成人久久免费影院| 91在线无精精品入口| 欧美一区二区三区在线观看| 三级在线观看一区二区| 欧美一区2区视频在线观看| 蜜桃在线一区二区三区| 成人永久看片免费视频天堂| 亚洲国产精品二十页| 成人18精品视频| 亚洲精品视频观看| 欧美久久一二三四区| 国产精品久久夜| av一本久道久久综合久久鬼色| 中文字幕亚洲欧美在线不卡| 免费人成黄页网站在线一区二区| 波多野结衣一区二区三区| 日韩理论片网站| 久久精品国产一区二区三| 欧美最猛黑人xxxxx猛交| 午夜精品久久久久久久久久| 91美女在线视频| 亚洲国产一区二区a毛片| 成人av小说网| 亚洲一区在线观看视频| 日韩欧美一级片| 肉肉av福利一精品导航| 日韩一级高清毛片| av在线播放不卡| 日韩电影免费在线| 中文字幕一区三区| 欧美一区二区三区喷汁尤物| 成人三级伦理片| 日韩精品视频网| 亚洲欧美日韩综合aⅴ视频| 欧美成人一级视频| 欧美在线你懂得| 国产毛片精品视频| 亚洲bt欧美bt精品| 亚洲国产成人自拍| 51午夜精品国产| av电影在线观看完整版一区二区| 亚洲不卡在线观看| 中文字幕在线观看不卡视频| 欧美一级日韩一级| 欧美午夜不卡视频| 日韩黄色片在线观看| 国产精品嫩草久久久久| 日韩情涩欧美日韩视频| 在线视频你懂得一区| 国产精品亚洲午夜一区二区三区| 日韩三级av在线播放| 在线视频综合导航| 粉嫩av一区二区三区在线播放| 日本不卡一区二区| 亚洲在线视频一区| 亚洲男人的天堂网| 国产精品视频九色porn| 精品国产电影一区二区| 国产999精品久久| 日韩激情视频网站| 天天亚洲美女在线视频| 亚洲午夜国产一区99re久久| 亚洲私人影院在线观看| 国产午夜三级一区二区三| 色综合色狠狠天天综合色| 亚洲一级二级在线| 亚洲精品国产高清久久伦理二区| 中国av一区二区三区| 国产午夜精品理论片a级大结局| 日韩精品资源二区在线| 欧美成人一区二区三区在线观看 | 亚洲一区二区欧美日韩 | 日韩精品一区二区三区视频播放 | 色综合网色综合| 亚洲国产aⅴ成人精品无吗| 国产精品日韩成人| 国产91精品露脸国语对白| 1区2区3区欧美| 国产精品色婷婷| 日本一区二区三区四区在线视频 | 国产一区二区三区不卡在线观看 | 国产ts人妖一区二区| 成人一级片在线观看| av资源网一区| 色婷婷久久一区二区三区麻豆| 日本电影欧美片| 欧美性感一区二区三区| 正在播放一区二区| 精品少妇一区二区三区免费观看| 亚洲精品一区二区三区四区高清| 久久久三级国产网站| 国产乱码精品一品二品| 成人精品在线视频观看| 99久久99久久免费精品蜜臀| 91国产免费观看| 欧美一级黄色片| 久久久亚洲欧洲日产国码αv| 欧美国产日韩精品免费观看| 国产精品福利在线播放| 亚洲愉拍自拍另类高清精品| 日韩电影免费在线| 国产一区二区免费看| 99国产精品一区| 欧美女孩性生活视频| 日本乱码高清不卡字幕| 欧美日韩国产大片| 26uuu国产日韩综合| 欧美精品一卡二卡| www日韩大片| 亚洲精品成人天堂一二三| 日韩av一级片| 成人app软件下载大全免费| 欧美久久久久久久久中文字幕| 久久久综合九色合综国产精品| 亚洲少妇中出一区| 国产乱理伦片在线观看夜一区| 色综合天天在线| 精品国产乱码久久久久久影片| 自拍偷自拍亚洲精品播放| 男人的天堂亚洲一区| 99热在这里有精品免费| 日韩精品一区国产麻豆| 洋洋av久久久久久久一区| 狠狠色综合播放一区二区| 欧美午夜精品免费| 成人免费在线播放视频| 麻豆一区二区99久久久久| 91成人免费在线| 国产精品国产三级国产aⅴ原创| 天使萌一区二区三区免费观看| 99精品在线免费| 国产婷婷色一区二区三区四区| 日韩精品一级二级| 91年精品国产| 国产人久久人人人人爽| 久久国产精品一区二区| 欧美日韩在线播放三区四区| 国产精品久久久久一区二区三区| 久久精品国产99国产| 欧美日韩黄色一区二区| 中文字幕综合网| 成人影视亚洲图片在线| 久久久精品人体av艺术| 久久国产精品99精品国产| 欧美日韩一区二区三区高清 | 26uuu精品一区二区在线观看| 亚洲在线视频网站| 色久综合一二码| 亚洲视频一二三区| 91伊人久久大香线蕉| 欧美激情中文不卡| 国产成a人亚洲| 国产色一区二区| 粉嫩av亚洲一区二区图片| 久久精品视频一区| 国产高清不卡一区| 日本一区二区三区免费乱视频|