下面学习针对高通平台的HS-USB(HS:high speed高速)堆栈(stack)软件架构设计和源代码布局的细节。
Android HS-USB堆栈基于下面几点:
Gadget driver framework(gadget驱动架构)支持外设模式(Peripheral mode)
新的gadget驱动架构在android2.0及之后的版本实现。Google刚开始开发一个新的架构叫function framework(只用在android1.6版本)。因为linux内核中的gadget framework不支持复合设备(composite devices)。后来gadget framework添加对了对复合设备的支持,google并对gadget framework做了重大的修改以支持组合开关(composition switch)
兼容EHCI主控制器驱动,以支持host模式。
On-The-Go(OTG驱动)。
USB stack
Android HS-USB OTG堆栈基于ID引脚检测来支持OTG模式,HS-USB OTG core代表HS-USB控制器。
OTG driver
OTG驱动首先被加载,由它建立(set up)host controller driver(HCD主控制器驱动)和device controller driver(DCD设备控制器驱动)的transceive struct(收发器结构),在OTG注册了HCD和DCD后,OTG状态机才生效。
根据连接到A/B USB连接器的Micro-A插头(ID引脚接地,启动主模式)或Micro-B插头(ID引脚悬空,启动从模式)来启动对应的控制器驱动(HCD或DCD)。
存取HS-USB OTG控制器寄存器来执行USB操作。
USB(主/从)电源管理。
USB时钟管理,比如,时钟使能、关闭复位等。
Device controller driver
向下与HS-USB OTG控制器交互
执行断电操作,比如使能、关闭、入队、出队、刷新、停止等等。
执行USB gadget操作,比如VBUS处理、VBUS pull up、远程唤醒等等。
充电检测。
Gadget framework
USB设备模式驱动框架(device mode driver)
支持多配制、多接口、符合设备和alternate接口设置,发展的可重用/组合的usb_function(一个描述配置功能的结构体)实例,提供复合和多配置gadget的更简单设置。
此框架驱动底层实现与硬件无关的USB功能(使用设备控制器驱动的调用),例如,在gadget.h中定义了对象和方法。
对于特定控制器,支持端点在编译时可配置。
在linux中,大多数gadget驱动(例如串口gadget驱动)有一个连接到linux驱动或框架的上界(upper boundary)
对应usb\gadget下android.c、composite.c。
u_serial.c – utilities for USB gadget “serial port”/TTY support,u_serial.c的u表示utilities(工具)。
f_serial.c – generic USB serial function driver,f_serial.c的f表示function。
Function drivers
Function驱动包括modem(比如USB 接口的4G网卡),NMEA(美国国家海洋电子协议,比如USB接口的GPS),大容量存储等。
对应usb\gadget\function源码。
Host controller driver(Host控制器驱动)
驱动底层部分和HS-USB OTG控制器交互。
兼容EHCI
使用USB HCD框架注册Host控制器驱动和使用EHCI包装器函数(wrapper函数)来支持root hub、管理I/O请求与关联设备资源、管理底层事务(URB to transfer descriptor queue,例如USB请求块(Universal Request Block)来传递描述符队列)
对应usb\host代码。
USB core
USB core的实现与底层硬件无关。
对类驱动(class driver)隐藏大多数USB协议相关项。
与USB类驱动的交互。
对应usb\core代码。
USB PHY driver(物理层协议)
分离PHY具体操作的新层。
HCD/DCD/OTG层可以引用多个PHY实例。
对应kernel\msm-3.18\drivers\usb\phy文件夹的源代码。USB PHY driver应该在OTG driver和OTG core之间,第1张图我有备注,下面这种图可以体现出来
Class drivers类驱动
类驱动包括大容量存储、HID、HUB等。对应\kernel\msm-3.18\drivers\usb\class下代码。