OTG识别原理

  

  如图1所示,那个是Micro USB的母头,可以清晰看到有5pin,分别是(不分顺序):Vbus、GND、D+、D-、ID。当移动设备,类似手机、平板电脑等要支持OTG功能,就必须使用这个接口,而且电路上需要将ID上拉。分两种情况来讨论:
  1.当连接普通的USB线(图2),设备要充电或者连接电脑,这时候设备是充当电脑的从设备,Vbus是从电脑/适配器过来的,手机/平板吸收电流。这根普通的USB线,它的ID其实是悬空的,那就是说手机的ID与USB线的ID相接,此时电平为高。

  
  2.当连接下面的OTG线(图3),手机、平板需要外接鼠标、U盘之类的,这时候Vbus就是由手机提供,为外设供电。需要注意的是,由于移动设备电池最高电压为4.2V,因此需要先升压再输出Vbus。OTG线的ID在接口位置已经和“GND”连接,所以当手机的ID一接上去,ID就变低电平。
  

  所以,手机做老大时,ID为低电平;手机做小弟时,ID为高。

 

转载于:https://www.cnblogs.com/ruihuagogogo/p/7161730.html

<think>我们面对的核心问题是:在Android 9设备上,当启用ADB(通过USB)时,USB接口被ADB独占,导致无法同时使用OTG功能。同时,我们希望保留ADB调试功能(通过WiFi),并释放USB接口用于OTG外设。 根据之前的解决方案,我们已经知道: 1. 通过WiFi ADB可以解除对USB接口的占用(因为ADB流量走WiFi了)。 2. 然后我们需要将USB模式切换为OTG模式,以便连接外设。 但是,用户提到在安卓9上开启ADB后无法识别OTG设备,所以我们需要确保在切换到WiFi ADB后,USB配置正确设置为OTG模式。 参考引用[1]中提到,可以在开发者选项中添加一个切换USB OTG模式的开关。但是,对于标准的Android 9系统,可能没有这个选项。因此,我们需要通过其他方式实现。 步骤分解: 第一步:配置WiFi ADB(释放USB接口) - 开启开发者选项和USB调试 - 通过USB连接电脑,执行`adb tcpip 5555`开启网络监听 - 获取设备IP,然后通过`adb connect <IP>`连接 - 断开USB线,此时ADB通过WiFi连接 第二步:切换USB模式以支持OTG - 在开发者选项中,将“选择USB配置”设置为“文件传输(MTP)”或“大容量存储”。这样当USB连接时,设备会尝试作为主机(Host)来读取外设。 - 插入OTG设备(如U盘),检查是否被识别。 然而,如果设备在插入OTG设备后仍然无法识别,可能是因为系统没有正确切换到OTG模式。这时,我们可以尝试通过ADB命令来触发OTG模式的切换。 参考引用[1]和[2]中提到了切换USB OTG模式的方法。虽然引用[2]是针对Android 11的,但我们可以尝试在Android 9上使用类似的命令。 在Android系统中,USB模式的控制是通过`sys.usb.config`和`sys.usb.state`这两个系统属性来实现的。我们可以通过设置这些属性来改变USB的工作模式。 常见的模式有: - `mtp`:文件传输 - `ptp`:图片传输 - `charging`:仅充电 - `adb`:调试模式(通常与其他模式组合,如`mtp,adb`) 对于OTG模式,我们需要将设备设置为主机模式(host mode)。在Android中,OTG模式通常是通过设置USB配置为`host`来实现的。 但是,在标准的Android 9中,可能没有直接提供切换为OTG主机模式的选项。我们可以尝试以下命令: ```bash adb shell su -c 'echo host > /sys/devices/platform/soc/a800000.ssusb/mode' ``` 注意:这个路径可能因设备而异。更通用的方法是使用`setprop`来设置系统属性,但Android并没有一个标准属性来控制OTG模式。 另一种方法是使用`svc`命令(需要root权限): ```bash adb shell svc usb setFunction none adb shell svc usb setFunction mtp ``` 但是,这些命令可能不适用于所有设备。 经过分析,在Android 9中,当USB接口没有连接电脑时,插入OTG设备应该会自动切换到主机模式。所以,当我们通过WiFi ADB释放了USB接口后,插入OTG设备应该能自动识别。 如果仍然无法识别,可能是以下原因: - 设备硬件不支持OTG(但用户提到之前可以,所以排除) - 系统设置中没有开启OTG功能(部分设备有独立开关) - USB接口供电不足(可以尝试使用带电源的OTG线) 因此,我们的解决方案是: 1. 确保已经通过WiFi连接ADB,断开USB连接。 2. 在设置中检查是否有OTG开关,并开启(设置路径可能为:设置->更多设置->OTG连接,或者设置->存储->OTG)。 3. 插入OTG设备,等待系统识别。 如果以上步骤无效,我们可以尝试通过ADB命令来模拟OTG的挂载过程(需要root权限): - 手动挂载U盘:首先确定U盘的设备节点(如/dev/block/sda1),然后挂载到某个目录(如/mnt/media_rw/XXXX-XXXX)。 但是,非root设备无法执行挂载操作。 因此,对于没有root权限的设备,如果上述步骤无效,可能需要检查设备制造商的设置,或者使用第三方应用来激活OTG功能。 总结步骤: 1. 配置WiFi ADB(如前所述)。 2. 断开USB线。 3. 进入设置,开启OTG功能(如果设备有独立开关)。 4. 插入OTG设备。 如果仍然不行,考虑以下可能: - OTG设备格式不被支持(FAT32/exFAT通常支持,NTFS可能不支持)。 - OTG设备损坏或线缆问题。 另外,我们可以通过ADB命令检查内核日志来查看插入OTG设备时的识别情况: ```bash adb logcat -d | grep -i usb adb logcat -d | grep -i otg ``` 或者: ```bash adb shell dmesg | grep -i usb ``` 通过日志我们可以判断设备是否被识别以及识别过程中出现的错误。 由于用户要求保留WiFi调试并正确切换USB为OTG模式,我们已经通过WiFi ADB释放了USB,然后通过系统设置开启OTG功能并插入设备。 因此,完整的解决方案如下: 步骤1:配置WiFi ADB - 用USB线连接设备和电脑。 - 在电脑上执行: adb tcpip 5555 adb connect <设备IP> - 断开USB线,确认adb devices还能看到设备。 步骤2:切换USB配置 - 在设备上,进入“设置”->“开发者选项”->“选择USB配置”,选择“文件传输(MTP)”或“大容量存储”。 步骤3:开启OTG功能(如果设置中有开关) - 例如:设置->更多设置->OTG连接,打开开关。 步骤4:插入OTG设备,等待识别。 步骤5:如果未识别,检查存储设置或使用文件管理器查看。 步骤6:如果还是不行,通过WiFi ADB获取日志分析原因。 注意:以上步骤不需要root权限,但需要设备支持OTG功能。 最后,由于Android 9设备可能存在差异,如果设备制造商修改了USB驱动或OTG的挂载方式,可能需要特定处理。但标准Android 9应该支持自动挂载OTG设备。 相关问题: 1. 如何通过ADB命令直接挂载/卸载U盘? 2. Android 9设备OTG供电不足导致U盘无法识别怎么办? 3. 如何配置设备重启后自动开启WiFi ADB? 4. 通过WiFi ADB传输文件与USB直接传输有何性能差异?</think>### 解决 Android 9 开启 ADB 后无法识别 OTG 的完整方案 #### 核心问题分析 当 Android 9 开启 USB ADB 调试时,系统会**独占 USB 控制器**,导致 OTG 功能失效。这源于系统 USB 控制器的两种工作模式: - **设备模式(Device Mode)**:USB 被 ADB 独占 - **主机模式(Host Mode)**:支持 OTG 外设 $$ \text{USB 状态} = \begin{cases} \text{设备模式} & \text{(ADB 激活)} \\ \text{主机模式} & \text{(OTG 激活)} \end{cases} $$ --- ### 一、配置 WiFi ADB(释放 USB 接口) 1. **基础设置** - 开启 `设置 > 开发者选项 > USB 调试` - 连接 USB 线到电脑 2. **启动 TCP 监听** ```bash adb devices # 验证设备连接 adb tcpip 5555 # 开启 TCP 监听端口 ``` > ✅ 输出 `restarting in TCP mode port: 5555` 表示成功 3. **获取设备 IP** ```bash adb shell ip addr show wlan0 | grep "inet " # 输出示例: inet 192.168.1.100/24 ... ``` 4. **建立无线连接** ```bash adb connect 192.168.1.100:5555 # 替换为实际 IP ``` > ✅ 成功提示 `connected to 192.168.1.100:5555` 后断开 USB 线 --- ### 二、强制切换 USB 到 OTG 模式 #### 方法 1:通过系统属性切换(需 root) ```bash adb shell su -c "setprop sys.usb.config mtp,adb" # 重置配置 adb shell su -c "setprop sys.usb.config host" # 强制切换主机模式[^1] ``` #### 方法 2:通过内核接口切换 ```bash # 切换 USB 控制器到主机模式 adb shell su -c "echo host > /sys/devices/platform/soc/a800000.ssusb/mode" ``` #### 方法 3:开发者选项切换 1. 进入 `设置 > 开发者选项` 2. 修改 `选择 USB 配置` 为 `MTP` 或 `大容量存储` 3. 开启 `OTG 连接`(路径:`设置 > 更多设置 > OTG 连接`) --- ### 三、验证与故障处理 #### 验证 OTG 状态 ```bash adb shell dmesg | grep -i otg # 检查内核 OTG 状态 adb shell ls /storage # 查看外设挂载点 ``` #### 常见问题解决 | 问题现象 | 解决方案 | |---------|----------| | OTG 未供电 | 使用带电源的 OTG HUB | | U盘无法识别 | 格式化为 FAT32/exFAT | | 模式切换失败 | 执行 `adb reboot` 后重试 | | WiFi ADB 断开 | 重新执行 `adb connect IP:5555` | --- ### 四、配置原理 ```mermaid graph LR A[PC] -- WiFi --> B[Android 9 设备] B -- USB 主机模式 --> C[U盘/外设] D[ADB 命令] -- 5555 端口 --> A ``` 1. **WiFi ADB**:通过 TCP 端口 5555 传输调试数据,释放 USB 物理接口 2. **OTG 激活**:强制 USB 控制器进入主机模式(host mode) 3. **外设识别**:系统自动加载 `usb-storage` 驱动挂载设备 > ⚠️ **注意**:部分设备需额外启用 OTG 供电,可在 `设置 > 电池 > OTG 供电` 开启 --- ### 五、持久化配置(重启后生效) #### 1. 自动开启 WiFi ADB ```bash adb shell su -c "setprop persist.adb.tcp.port 5555" ``` #### 2. 开机自动切换 OTG 模式 创建 `/etc/init/otg.rc`: ```rc on boot # 延迟 30 秒等待系统初始化 exec sleep 30 setprop sys.usb.config host ``` --- ### 关键命令总结 | 功能 | 命令 | |------|------| | 开启 TCP ADB | `adb tcpip 5555` | | 切换主机模式 | `setprop sys.usb.config host` | | 检查 OTG 状态 | `dmesg \| grep -i otg` | | 持久化配置 | `setprop persist.adb.tcp.port 5555` | 通过此方案,可同时保持 **WiFi ADB 调试**和 **OTG 外设连接**,解决 USB 接口独占冲突问题[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值