1.前言继Linux Gadget的一点研究后陆续续关注了很久Android USB Gadget,一直想写点什么记录一些认识,可是Linux USB实在是太复杂,让人有点无从下笔的感觉。它的复杂并不是说不可以被人理解,而且涉及的面很广。USB Host的驱动关注比较少,就对USB device驱动的认识来说,需从两大方面去对它进行认识和了解,一方面是USB协议本身,如果连USB端点、设备描述符、接口、复合设备等概念都不清楚的话,那是无法理解Linux USB device驱动的;另外方面就是USB Gadget架构。而本文就是基于对USB Gadget架构的一点认识而记录的。 2.Android USB Android设备的USB口实现了OTG的功能,也就是一般Android设备可以充当Host和Device角色,而我们使用得最多的就是它的Device角色。Android系统开发者更改传统了Linux USB Gadget实现,在传统Linux Gadget架构上实现了一个复合设备:adb和mtp。其中adb就不用多说,玩过Android都懂,mtp就是常见的U盘功能。Android USB Gadget设备驱动就是Linux的USB Gadget设备驱动。 3.USB Gadget的三层架构一般网上关于介绍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转串口)。