Linux USB 主机侧设备驱动匹配流程

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

USB 主机侧设备驱动匹配流程

  1. usb 初始化,注册 hub 驱动与通用设备驱动。
  2. usb 控制芯片与驱动匹配后,创建一个主机控制器设备(如 xhci)。
  3. 主机控制器设备与驱动匹配后,创建一个 roothub 设备。
  4. roothub 设备与 hub 驱动匹配后,设置中断。
  5. usb 设备插入后,触发中断,初始化设备,读取设备描述符,根据设备描述符,选择、设置设备配置,匹配到具体设备驱动。
  6. 在具体设备驱动中控制 usb 设备。

接下来,基于 Kernel 5.4.186 代码来具体分析。

USB Core - USB 初始化

drivers/usb/core/usb.c

subsys_initcall(usb_init)

  • usb_init
    • bus_register(&usb_bus_type) // 注册 usb 总线
      • .match = usb_device_match
    • bus_register_notifier(&usb_bus_type, &usb_bus_nb) // 注册内核通知链,用于设备和接口注册和删除的通知
    • usb_major_init // 初始化 usb 字符设备,USB_MAJOR=180
      • register_chrdev(USB_MAJOR, “usb”, &usb_fops)
    • usb_register(&usbfs_driver) // 注册 usbfs 驱动
      • .probe = driver_probe
    • usb_devio_init // 初始化 usb_device 字符设备,USB_DEVICE_DEV=189
      • register_chrdev_region(USB_DEVICE_DEV, USB_DEVICE_MAX, “usb_device”)
      • cdev_init(&usb_device_cdev, &usbdev_file_operations)
      • cdev_add(&usb_device_cdev, USB_DEVICE_DEV, USB_DEVICE_MAX)
    • usb_hub_init
      • usb_register(&hub_driver) // 注册 usb hub 驱动
        • usb_register_driver
          • new_driver->drvwrap.for_devices = 0
          • new_driver->drvwrap.driver.bus = &usb_bus_type
          • new_driver->drvwrap.driver.probe = usb_probe_interface
          • driver_register(&new_driver->drvwrap.driver) // 添加到驱动链表中
            • bus_add_driver
              • klist_add_tail(&priv->knode_bus, &bus->p->klist_drivers);
      • alloc_workqueue(“usb_hub_wq”, WQ_FREEZABLE, 0) // 创建 usb_hub_wq 工作队列
    • usb_register_device_driver(&usb_generic_driver, THIS_MODULE) // 注册 USB 通用设备驱动
      • new_udriver->drvwrap.for_devices = 1
      • new_udriver->drvwrap.driver.bus = &usb_bus_type
      • new_udriver->drvwrap.driver.probe = usb_probe_device
      • driver_register(&new_udriver->drvwrap.driver)

USB 主机控制器驱动

USB Host 带有 Root Hub,第一个 USB 设备是一个根集线器(Root Hub),它控制连接到其上的整个 USB 总线。

鉴于现在大部分设备都已经支持 usb3.0, 接下来以 DWC3 USB 控制芯片为例,分析 xHCI 主机控制器驱动代码。

usb 控制芯片初始化

drivers/usb/dwc3/core.c

module_platform_driver(dwc3_driver)

  • dwc3_probe // 根据 dts 中的设备,与驱动匹配后,调用对应 probe 函数
    • dwc3_get_properties // 获取一些属性,主要是读取 dts 里面的配置,比如 dr_mode 是配置为 otg、host 还是 peripheral
    • dwc3_cache_hwparams // 读取一些硬件参数
    • dwc3_core_init // 芯片初始化,根据配置写寄存器
    • dwc3_core_init_mode

低功耗蓝牙项目,需要一块懂省电的板

思澈 SF32LB52 芯片,BLE 协议栈深度优化,上手即开发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值