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

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

?? otg_hub.c

?? philips公司ISP1362 USB OTG控制芯片的驅(qū)動
?? C
?? 第 1 頁 / 共 3 頁
字號:
		case 0:
			break;
		case 1:
			dbg("Single TT");
			break;
		case 2:
			dbg("Multiple TT");
			break;
		default:
			dbg("Unrecognized hub protocol %d",
				dev->descriptor.bDeviceProtocol);
			break;
	}

	switch (hub->descriptor->wHubCharacteristics & HUB_CHAR_TTTT) {
		case 0x00:
			if (dev->descriptor.bDeviceProtocol != 0)
				dbg("TT requires at most 8 FS bit times");
			break;
		case 0x20:
			dbg("TT requires at most 16 FS bit times");
			break;
		case 0x40:
			dbg("TT requires at most 24 FS bit times");
			break;
		case 0x60:
			dbg("TT requires at most 32 FS bit times");
			break;
	}

	dbg("Port indicators are %s supported", 
	    (hub->descriptor->wHubCharacteristics & HUB_CHAR_PORTIND) ? "" : "not");

	dbg("power on to power good time: %dms", hub->descriptor->bPwrOn2PwrGood * 2);
	dbg("hub controller current requirement: %dmA", hub->descriptor->bHubContrCurrent);

	for (i = 0; i < dev->maxchild; i++)
		portstr[i] = hub->descriptor->DeviceRemovable[((i + 1) / 8)] & (1 << ((i + 1) % 8)) ? 'F' : 'R';
	portstr[dev->maxchild] = 0;

	dbg("port removable status: %s", portstr);

	ret = usb_get_hub_status(dev, &hubstatus);
	if (ret < 0) {
		err("Unable to get hub status (err = %d)", ret);
		kfree(hub->descriptor);
		return -1;
	}

	le16_to_cpus(&hubstatus.wHubStatus);

	dbg("local power source is %s",
		(hubstatus.wHubStatus & HUB_STATUS_LOCAL_POWER) ? "lost (inactive)" : "good");

	dbg("%sover-current condition exists",
		(hubstatus.wHubStatus & HUB_STATUS_OVERCURRENT) ? "" : "no ");

	/* Start the interrupt endpoint */
	pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress);
	maxp = usb_maxpacket(dev, pipe, usb_pipeout(pipe));

	if (maxp > sizeof(hub->buffer))
		maxp = sizeof(hub->buffer);

	hub->urb = usb_alloc_urb(0);
	if (!hub->urb) {
		err("couldn't allocate interrupt urb");
		kfree(hub->descriptor);
		return -1;
	}

	FILL_INT_URB(hub->urb, dev, pipe, hub->buffer, maxp, hub_irq,
		hub, endpoint->bInterval);
	ret = usb_submit_urb(hub->urb);
	if (ret) {
		err("usb_submit_urb failed (%d)", ret);
		kfree(hub->descriptor);
		return -1;
	}
		
	/* Wake up khubd */
	wake_up(&khubd_wait);

	usb_hub_power_on(hub);

	return 0;
}

static void *hub_probe(struct usb_device *dev, unsigned int i,
		       const struct usb_device_id *id)
{
	struct usb_interface_descriptor *interface;
	struct usb_endpoint_descriptor *endpoint;
	struct usb_hub *hub;
	unsigned long flags;

	interface = &dev->actconfig->interface[i].altsetting[0];

	/* Some hubs have a subclass of 1, which AFAICT according to the */
	/*  specs is not defined, but it works */
	if ((interface->bInterfaceSubClass != 0) &&
	    (interface->bInterfaceSubClass != 1)) {
		err("invalid subclass (%d) for USB hub device #%d",
			interface->bInterfaceSubClass, dev->devnum);
		return NULL;
	}

	/* Multiple endpoints? What kind of mutant ninja-hub is this? */
	if (interface->bNumEndpoints != 1) {
		err("invalid bNumEndpoints (%d) for USB hub device #%d",
			interface->bNumEndpoints, dev->devnum);
		return NULL;
	}

	endpoint = &interface->endpoint[0];

	/* Output endpoint? Curiousier and curiousier.. */
	if (!(endpoint->bEndpointAddress & USB_DIR_IN)) {
		err("Device #%d is hub class, but has output endpoint?",
			dev->devnum);
		return NULL;
	}

	/* If it's not an interrupt endpoint, we'd better punt! */
	if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) {
		err("Device #%d is hub class, but has endpoint other than interrupt?",
			dev->devnum);
		return NULL;
	}

	/* We found a hub */
	info("USB hub found");

	hub = kmalloc(sizeof(*hub), GFP_KERNEL);
	if (!hub) {
		err("couldn't kmalloc hub struct");
		return NULL;
	}

	memset(hub, 0, sizeof(*hub));

	INIT_LIST_HEAD(&hub->event_list);
	hub->dev = dev;
	init_MUTEX(&hub->khubd_sem);

	/* Record the new hub's existence */
	spin_lock_irqsave(&hub_event_lock, flags);
	INIT_LIST_HEAD(&hub->hub_list);
	list_add(&hub->hub_list, &hub_list);
	spin_unlock_irqrestore(&hub_event_lock, flags);

	if (usb_hub_configure(hub, endpoint) >= 0)
		return hub;

	err("hub configuration failed for device #%d", dev->devnum);

	/* free hub, but first clean up its list. */
	spin_lock_irqsave(&hub_event_lock, flags);

	/* Delete it and then reset it */
	list_del(&hub->event_list);
	INIT_LIST_HEAD(&hub->event_list);
	list_del(&hub->hub_list);
	INIT_LIST_HEAD(&hub->hub_list);

	spin_unlock_irqrestore(&hub_event_lock, flags);

	kfree(hub);

	return NULL;
}

