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;

}

 

注册了一个驱动,然后起了一个精灵进程

 

先看看hubprobe 方法

 

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));

 

也就2int

填充控制URB

接着提交这个urb

等待返回消息或超时,将返回的信息放在描述中

接着对tt 进行初始化

最后激活这个usb_hub

 

我们再来看一下刚刚起的进程的逻辑

1 首先查看hub_event_list 是否有成员

如果有了,就把usb_hublist中取出来

取出来了之后,判断port 的状态是否发生了变换

如果发生了变化就重新进行获取

也就是说这个进程就是实时刷新port的状态

 

现在的问题是谁把 hub 放入hub_event_list的?是中断吗?

应该说是hcd的中断

原创粉丝点击