USB 协议是主从结构:
左边主机,右边从机;USB 有主机控制器 UHC 和从机控制器 UDC,主机侧有 USB Device Driver,从机侧有 USB
Function Driver。
意思是说,一个开发板,可以当 USB 主机,接鼠标、键盘等从机;一个开发板也可以当 U 盘,接入 PC
电脑,此时开发板是从机。因此,我们要掌握两套驱动框架。这是 Linux 下 USB 相对于 I2C、SPI 复杂的地方,I2C 等根本不会考虑主控 Soc
作为从机的情况,但 USB 需要考虑。
本文主要针对主控 Soc 作为 USB 从机的情况,Linux 为其提供了 Gadget 框架。
编写 USB 设备驱动程序时,主要是:
读取设备的各类描述符,比如 endpoint 描述符,得到端点号
使用底层 USB Host Controller 驱动程序提供的 API 函数,从 endpoint 上读写数据
基于 Gadget 驱动框架模拟一个 USB 设备时,endpoint 的数据传输能力是底层的 USB Device Controller
驱动提供的,我们要做的就是:
提供各类设备描述符
使用底层 USB Device Controller 驱动程序提供的 API 函数,从 endpoint 得到数据、反馈数据
Gadget 的含义是“小器件”,在 Linux 的 USB 系统中,它表示“usb device”。Gadget 驱动程序,就是用来模拟 USB
Device。对于真实的 USB Device,它有两大要素:
怎么表示自己?
每个 USB Device 都有 1 个设备描述符
都 1 个或多个配置描述符
每个配置描述符里面有 1个 或多个接口描述符
每个接口描述符里面有 0 个多个端点描述符
怎么进行数据传输?
通过端点进行传输
有端点的操作函数
在学习过程中,记住这几个要点非常有帮助:
各类描述符的构造
USB Host 获得 Gadget 各类描述符的过程
数据传输的流程
全部0条评论
快来发表一下你的评论吧 !