USB OTG

本文详细介绍了USB OTG(On-The-Go)的工作原理,包括Attach Detection Protocol (ADP)、Host Negotiation Protocol (HNP) 和 Session Request Protocol (SRP) 三种核心协议的作用与流程,帮助读者理解USB OTG设备如何检测连接状态、确定主从角色及进行角色互换。

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

USB OTG

想了解USB OTG的工作原理,需要知道三个协议: 
ADP:Attach Detection Protocol 
HNP:Host Negotiation Protocol 
SRP:Session Request Protocol

2.1 ADP

USB主从设备或USB OTG设备,如何知道USB总线上有没有挂接其它USB设备呢?USB设备会周期性地检测USB端口的电容值,如果USB端口电容值变化足够大,大到可以确定有新的USB设备接入了,那么USB A型设备会为USB总线提供电源,并检测设备连接;而USB B型设备则发起一个会话请求(SRP),并等待A型设备的响应。

2.2 HNP

2.2.1 主从设备是如何确定的?

USB OTG既可以做主设备,也可以做从设备。在系统运行过程中,OTG设备的角色(主设备or从设备)可以转换,但是,在系统刚启动时,OTG设备的角色是确定的。如何确定的呢?下面来解决这个问题  
original
上图是几种典型的USB接口,其中Mini-A型、Mini-B型、Micro-AB型和Micro-B型口都有五个管脚,管脚顺序是 
1:Vbus 
2:D- 
3:D+ 
4:ID 
5:GND 
若是ID管脚接地,则该设备为A设备;若ID管脚悬空,则该设备是B设备,其中A设备是initial host,B设备是initial peripheral。即系统刚启动时,A设备是主设备,B设备是从设备。如下图所示,左边的设备是B设备,右边的USB设备是A设备。 
image  
值得注意的是,在系统运行的过程中,USB设备的主从角色可能会变化,但是A设备/B设备的名称不会变化。也就是说,在系统运行过程中,A设备有可能从主设备变成从设备,但是A设备仍然叫做A设备;B设备类似。 
另外,A设备始终是供电设备,而与A设备扮演的角色无关。即使A设备变成了从设备,仍然由A设备供电。

2.2.2 为什么需要更换主从设备的角色呢?

image  
上图为一个需要互换角色的例子。左边是一台PDA,PDA里有打印机驱动,但由于它是B设备,因此初始角色是从设备。很显然,在打印服务的过程中,有必要互换PDA和打印机的角色。 
我们在开发i.MX233开发板的过程中,ID管脚没有引出来,因此,默认i.MX233是从设备。可是USB摄像头也是从设备,这样i.MX233没有办法转换成主设备,从而i.MX233无法使用USB Camera。

2.3 SRP

正如刚刚提到的那样,A设备一直供电,即使A设备通过HNP协议由主设备变成从设备了,也一直由A设备供电。然而,在嵌入式系统里,尤其是只有电池供电的系统里,功耗是一个很重要的性能指标。A设备可以通过停止供电终止会话,进而降低功耗。这样就产生了一个问题,如果B设备要求开启一个会话,该怎么办? 
SRP可以解决这个问题。根据SRP,B设备可以请求A设备打开电源,开始一个会话(session)。 
image  
如上图所示,B设备中的SRP PULSE会先给D+引脚一个脉冲,之后再给VBUS一个脉冲,这样可以唤醒A设备。相应的,右边的A设备检测到D+或VBUS上的信号,则开启VBUS并启动会话。

USB OTG(On-The-Go)是 USB 标准中的一项功能,允许设备在没有主机的情况下充当主机或从机。在 Android 系统中,USB OTG 的支持和行为通常通过内核驱动、`init` 脚本和服务管理器共同实现。 ### 1. USB OTG 在 Android 中的作用 - **主机模式(Host Mode)**:设备可以连接 U 盘、键盘、鼠标等外设。 - **从机模式(Device Mode)**:设备作为普通 USB 设备被电脑或其他主机识别。 - **自动切换**:部分设备支持根据插入的设备类型自动切换为主机或从机。 ### 2. Android 中 USB OTG 的配置与支持 - **内核层**: - 需要启用 USB OTG 相关的内核模块(如 `CONFIG_USB_OTG`, `CONFIG_USB_EHCI_HCD`, `CONFIG_USB_MUSB_HDRC` 等)。 - 内核负责检测 USB 插入状态并通知上层系统。 - **init 脚本**: - `/system/etc/init/hw/init.usb.rc` 或其他相关 `.rc` 文件可能包含用于启动 USB 相关服务的命令。 - 例如: ```bash service vold /system/bin/vold class main user root group root seclabel u:r:vold:s0 oneshot service usb_configfs /system/bin/usb_configfs class main user root group root seclabel u:r:vendor_usb_configfs:s0 oneshot ``` - **系统服务**: - Android 使用 `Vold`(Volume Daemon)来处理存储设备的挂载和卸载。 - `UsbManager` 提供 API 让应用可以查询和控制 USB 连接状态。 ### 3. 用户如何使用 USB OTG - 插入 OTG 设备(如 U 盘、蓝牙适配器等)后,Android 会自动识别,并弹出提示或直接挂载文件系统。 - 某些设备需要手动切换 USB 模式(如通过设置菜单选择“USB 用途”为“文件传输”或“充电”)。 ### 4. 查看 USB OTG 状态 可以通过以下方式查看 USB OTG 是否正常工作: ```bash adb shell getprop | grep usb adb shell dumpsys usb ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值