0%

Linux驱动之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主机之间的通信。

数据结构

以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协议规范》