usb_init
->bus_register(&usb_bus_type);
注册到linux设备模型中的USB总线
->usb_hub_init();
->usb_register(&hub_driver)
static struct usb_driver hub_driver = {
.name = "hub",
.probe = hub_probe,
.disconnect = hub_disconnect,
.suspend = hub_suspend,
.resume = hub_resume,
.reset_resume = hub_reset_resume,
.pre_reset = hub_pre_reset,
.post_reset = hub_post_reset,
.ioctl = hub_ioctl,
.id_table = hub_id_table,
.supports_autosuspend = 1,
};
->usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME);
注册USB HUB的接口驱动(linux设备模型)
->new_driver->drvwrap.driver.name = (char *)
new_driver->name;
->new_driver->drvwrap.driver.bus =
&usb_bus_type;
->new_driver->drvwrap.driver.probe =
usb_probe_interface;
->driver_register(&new_driver->drvwrap.driver);
->kthread_run(hub_thread, NULL, "khubd");
->hub_events();
->usb_reset_device(hdev);
->usb_reset_and_verify_device(udev);
->hub_port_init(parent_hub, udev, port1, i);
->hub_port_reset(hub, port1, udev, delay);
->set_port_feature(hub->hdev, port1,
USB_PORT_FEAT_RESET);
->usb_get_device_descriptor(udev, 8);
->hub_port_connect_change(hub, i, portstatus,
portchange);
->usb_alloc_dev(hdev, hdev->bus, port1);
linux设备驱动模型,属于usb device
->dev->dev.bus = &usb_bus_type;
->dev->dev.type = &usb_device_type;
struct device_type usb_device_type = {
.name = "usb_device",
.release = usb_release_dev,
.uevent = usb_dev_uevent,
.pm = &usb_device_pm_ops,
};
->choose_address(udev); 设置地址
->hub_port_init(hub, udev, port1, i);
->usb_new_device(udev); 设备挂载到linux设备驱动模型的usb总线
->usb_device_match
挂接成功之后与usb_generic_driver实现了match,会调用
usb_probe_device
->usb_register_device_driver(&usb_generic_driver,
THIS_MODULE);
struct usb_device_driver usb_generic_driver = {
.name = "usb",
.probe = generic_probe,
.disconnect = generic_disconnect,
#ifdef CONFIG_PM
.suspend = generic_suspend,
.resume = generic_resume,
#endif
.supports_autosuspend = 1,
};
->new_udriver->drvwrap.driver.name = (char *)
new_udriver->name;
->new_udriver->drvwrap.driver.bus = &usb_bus_type;
这可是linux设备驱动模型的USB总线
->new_udriver->drvwrap.driver.probe =
usb_probe_device;
->usb_probe_device
->udriver->probe(udev);
实际指向usb_generic_driver的generic_probe
->generic_probe
->driver_register(&new_udriver->drvwrap.driver);
注册USB设备驱动到USB总线(linux设备驱动)