USB 子系统(四)USB Gadget 驱动

USB 控制器可以呈现出两种不同的状态。USB 控制器作为 Host 时,称为 USB 主机控制器,使用 USB 主机控制器驱动。USB 控制器作为 Device 时,称为 USB 设备控制器,使用 UDC(usb device controller)驱动。

USB 控制器作为 Device 时,最上层的是 Gadget Function 驱动,代表了具体设备的驱动,如 U 盘、USB 串口、USB 虚拟网卡、UAC 驱动。Composite 层是一个可选的中间层,可通过一种配置或多种配置高效的支持多种功能的设备,简化了 USB 复合设备驱动的开发。目前最流行的是使用基于 Composite 和 configfs 实现的 USB gadget configfs,可在用户空间灵活的配置 USB 设备。UDC 驱动直接访问硬件,控制 USB 设备与 USB 主机之间的通信。

Bus/Device/Driver模型

  • "USB接口"是逻辑上的USB设备,我们编写的usb_driver驱动程序,支持的是"USB接口":
  • USB控制器或Hub识别出USB设备后,会创建、注册usb_deive
  • usb_device被"drivers.c"驱动认领后,会选择、设置某个配置
  • 这个配置下面的接口,都会分配、设置、注册一个usb_interface
  • 左边的usb_driver和右边的usb_interface如果匹配,则调用usb_driver.probe

数据结构

以 UAC 为例来说明:

  • usb_configuration: 代表一个 gadget 配置

  • usb_composite_dev: 它里面汇集有各类描述符,内嵌 gadget 对象,以及 usb 设备的一些配置和请求,有一个 usb_funciton 链表(实现数据传输),主要用于初始化。

  • usb_composite_driver: 设备驱动的入口,用来管理设备配置信息,保存设备描述符。

  • usb_gadget_driver: 提供一个通用的 usb gadget driver 模板,向下注册到 udc, 向上给 functions driver 提供 bind 回调等。

代码逻辑

UAC 驱动框架如上图所示,主要各入口函数以及各层相关函数流程都列出来了,感兴趣的可以自己追踪代码查看。

参考文献

https://www.eet-china.com/mp/a55310.html
https://blog.csdn.net/u011037593/article/details/120338969?spm=1001.2014.3001.5502
《韦东山老师相关课程》
《圈圈教你玩 USB》
《USB2.0 协议规范》