介绍
USB On-the-GO(OTG)允许两个USB设备不依赖PC的支持而直接进行对话。尽管OTG看起来有点儿像,但它并不是USB设备间的“点对点”连接。
事实上,USB OTG仍旧是标准的USB Host/Peripheral[1]模式,即一个单独的Host设备可以与多个Peripheral进行对话。
OTG引入了双角色设备(DRD)的概念,设备能够作为Host/Peripheral二种角色之一进行工作。
OTG的魔力之一是Host/Peripheral设备可以在必要的时候互换角色。
在OTG产生之前,嵌入式USB Host设备的概念是固化的。
因为大多数嵌入式Host芯片只能提供有限的功能,而不是完整复制PC上的UHCI/OHCI USB驱动,这使它们对比PC上庞大的驱动和应用的体积而言,更适合嵌入式环境。
而OTG设备并不拘泥于Host的功能。更多的时候,大多数OTG设备能够作为双重角色出现。
作为USB Peripherals
图一举例说明基本的USB OTG作为Peripheral的电路连接。图示周边设备在low speed(低速)/full speed(全速)下工作,也就是通常意义的USB1.1设备。
这种命名法在进入USB2.0时代后仍旧沿用。2.0的速度被称为高速(high speed)。
图一 USB Peripheral控制器和周边电路
图一中所指的USB控制器可以是一个附加了USB 串行接口引擎的微处理器,一个完整的USB处理芯片,或者连接在USB收发器上的集成电路。
一个总线控制电源的周边设备需要3.3V的电源为逻辑电路供电,并且为连接在D+和D-管脚上的1500欧电阻提供电压。这个上拉电阻会通知Host,有设备接续信号产生,并且通过它识别出操作速度。
D+上产生的上拉为full speed(USB1.1),D-上产生的上拉则为low speed(USB1.0)。
在USB连接的另一端——Host或者hub的D+和D-上连接有15k欧的下拉电阻,因此上拉信号会被检知。
最后,应该为D+,D-和VBUS添加ESD保护电路[2],因为USB的即插即用性。
变成USB Host
图一的电路只适用于USB Peripheral设备。为了添加OTG双角色功能,收发器必须扩充功能,以满足OTG设备扮演Host或者Peripheral角色的需要。
在图一上进行下列扩充,使整个系统实现Host功能:
·D+和D-上的15k欧的上拉电阻。
·VBUS上的一个可控的供电电源,而不是固定电源。
专用集成电路或者控制器也必须包含实现USB Host功能的逻辑。一些在Peripheral设备中并不存在的Host功能包括:
·发送SOF[3]包
·发送初始化及IN,OUT包。
·通过USB1ms帧进行计划传输。
·标识USBreset。
·提供USB电源管理。
为了实现对两种角色转换的支持,OTG需要额外的电路来支持两个新协议:HNP和SRP。
HNP主机交换协议
一个OTG双角色设备能操作Host或者Peripheral设备。在OTG的命名规则下,初始的Host被称为A-Device,初始的Peripheral设备被称为B-Device。这两个词的初始定义非常重要[4]。
当接续产生,OTG双角色设备能够通过HNP协议转换Host/Peripheral角色。HNP提出了两个鲜明的问题:(A)初始的角色是如何决定的?(B)为什么角色翻转是必要的?
图二 通过第五根ID管脚决定初始的Host
接线接口的不同决定了初始角色。双角色设备使用一个新的插槽——Mini-AB。Mini-AB插座增加了连接线终端的第五根管脚(ID)用来识别不同的电气身份。
第五根ID管脚在mini-A端的内部接地,而在mini-B端的时候悬空。OTG设备接收到ID管脚接地时作为默认的A-Device(Host);ID管脚悬空时作为默认的B-Device(Peripheral)。
图三 OTG接线反向接入
为了理解HNP的需求以及Host/Peripheral的翻转,图三给出了两个双角色设备连接的例子:一部PDA和一个打印机。在PDA内部有打印机驱动。两个设备如图示通过一根OTG线进行连接,这时打印机作为默认的Host(A-Device),而PDA作为默认的Peripheral(B-Device)。但是设置是反向的。因为PDA中有打印机驱动,工作时相对于打印机来说需要扮演USB Host的角色,而打印机上是没有驱动的。为了避免用户重新插线的麻烦,HNP允许两个设备的角色自动反转。
SRP对话请求协议
OTG规格说明书中为USB引入第二个协议,叫做SRP(Session Request Protocol)。
SRP允许一个B-Device向一个A-Device提出请求,用来接通VBUS电源并开始会话。
一个OTG会话被定义为A-Device提供VBUS电源的时刻。(注意:A-Device会始终提供VBUS电源,即使在它通过HNP协议转换成为Peripheral角色之后也不会停止供电)
A-Device可以通过切断VBUS并保存电源的方式结束一个会话。这在电池供电的设备上是非常重要的需求,比如手机。
图四 对话请求协议
图四说明了一个通常的OTG程序:两部手机连接交换数据。右面的手机插入mini-A端,作为A-Device端并且进入Host角色。左面的手机是B-Device,默认是Peripheral角色。
如果USB上的通信不再必要,A-Device能够停止VBUS供电,这样B-Device能够检知并进入低电模式。
现在假设左面手机的用户按下了一个按键,用来同步电话簿,或者其它需要USB会话的动作。
左面手机会在D+线上产生一个“SRP Pluse”脉冲,然后VBUS线会唤醒A-Device。(A-Device能够响应D+和VBUS上的信号)
A-Device检知到这个信号后[5],会接通VBUS并开始一个会话。
SRP协议要比这个简单的例子复杂。比如,B-Device必须先测量VBUS以确认没有使用中的会话。并且它必须能够区分连线的另一端是传统的PC还是OTG设备。它通过向发送VBUS测量量并以收不到电压变化来确定另一端的角色。
当会话在进行中时,设备是否仍旧使用SRP协议就无所谓了。
OTG收发
现在我们可以详细说明OTG的收发器了。如图五所示。
图五 一个OTG收发器
图五基于图一的电路图进行扩展。集成模块可以是微处理器或者USB功能的DSP。为了实现OTG的收发器,追加了三项:
1.在D+和D-上追加可以切换的上拉/下拉电阻以实现Host/Peripheral功能。
2.为了作为A-Device,为VBUS提供5V电源并进行监视用,以及为了作为SRP初始B-Device一方,监视并提供VBUS脉冲用的电路。
3.一个作为专用集成电路输入用的ID输入管脚。
为了在系统中操作双角色OTG设备,连接在收发器上的任何芯片或者集成电路必须同时支持Host和Peripheral功能,并且能够根据HNP协议动态切换角色。
追加的收发器电路大部分作用是管理VBUS管脚。因为它现在作为Host时必须支持8mA/5V的电源,作为Peripheral时要提供VBUS脉冲。通过模拟开关的来配置收发器,使它能适应不同的角色。
[1] USB本身存在Host(主)与Device(从)的概念。但是“Device”与“设备”容易产生歧义,所以本文表达“从”概念时一律用“Peripheral”这个词。这也是大多数USB文档中采用的方法。
[2] ESD 保护电路 via
[3] SOF Start of Frame。USB传输协议中的一个令牌包。是唯一一个不指定方向的令牌包,向所有的设备进行广播。via
[4] 有人认为A-Device与B-Device的区别跟Host/Peripheral无关,而只是ID接地的被称为A-Device,ID悬空的为B-Device。
[5] 对于Host端来说,设备的检出就是ADP(Attach Detection Protocol)协议。
专业!以后可以拿你这个去装大神了~
一脸 蒙蔽。
拜读,感谢分享!
我只知道我目前用的华为荣耀6 Plus可以不用PC直接读取U盘……然后,两个同样的设备接在一块,谁来做攻,谁来做受,便是你说的这门学问了。
一直在用OTG,没想到这里头这么多的道道
买了个type C转接口,居然不支持otg,只能下次买个支持的。
OTG的host端不支持hub。也就是说一开始的角色是device并且连线上有hub,那么是无法转回host的。