Linux-USB Gadget 驱动框架(以下简称 Gadget )实现了 USB 协议定义的设备端的软件功能。相对于 Linux USB 主机端( Host ) 驱动而言, Gadget 驱动出现较晚,它出现在 2.4.23 以后, ( 作者的第一次 announce: http://lwn.net/Articles/27352/ 或 http://kerneltrap.org/node/621 ) , 如果需要在老的 2.4 内核上支持 Gadget , 可以移植 2.4.31 代码,工作量较小。另外, 2.6 内核标准版本里的可能比最新版本要老一些。 “ mm” 补丁中的版本会比较新。
Gadget 框架提出了一套标准 API, 在底层, USB
设备控制器 (USB Device Controller, UDC) 驱动则实现这一套 API, 不同的 UDC (通常是 SOC 的一部分) 需要不同的驱动, 甚至基于同样的 UDC 的不同板子也需要进行代码修改。这一层我们可以称之为平台相关层。
基于 API, Gadget 驱动实现了一套硬件无关的功能,这基本上可以对应到 USB 协议里 的各种 USB Class , 也有比如 USB Gadget Generic Serial 驱动,没有对应的 Class 。当然, Gadget 驱动还是受限于底层提供的功能的。比如 某些 Class 需要 USB Isochronous
端点,这时我们就不能支持该 Class 。
普通的 Gadget 驱动只实现一个功能(比如, u 盘, usb 网卡)。复合设备可以支持多个功能,后面将仔细研究一下复合设备的实现。像智能手机 , PDA 这样的设备,硬件支持较丰富的端点、 DMA Buffer, 给软件提了支持复合功能的基础。
有两点值得注意,第一是 usb gaget 驱动框架不象 usb 主机端有 usb core 的概念, usb 主机可能支持成百类型的外设,把通用功能抽象出来很有意义。 Usb device 端则通常没有这个需求,一些通用功能抽象在一些 Helper 函数里就可以了。第二是 usb 2.0 里提出了 OTG 的概念,可以在同一接口上支持 host 以及 device 功能。 OTG 是一个比较复杂的规范,以后有时间再研究。
|