OTG中的ID脚风波释疑 .

本文深入探讨了OTG设备的连接机制,包括USB-OTG插槽类型、协议(如SRP、ADP、HNP)、设备框架、连接方式及案例分析。详细解释了如何通过HNP切换设备角色,以及不同类型的USB-OTG插槽如何影响设备的连接与功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文:http://my.oschina.net/u/130864/blog/15322    Weike的博客

 

1. 概要
OTG设备使用插头中的ID引脚来区分A/B Device,ID接地被称作为A-Device,充当USB Host,A-Device始终为总线  提供电力,ID悬空被称作为B-Device,充当USB Device,设备的USB Host/USB Device角色可以通过HNP(主机交换  协议)切换。OTG设备连接时不能跨越USB Hub,如果跨越USB Hub则失去HNP功能。A-Device/B-Device与USB  Host/Device没有必然的关系,主机切换完毕后A-Device变成USB从设备,但是仍然为总线供电。

2.USB-OTG插槽类型

As Host Only :提供标准的A插座,普通的USB Host并带有TPL(支持设备列表)

As Device Only:仅能作为外设的B-Device(分为插头一体和插头线缆分离的)

OTG Dual      :使用Micro AB插座,可以在运行时切换Host/Device。

OTG Dual  在插头插入后会先打开VBus,如果没有设备连接则关闭VBus,并开启ADP侦测,而EAs Host Only 则  不会再次关闭VBus
3.协议
SRP(Session Request Protocol)对话请求协议: 
SRP协议允许Adevice在总线为使用时通过切断VBUS来节省电源消耗,任何一类Adevice都应该能够响应SRP请求,任何Bdevice也应该能够发起SRP请求,
ADP(Attach Detection Protocol): 
提供是否有对端设备插入的检测,支持任何OTG设备
HNP(Host Negotiation Protocol)主机交换协议: 
OTG设备通过HNP来切换Host/Device角色,Adevice通过查询Bdevice的OTG性能描述符来判断是否支持HNP协议,以判断Bdevice是否为两用的OTG设备,如果Bdevice支持HNP协议,Bdevice将会返回有效的OTG性能描述符,随后Adevice产生一个SetFeature命令告知Bdevice:你可以在总线挂起时以主机的方式工作,Adevice发送了这个SetFeature命令后挂起总线,  本次Session结束后Host回到Adevice手里。
4.设备框架
OTG描述符
在设备枚举时,A-Device通过GetDeor向B设备请求OTG描述符。OTG描述符也应当作为GetConfiguration()的一部分返回。其中的bmAttributes标示B-Device是否支持ADP/HNP/SRP
标准设备特性,通过SetFeature()设置。
b_hnp_enable 
设置此特性,显示B-Device被允许进行HNP,A设备必须在T(HOST_REQ_SUSP)时间内挂起总线,此特性在session结束时清除。
a_hnp_support
早期OTG版本的兼容特性,设置这个特性指示B-Device对端的A-Device支持HNP。
a_alt_hnp_support 
该标志已被废弃
5.连接方式(Host -> Device)
As Host Only 与 仅作为外设的B-device(带A插头型)
Host端检测到A插头插入,停止ADP,打开VBus,因为B-Device的A插头与设备作为一体,此时B-Device必定与A插头连接,Host检测到外设连接,开始枚举。 
As Host Only 与 仅作为外设的B-device(A插头为线缆连接)
Host段检测到A插头插入,停止ADP,打开VBus,如果B-Device是线缆连接完毕在将A插头插入则整个连接过程与上面无异,因为此 时B-Device可能还没有插入插头,则设备连接超时,VBus再次关闭,等待下一次ADP的改变(线缆连接完毕),再次打开VBus,此时开始正常总 线枚举。
OTG Device 与 OTG Device
Host端检测到插头插入,则打开VBus,如果没有外设检测到,则关闭VBus,打开ADP Probing,Device端检测到插头插入,则打开SRP,如果线缆没有插入,则SRP超时,Device端开始进行ADP Probing,当线缆连接完毕,Device端侦测到ADP变化,发送SRP请求Host打开VBus,Host回应SRP并且打开VBus,完成设备连接。
6.案例分析:
有客户反馈他们的样机OTG mrio AB插座不能识别U盘,最后查出的原因是客户样机的USB的ID脚没有接地,
样机没有切换到USB HOST模式。
### OTG ID 线的作用 OTG (On-The-Go) 技术允许移动设备和其他USB外设之间互相通信,在某些情况下可以互换主机和从机的角色。ID线在此过程中扮演着至关重要的角色。 #### 识别 A-device 和 B-device 的身份 OTG 使用特殊的插头,其中包含了额外的ID用于区分两种类型的设备:A-device 或者 B-device。具体来说: - 如果ID接地,则该端口被认为是A-device,它通常会承担起提供电力并初始化连接的责任; - 若ID处于高阻态(即未接通或浮置状态),那么此端口就被视为B-device,等待由另一方发起通讯请求[^2]。 这种机制使得两个支持OTG标准的不同装置能够自动协商哪个应该担任host角色,从而简化了用户的操作流程。 #### 连接方式 对于物理上的连接而言,OTG适配器一端设计成Micro USB接口形式以便接入手机和平板电脑等便携式电子产品的充电口中;另一侧则是Type-A插座用来接纳其他常规USB外围硬件如U盘、键盘鼠标或是读卡器等等。值得注意的是,由于存在上述提到的身份差异,因此实际应用当中应当确保正确匹配两端所对应的属性——让具备供电能力的一边充当A-device,而另一边自然成为依赖对方供给能量工作的B-device。 ```python # Python代码仅作示意用途,并不涉及具体的电气工程细节 class OtgDevice: def __init__(self, is_a_device=True): self.is_a_device = is_a_device def connect(self, other_device): if isinstance(other_device, OtgDevice): if not self.is_a_device and other_device.is_a_device: print("成功建立连接,当前设备为B-device") elif self.is_a_device and not other_device.is_a_device: print("成功建立连接,当前设备为A-device") else: raise ValueError("无法确定哪一方应作为Host") device_A = OtgDevice(is_a_device=True) device_B = OtgDevice(is_a_device=False) try: device_A.connect(device_B) except Exception as e: print(f"发生错误: {e}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值