static void hub_disconnect(struct usb_device *dev, void *ptr)
{
	struct usb_hub *hub = (struct usb_hub *)ptr;
	unsigned long flags;

	spin_lock_irqsave(&hub_event_lock, flags);

	/* Delete it and then reset it */
	list_del(&hub->event_list);
	INIT_LIST_HEAD(&hub->event_list);
	list_del(&hub->hub_list);
	INIT_LIST_HEAD(&hub->hub_list);

	spin_unlock_irqrestore(&hub_event_lock, flags);

	down(&hub->khubd_sem); /* Wait for khubd to leave this hub alone. */
	up(&hub->khubd_sem);

	if (hub->urb) {
		usb_unlink_urb(hub->urb);
		usb_free_urb(hub->urb);
		hub->urb = NULL;
	}

	if (hub->descriptor) {
		kfree(hub->descriptor);
		hub->descriptor = NULL;
	}

	/* Free the memory */
	kfree(hub);
}

static int hub_ioctl(struct usb_device *hub, unsigned int code, void *user_data)
{
	/* assert ifno == 0 (part of hub spec) */
	switch (code) {
	case USBDEVFS_HUB_PORTINFO: {
		struct usbdevfs_hub_portinfo *info = user_data;
		unsigned long flags;
		int i;

		spin_lock_irqsave(&hub_event_lock, flags);
		if (hub->devnum <= 0)
			info->nports = 0;
		else {
			info->nports = hub->maxchild;
			for (i = 0; i < info->nports; i++) {
				if (hub->children[i] == NULL)
					info->port[i] = 0;
				else
					info->port[i] = hub->children[i]->devnum;
			}
		}
		spin_unlock_irqrestore(&hub_event_lock, flags);

		return info->nports + 1;
		}

	default:
		return -ENOSYS;
	}
}

static int usb_hub_reset(struct usb_hub *hub)
{
	struct usb_device *dev = hub->dev;
	int i;

	/* Disconnect any attached devices */
	for (i = 0; i < hub->descriptor->bNbrPorts; i++) {
		if (dev->children[i])
			usb_disconnect(&dev->children[i]);
	}

	/* Attempt to reset the hub */
	if (hub->urb)
		usb_unlink_urb(hub->urb);
	else
		return -1;

	if (usb_reset_device(dev))
		return -1;

	hub->urb->dev = dev;                                                    
	if (usb_submit_urb(hub->urb))
		return -1;

	usb_hub_power_on(hub);

	return 0;
}

static void usb_hub_disconnect(struct usb_device *dev)
{
	struct usb_device *parent = dev->parent;
	int i;

	/* Find the device pointer to disconnect */
	if (parent) {
		for (i = 0; i < parent->maxchild; i++) {
			if (parent->children[i] == dev) {
				usb_disconnect(&parent->children[i]);
				return;
			}
		}
	}

	err("cannot disconnect hub %d", dev->devnum);
}

#define HUB_RESET_TRIES		5
#define HUB_PROBE_TRIES		2
#define HUB_SHORT_RESET_TIME	10
#define HUB_LONG_RESET_TIME	200
#define HUB_RESET_TIMEOUT	500
#define	OTG_HUB_RESET_TIME	50


/* return: -1 on error, 0 on success, 1 on disconnect.  */
static int usb_hub_port_wait_reset(struct usb_device *hub, int port,
				struct usb_device *dev, unsigned int delay)
{
	int delay_time, ret;
	struct usb_port_status portsts;
	unsigned short portchange, portstatus;

