Usb(7)
来源:互联网 发布:汇讯通软件 编辑:程序博客网 时间:2024/04/29 14:32
在usb_init 中,有usb_hub_init
int usb_hub_init(void)
{
if (usb_register(&hub_driver) < 0) {
printk(KERN_ERR "%s: can't register hub driver/n",
usbcore_name);
return -1;
}
khubd_task = kthread_run(hub_thread, NULL, "khubd");
if (!IS_ERR(khubd_task))
return 0;
/* Fall through if kernel_thread failed */
usb_deregister(&hub_driver);
printk(KERN_ERR "%s: can't start khubd/n", usbcore_name);
return -1;
}
注册了一个驱动,然后起了一个精灵进程
先看看hub的probe 方法
hub_probe
1 从接口找到主机接口,判断接口子类,是0 还是1
2 只能有1个端点?
3 检测这个端点的属性,判断这个端点是不是处于中断状态
4 分配了usb_hub 结构体,对这个结构体进行了初始化
Urb usb请求块
分配urb的时候需要指定这个iso packet 的数目
初始化的时候也就也挺简单的,只是设置为0,然后初始化引用
Usb 控制请求的结构体
struct usb_ctrlrequest {
__u8 bRequestType;
__u8 bRequest;
__le16 wValue;
__le16 wIndex;
__le16 wLength;
} __attribute__ ((packed));
也就2个int 长
填充控制URB后
接着提交这个urb
等待返回消息或超时,将返回的信息放在描述中
接着对tt 进行初始化
最后激活这个usb_hub
我们再来看一下刚刚起的进程的逻辑
1 首先查看hub_event_list 是否有成员
如果有了,就把usb_hub从list中取出来 ‘
取出来了之后,判断port 的状态是否发生了变换
如果发生了变化就重新进行获取
也就是说这个进程就是实时刷新port的状态
现在的问题是谁把 hub 放入hub_event_list的?是中断吗?
应该说是hcd的中断