【发布时间】:2013-10-18 07:55:02
【问题描述】:
最近一直在阅读Linux usb-serial.c和generic.c,发现usb核心检测到新设备插入时会调用struct usb_driver的probe方法。 但是我找不到 struct usb_serial_driver 的探测方法在哪里被调用,似乎这个方法用于一些与 tty 相关的设置。实际上,模板驱动 generic.c 并没有实现这个探测方法。
【问题讨论】:
最近一直在阅读Linux usb-serial.c和generic.c,发现usb核心检测到新设备插入时会调用struct usb_driver的probe方法。 但是我找不到 struct usb_serial_driver 的探测方法在哪里被调用,似乎这个方法用于一些与 tty 相关的设置。实际上,模板驱动 generic.c 并没有实现这个探测方法。
【问题讨论】:
在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 串行总线。
generic_driver 是用于探测 USB 串行驱动程序的中间层。实际上,当集线器检测到您的 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上的驱动,然后探测真正的串口驱动。
【讨论】: