一般网上关于介绍 USB Gadget 的资料都是基于 Linux2.6.32 或在这之前的版本, 作者在关注了 Linux2.6.37 和 Linux3.0.4 版本的内核, USB Gadget 的一些 API 已经与 Linux2.6.32 的不同了但是那些关键的数据结构还是一样滴
Linux USB Gadget 分三层架构:
层次关系从上到下
一层: USB Gadget 功能层 BSP/Driver 开发者通常是要实现这一层, 从而实现一个具体的设备驱动, 如 Anddroid 在此层实现了 adb,mtp,mass_storage 等浏览参考关注此层代码时, 会发现 composite 是此层的关键字, 此层中关键的数据结构是: struct usb_composite_driver 这一层的驱动文件一般为: driver/usb/gadget/android.c(android 实现的) 或 driver/usb/gadget/serial.c(传统 Linux 实现的 USB 转串口)
二层: USB 设备层这一层是 Linux 内核开发维护者实现的, 与我们没太大关系, 不用我们操心, 我们只关心其的一些接口就行浏览参考关注此层时, 会发现 gadget 是此层的关键字, 此层的关键数据结构是: usb_gadget_driver,usb_composite_dev 这层主要的一个驱动文件为: driver/usb/gadget/composite.c
三层: USB 设备控制器驱动层这一层主要是与 CPUCPU USB 控制器有关, 与硬件紧密相关, 这一层也比较头痛, 主要它和 USB 控制器牵扯在一起, 涉及有寄存器时钟 DMA 等等但是这一层往往是由芯片厂商去实现我们一般仅需在板级文件中处理好所需要的 USB 接口即可这层的关键字就是 UDC, 主要驱动文件命名含 udc 关键字, 一般与 CPU 或芯片厂商有关, 如 driver/usb/gadget/xxx_udc.c
来源: http://www.bubuko.com/infodetail-2513149.html