hub驱动主要在drivers/usb/core/hub.c文件中,usb设备的初始化、枚举、插拔检测等一般都是由hub发起的。所以要想了解设备的插拔及枚举过程,分析hub是必须的。
- static int __init usb_init(void)
- {
- int retval;
- if (nousb) {
- pr_info("%s: USB support disabled\n", usbcore_name);
- return 0;
- }
- retval = usb_debugfs_init();
- if (retval)
- goto out;
- retval = bus_register(&usb_bus_type);
- if (retval)
- goto bus_register_failed;
- retval = bus_register_notifier(&usb_bus_type, &usb_bus_nb);
- if (retval)
- goto bus_notifier_failed;
- retval = usb_major_init();
- if (retval)
- goto major_init_failed;
- retval = usb_register(&usbfs_driver);
- if (retval)
- goto driver_register_failed;
- retval = usb_devio_init();
- if (retval)
- goto usb_devio_init_failed;
- retval = usbfs_init();
- if (retval)
- goto fs_init_failed;
- retval = usb_hub_init();
- if (retval)
- goto hub_init_failed;
- retval = usb_register_device_driver(&usb_generic_driver, THIS_MODULE);
- if (!retval)
- goto out;
- usb_hub_cleanup();
- hub_init_failed:
- usbfs_cleanup();
- fs_init_failed:
- usb_devio_cleanup();
- usb_devio_init_failed:
- usb_deregister(&usbfs_driver);
- driver_register_failed:
- usb_major_cleanup();
- major_init_failed:
- bus_unregister_notifier(&usb_bus_type, &usb_bus_nb);
- bus_notifier_failed:
- bus_unregister(&usb_bus_type);
- bus_register_failed:
- usb_debugfs_cleanup();
- out:
- return retval;
- }
在USB模块的初始化函数中,会调用usb_hub_init函数对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;
- }