usb_serial_generic_register
- 1. usb_serial_generic_register
- 1.1 usb_serial_device_match
- 2. usb_serial_driver
1. usb_serial_generic_register
- 初始化局部结构体
udriver(struct usb_driver)- 通过usb_register()注册 USB 驱动到内核(整个流程同 < 1.3 注册 USB 驱动到内核(usb_register)> 一模一样)
- 通过
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() 完成底层设备驱动的注册
通过driver_find()检查驱动是否已注册,即遍历总线驱动 usb_serial_driver
->.driver.bus.p.drivers_kset.list链表中是否存在 usb_serial_driver->driver.name(generic)名称的驱动节点
(存在则表示已注册,什么都不做,这里不存在表示未注册,继续下列任务2-4)通过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文件通过driver_add_groups()在
/sys/bus/usb/drivers/usbserial_generic/目录下创建驱动自定义的属性组(未创建)通过kobject_uevent()在驱动注册完成后,向用户空间广播一条“驱动已添加”的 uevent
- 通过
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() 函数)检查驱动是否支持该设备