最近在通读Linux usb-serial.c和generic.c,发现usb core检测到有新设备插入时会调用struct usb_driver的probe方法。但是我找不到调用 struct usb_serial_driver 的探测方法的位置,似乎该方法用于一些与 tty 相关的设置。实际上,模板驱动 generic.c 并没有实现这个探测方法。
1 回答
在 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 串行驱动程序的中间层。实际上,当集线器检测到您的 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 上搜索驱动,然后探测真正的串口驱动。