struct usb_serial_driver的probe方法何时被调用?

时间:2013-10-18 07:55:02

标签: linux usb

最近我一直在阅读Linux usb-serial.c和generic.c,发现当usb核心检测到插入的新设备时,会调用struct usb_driver的探测方法。 但是我找不到struct usb_serial_driver的probe方法被调用的地方,似乎这个方法用于某些相关的设置。实际上,模板驱动程序generic.c没有实现这种探测方法。

1 个答案:

答案 0 :(得分:0)

在usb-serial.c中,usb_serial_init()已注册:

bus_register(&usb_serial_bus_type)
tty_register_driver(usb_serial_tty_driver)
usb_register(&usb_serial_driver)
usb_serial_generic_register(debug)

usb_serial_generic_register()只是在其generic_device_ids数组中设置设备的idVendor和idProduct。并注册:

usb_serial_register_drivers(&generic_driver, serial_drivers)

它会将generic_driver注册到usb_bus_type总线,因此device_attach()会找到它

你知道,usb_serial_register会将驱动程序添加到全局列表:usb_serial_driver_list, 并将驱动程序注册到usb-serial总线。

generic_driver是探测usb-serial驱动程序的中间层。实际上,当集线器检测到你的USB设备已插入时,它将调用hub_port_connect_change(core / hub.c),它将向设备分配电流并枚举设备。最后,它将进入usb_new_device(udev)并注册设备:device_add(& udev-> dev),在/ sysfs中创建文件节点,并探测相应的驱动程序。 bus_probe_device() - > device_attach,所以,将在这里调用generic_probe,然后,它将匹配设备并调用usb_serial_probe() -> search_serial_device() -> ... -> type->probe(),它将搜索usb_serial_driver_list上的驱动器,然后探测真正的串行驱动程序。