	for (delay_time = 0; delay_time < HUB_RESET_TIMEOUT; delay_time += delay) {
		/* wait to give the device a chance to reset */
		wait_ms(delay);
		
		/* read and decode port status */
		ret = usb_get_port_status(hub, port + 1, &portsts);
		if (ret < 0) {
			err("get_port_status(%d) failed (err = %d)", port + 1, ret);
			return -1;
		}

		portstatus = le16_to_cpu(portsts.wPortStatus);
		portchange = le16_to_cpu(portsts.wPortChange);
		dbg("port %d, portstatus %x, change %x, %s", port + 1,
			portstatus, portchange, portspeed (portstatus));

		/* bomb out completely if something weird happened */
		if ((portchange & USB_PORT_STAT_C_CONNECTION))
			return -1;

		/* if we`ve finished resetting, then break out of the loop */
		if (!(portstatus & USB_PORT_STAT_RESET) &&
		    (portstatus & USB_PORT_STAT_ENABLE)) {
			if (portstatus & USB_PORT_STAT_HIGH_SPEED)
				dev->speed = USB_SPEED_HIGH;
			else if (portstatus & USB_PORT_STAT_LOW_SPEED)
				dev->speed = USB_SPEED_LOW;
			else
				dev->speed = USB_SPEED_FULL;
			return 0;
		}

		/* switch to the long delay after two short delay failures */
		if (delay_time >= 2 * HUB_SHORT_RESET_TIME)
			delay = HUB_LONG_RESET_TIME;

		dbg("port %d of hub %d not reset yet, waiting %dms", port + 1,
			hub->devnum, delay);
	}

	return -1;
}

/* return: -1 on error, 0 on success, 1 on disconnect.  */
static int usb_hub_port_reset(struct usb_device *hub, int port,
				struct usb_device *dev, unsigned int delay)
{
	int i, status, j;

	/* Reset the port */
	for (i = 0; i < HUB_RESET_TRIES; i++) {

		usb_set_port_feature(hub, port + 1, USB_PORT_FEAT_RESET);

		if(dev->parent == dev->bus->root_hub) {
			/* Root hub ports, Need Special Treatment 
			OTG ports need a reset of 50 msec continouse reset */
			for(j=0; j < ((OTG_HUB_RESET_TIME/HUB_SHORT_RESET_TIME) +1); j++) {
				mdelay(HUB_SHORT_RESET_TIME);
				usb_set_port_feature(hub, port + 1, USB_PORT_FEAT_RESET);
			}
			mdelay(2*HUB_SHORT_RESET_TIME);
		}

		/* return on disconnect or reset */
		status = usb_hub_port_wait_reset(hub, port, dev, delay);
		if (status != -1) {
			usb_clear_port_feature(hub, port + 1, USB_PORT_FEAT_C_RESET);
			return status;
		}

		dbg("port %d of hub %d not enabled, trying reset again...",
			port + 1, hub->devnum);
		delay = HUB_LONG_RESET_TIME;
	}

	err("Cannot enable port %i of hub %d, disabling port.",
		port + 1, hub->devnum);
	err("Maybe the USB cable is bad?");

	return -1;
}

