【问题标题】:When is the probe method of struct usb_serial_driver called?struct usb_serial_driver的probe方法什么时候调用?
【发布时间】: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


    【解决方案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 串行总线。

    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上的驱动,然后探测真正的串口驱动。

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2021-10-26
      • 2011-07-21
      • 1970-01-01
      • 2015-07-13
      • 2012-11-30
      • 2012-05-16
      • 2018-01-01
      相关资源
      最近更新 更多