ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

usb_serial_generic_register / usb_serial_driver

usb_serial_generic_register / usb_serial_driver

usb_serial_generic_register

  • 1. usb_serial_generic_register
    • 1.1 usb_serial_device_match
  • 2. usb_serial_driver

1. usb_serial_generic_register

  1. 初始化局部结构体udriver(struct usb_driver)
  2. 通过usb_register()注册 USB 驱动到内核(整个流程同 < 1.3 注册 USB 驱动到内核(usb_register)> 一模一样)
  3. 通过usb_serial_register()注册每个串口驱动
    3.1初始化 usb_serial_driver 结构体
    3.2通过list_add()将驱动加入 USB 串口的全局链表usb_serial_driver_list
    3.3通过usb_serial_bus_register()将驱动注册到 usb-serial 总线上,即通过 driver_register() 完成底层设备驱动的注册
  1. 通过driver_find()检查驱动是否已注册,即遍历总线驱动 usb_serial_driver->.driver.bus.p.drivers_kset.list链表中是否存在 usb_serial_driver->driver.name(generic)名称的驱动节点
    (存在则表示已注册,什么都不做,这里不存在表示未注册,继续下列任务2-4)

  2. 通过bus_add_driver()将驱动添加到总线
    2.1初始化 usb_serial_driver.drvwrap.driver.bus.p结构体
    2.2kobject_init_and_add()根据 usb_serial_driver.driver.bus.p.kobj创建/sys/bus/usb/drivers/usbserial_generic目录
    2.3klist_add_tail()将 USB驱动 插入 USB总线 的驱动列表
    2.4driver_attach()循环遍历总线 usb_serial_driver.driver.bus.p.klist_devices.k_list上所有设备节点
    ->调用总线 usb_serial_driver.driver.bus.match(dev,drv)(即usb_serial_device_match())检查驱动是否支持该设备
    ->匹配成功,调用driver_probe_device()将设备与驱动绑定
    2.5module_add_driver()创建下列软连接
    ->将/sys/bus/usb/drivers/usbserial_generic/module链接到/sys/module/usbserial/
    ->将/sys/module/usbserial/drivers/usb:usbserial_generic链接到/sys/bus/usb/drivers/usbserial_generic
    2.6driver_create_file()创建/sys/bus/usb/drivers/usbserial_generic/uevent文件
    2.7driver_add_groups()在/sys/bus/usb/drivers/usbserial_generic目录下创建属性组文件(这里未创建属性文件)
    2.8add_bind_files()创建下列文件
    ->创建/sys/bus/usb/drivers/usbserial_generic/unbind文件
    ->创建/sys/bus/usb/drivers/usbserial_generic/bind文件

  3. 通过driver_add_groups()在/sys/bus/usb/drivers/usbserial_generic/目录下创建驱动自定义的属性组(未创建)

  4. 通过kobject_uevent()在驱动注册完成后,向用户空间广播一条“驱动已添加”的 uevent

  1. 通过driver_attach()循环遍历总线usb_driver->drvwrap.driver.bus.p.klist_devices上所有设备
  • 执行usb_driver->drvwrap.driver.bus.match函数(即usb_device_match() 函数)根据设备类型和驱动类型进行分流,对 USB 设备驱动采用泛匹配,对 USB 接口驱动则通过静态和动态设备 ID 表精确匹配
  • 执行usb_driver->drvwrap.driver.bus.match函数(即usb_device_match() 函数)检查驱动是否支持该设备

1.1 usb_serial_device_match

2. usb_serial_driver

返回列表