void usb_hub_port_disable(struct usb_device *hub, int port)
{
	int ret;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精选视频在线| 亚洲第一狼人社区| 在线国产亚洲欧美| 国产麻豆91精品| 日韩国产一二三区| 亚洲女性喷水在线观看一区| 精品精品欲导航| 欧美日韩一级片网站| 高清不卡一区二区在线| 天天综合日日夜夜精品| 国产网站一区二区| 日韩午夜三级在线| 欧美日免费三级在线| 91网页版在线| 国产成人免费视频网站| 蜜臀久久久99精品久久久久久| 亚洲综合一区二区三区| 国产精品嫩草久久久久| 久久久久久免费| 欧美videofree性高清杂交| 欧美另类高清zo欧美| 色综合中文综合网| 国产精品一区二区三区乱码 | 成人午夜精品一区二区三区| 美女视频黄久久| 蜜桃视频一区二区三区 | 日本视频一区二区三区| 一级特黄大欧美久久久| 中文字幕一区二| 欧美大胆人体bbbb| 91精品国产色综合久久久蜜香臀| 欧美专区亚洲专区| 欧美视频在线观看一区| 日本高清不卡aⅴ免费网站| 一本一道综合狠狠老| 91色在线porny| 色综合激情久久| 欧美色中文字幕| 欧美日韩你懂得| 欧美日韩夫妻久久| 欧美剧在线免费观看网站| 91精品啪在线观看国产60岁| 欧美一区二区成人6969| 日韩三区在线观看| wwww国产精品欧美| 国产欧美日韩不卡免费| 国产欧美日韩不卡| 亚洲天堂成人网| 一二三区精品福利视频| 日韩有码一区二区三区| 麻豆成人av在线| 国产一区 二区 三区一级| 国产乱子轮精品视频| 顶级嫩模精品视频在线看| 99精品视频一区二区三区| 91免费看视频| 欧美日本一区二区三区| 欧美成人一区二区| 国产日韩v精品一区二区| 国产精品狼人久久影院观看方式| 亚洲精品乱码久久久久久日本蜜臀| 亚洲激情在线激情| 奇米影视一区二区三区小说| 国产精品自在在线| 91天堂素人约啪| 欧美裸体bbwbbwbbw| 精品噜噜噜噜久久久久久久久试看 | 久久精品国产网站| 久久国产精品72免费观看| 国产69精品久久久久毛片| 91女厕偷拍女厕偷拍高清| 51精品久久久久久久蜜臀| 国产激情视频一区二区三区欧美| 美女视频免费一区| 3d成人h动漫网站入口| 欧美一区二区三区在线视频| 久久婷婷国产综合精品青草 | 日本美女一区二区三区视频| 午夜精品福利一区二区三区av| 亚洲成av人影院| 久久66热re国产| 91在线观看一区二区| 一区二区三区毛片| 免费高清视频精品| 国产成人av一区二区| 欧美日韩国产综合久久| 欧美精品一区二区蜜臀亚洲| 亚洲女性喷水在线观看一区| 欧美aaa在线| 色偷偷一区二区三区| 日韩免费一区二区| 一区二区久久久久久| 国产大片一区二区| 91.com在线观看| 亚洲色图视频网| 国产伦精品一区二区三区视频青涩| 欧美午夜片在线观看| 国产网站一区二区三区| 秋霞国产午夜精品免费视频| 色狠狠色噜噜噜综合网| 久久久国产精华| 天天操天天干天天综合网| 91影院在线观看| 国产视频一区在线观看| 日本伊人精品一区二区三区观看方式| 9l国产精品久久久久麻豆| 欧美变态口味重另类| 国产日韩欧美电影| 亚洲动漫第一页| 欧美日韩免费在线视频| 国产精品毛片高清在线完整版| 国产精华液一区二区三区| 91麻豆文化传媒在线观看| 欧美日韩不卡一区| 亚洲三级电影网站| 91污在线观看| 亚洲女女做受ⅹxx高潮| 99国产欧美另类久久久精品 | 老司机免费视频一区二区| 免费成人你懂的| 成人性色生活片| 欧美xingq一区二区| 精品一区二区三区免费| 日韩视频免费观看高清完整版 | 免费成人小视频| 成人午夜精品一区二区三区| 7777精品伊人久久久大香线蕉完整版 | 欧美午夜寂寞影院| 国产精品国产精品国产专区不蜜 | 国产精品99久久久久久宅男| 欧美一级午夜免费电影| 久久精品国产亚洲5555| 久久久久久久久久久黄色| 99久久婷婷国产综合精品| 亚洲国产精品久久久久婷婷884| 欧美精品第1页| 国产精品自拍在线| 亚洲欧美日韩系列| 日韩一二在线观看| 国产成人在线看| 亚洲一区二区影院| 精品国产91久久久久久久妲己| av网站免费线看精品| 亚洲妇熟xx妇色黄| 久久久久久久久99精品| 在线看日本不卡| 精品一区二区精品| 樱桃国产成人精品视频| 日韩一二三区视频| 色哟哟一区二区三区| 六月丁香综合在线视频| 亚洲女爱视频在线| 久久网站热最新地址| 日本高清不卡视频| 国产精品一级黄| 性做久久久久久免费观看| 国产日产欧美一区| 欧美片在线播放| 91在线视频免费91| 久久91精品久久久久久秒播| 亚洲你懂的在线视频| 久久久久免费观看| 6080午夜不卡| 91蜜桃免费观看视频| 激情欧美一区二区三区在线观看| 亚洲精品日日夜夜| 久久精品夜色噜噜亚洲a∨ | 亚洲欧美日韩精品久久久久| 精品国产乱码久久久久久久| 91国在线观看| 成人免费av网站| 久久国产福利国产秒拍| 亚洲午夜电影在线| 国产精品视频麻豆| 欧美成人伊人久久综合网| 欧美亚洲动漫另类| 成人午夜伦理影院| 国产乱子轮精品视频| 日韩电影免费在线看| 一区二区三区小说| 国产精品色婷婷| 国产午夜精品美女毛片视频| 日韩亚洲国产中文字幕欧美| 欧美私模裸体表演在线观看| 99re热这里只有精品免费视频 | 欧美精品一区在线观看| 欧美电影在线免费观看| 色一情一乱一乱一91av| av中文字幕在线不卡| 国产成人免费在线观看不卡| 久久国产精品99精品国产| 国产欧美一区二区精品秋霞影院| 亚洲免费视频成人| 在线播放中文一区| 国产高清久久久久| 久久青草国产手机看片福利盒子 | 中文字幕一区二区三区av| 久久精品国产77777蜜臀| 91麻豆精品国产91| 精品一区二区在线视频|