您的位置:首页 > 运维架构 > 网站架构

Linux USB "On-The-Go"(OTG) on OMAP H2 软件架构分析(一)

2013-07-22 17:45 537 查看
原帖地址:/article/8995409.html

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

<!--[if !vml]--><!--[endif]-->
相对于原来的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”中的设备。

USB 控制器驱动程序的更新:

对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

gadget

<!--[if !vml]-->

<!--[endif]-->

以下会针对每一部份分别进行分析。(未完待续)<!--[endif]-->
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