原帖地址:http://blog.csdn.net/zkami/article/details/2508136
Linux USB "On-The-Go"(OTG) on OMAP H2 软件架构分析(一)
本文参考David rownell的文章http://www.linux-usb.org/gadget/h2-otg.html。介绍了linux2.6中关于usb-otg的软件体系结构。在刚结束的基于本公司usb-otg chip的solution也主要参考了omap的构架。如需引用请注明出处:http://blog.csdn.net/zkami 作者:ZhengKui
OMAP H2 Platform简介
- <!--[if !supportLists]--><!--[endif]-->集成了3个USB控制器:OHCI host, USB Device Controller(UDC), OTG controller. 都支持full speed (12Mbit/s)
- 在H2的板子上应该有Mini-AB的插口。根据OTG spec规定所有双角色(doul-role)设备都应有Mini-AB接口。
- <!--[endif]-->外部的USB OTG收发器(USB OTG transceiver) --- Philips ISP1301。通过I2C总线控制。
- <!--[endif]-->通过TI(TPS65010)电源控制器进行电源管理,通过I2C总线控制TPS65010。这样当H2作为B-role设备时,A-role可以给他供电500mA。当H2作为A-role设备时自身可以提供8mA电流。
OTG简介
USB技术的发展,使得PC和周边设备能够通过简单方式、适度的制造成本将各种数据传输速度的设备连接在一起,上述我们提到应用,都可以通过USB总线, 作为PC的周边,在PC的控制下进行数据交换。但这种方便的交换方式,一旦离开了PC,各设备间无法利用USB口进行操作,因为没有一个从设备能够充当 PC一样的Host。 On-The-Go,即OTG技术就是实现在没有Host的情况下,实现从设备间的数据传送。例如数码相机直接连接到打印机上,通过OTG技术,连接两台 设备见的USB口,将拍出的相片立即打印出来;也可以将数码照相机中的数据,通过OTG发送到USB接口的移动硬盘上,野外操作就没有必要携带价格昂贵的 存储卡,或者背一个便携电脑。 USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG)。OTG两用 设备完全符合USB2.0标准,并可提供一定的主机检测能力,支持主机通令协议(HNP)和对话请求协议(SRP)。在OTG中,初始主机设备称为A设 备,外设称为B设备。可用电缆的连接方式来决定初始角色。图2所示是用第5个ID脚确定默认主机的示意图,两用设备使用新型mini-AB插座,从而使 mini-A插头、mini-B插头和mini-AB插座增添了第五个引脚(ID),以用于识别不同的电缆端点。mini-A插头中的ID引脚接地, mini-B插头中的ID引脚浮空。当OTG设备检测到接地的ID引脚时,表 示默认的是A设备(主机),而检测到ID引脚浮这的设备则认为是B设备(外设)。系统一旦连接后,OTG的角色还可以更换。主机与外设采用新的HNP,A 设备作为默认主机半提供VBUS电源,并在检测到有设备连接时复位总线、枚举并配置B设备。OTG标准为USB增添的第二个新协议称为对话请求协议 (SRP)。SRP允许B设备请求A设备打开VBUS电源并启动一次对话。一次OTG对话可通过A设备提供VBUS电源的时间来确定(注:A设备总是为 VBUS供电,即使作为外设)。也可通过A设备关闭VBUS电源来结束一闪会话以节省功耗,这在电池供电产品中是非常重要的。例如,在两台蜂窝电话通过连 接互相交换信息时,一台连接在电费的mini-A端,是A设备,默认为主机。另一台是B设备,默认为外设。当在不需要USB通信时,A设备可以关闭 VBUS线,此时B设备就会检测到该状态并进入功低耗模式。
<!--[if !vml]--><!--[endif]-->
Linux2.6 USB-OTG软件结构
OHCI Host Controller Driver |
Isp1301_omap Driverr |
Device Controller Driverr |
OHCI Host Controller |
Isp1301 Driverr |
Device Controller |
USB Core |
USB Device Class Driver(Mass storage...) |
USB Device Class Driver(Mass storage...) |
Gadget Driverr |
相对于原来的USB Module, 当前的kernel做了以下更新来支持OTG功能:
<!--[if !supportLists]-->接口的更新:
- <!--[if !supportLists]--><!--[endif]-->USB Device Controller Driver导出一些新的接口
- USB Gadget Driver 有一些新的功能。
- <!--[endif]-->在主机端 “usbcore”模块需要一些新的OTG相关的能力,来负责对设备枚举。这个枚举的过程对设备端是不可见的。同时,主机端还需要一些挂起(suspend), 唤醒(resume), 远程唤醒(remote wakeup)的能力来支持HNP协议。这就涉及到Linux电源管理的接口。
- <!--[endif]-->主机端还要定义一个OTG “Targeted Peripheral List”。毕竟作为一个嵌入式设备不用支持每一种设备。而只需支持自己定义的“Targeted Peripheral List”中的设备。
- 对OTG核心协议的支持封装在了otg_transceiver object中。对于H2来说, isp1301_omap driver控制了收发器(transceiver)和OMAP OTG controller, 并且通过usb_bus和usb_gadget 接口与OHCI和UDC drivers(设备端控制器驱动程序)通信。如下图所示:
- 在”USB Gadget”框架中,需要omap_udc driver对上层标准gadget drivers提供良好的支持。这些gadget drivers都基于gadget接口,包括Ethernet/RNDIS, Mass Storage, serial/ACM等等。在gadget driver中需要定义好设备的各项属性包括端点数,DMA, ISO传输等。类似于写设备的firmware。
- 在linux2.6中已经可以支持OHCI host controller, 通过ohci_hcd可以访问大量的并正在增长的usb device driver。
OHCI driver
Isp1301_omap driver
UDC driver
OHCI host controller
Usb device controller
Isp1301
OMAP OTG controller
Usb
bus
<!--[if !vml]-->gadget