前面已经说了响应irq 请求的是uhc,由他来统一调度这些请求
我们写的usb驱动程序都是在得到了usb_interface结构体指针的前提下开始probe
的
通常root hub 和host controller 集成在一起
在usb 子系统进行初始化的时候就要进行就要对root hub进行初始化了
看一下usb_init
关注一下关于usb_hub的初始化工作
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 driver
static struct usb_driver hub_driver = {
.name = "hub",
.probe = hub_probe,
.disconnect = hub_disconnect,
.suspend = hub_suspend,
.resume = hub_resume,
.pre_reset = hub_pre_reset,
.post_reset = hub_post_reset,
.ioctl = hub_ioctl,
.id_table = hub_id_table,
.supports_autosuspend = 1,
};
注意其中的probe方法hub_probe
这个会在host usb controller 驱动初始化后调用
khubd_task = kthread_run(hub_thread, NULL, "khubd");
创建了一个名为khubd 的内核进程
这个进程所做的操作如下
static int hub_thread(void *__unused)
{
do {
hub_events();
wait_event_interruptible(khubd_wait,
!list_empty(&hub_event_list) ||
kthread_should_stop());
try_to_freeze();
} while (!kthread_should_stop() || !list_empty(&hub_event_list));
pr_debug("%s: khubd exiting/n", usbcore_name);
return 0;
}
在hub.c 中有这样的结构体定义
static LIST_HEAD(hub_event_list); /* List of hubs needing servicing */
需要服务的hub列表?