Android Things新手求助:如何控制i.MX7 Dual连接的USB设备通断电
解决Android Things(i.MX7 Dual)上USB设备通断电控制的问题
作为Android Things新手,确实官方USB主机API主要聚焦在设备通信层面,没有直接提供电源通断的控制接口。不过针对i.MX7 Dual这类嵌入式平台,我们可以通过操作sysfs节点来实现USB端口的物理电源控制,完全不需要依赖设备的VID/PID,具体步骤如下:
1. 定位USB端口对应的sysfs电源控制节点
i.MX7 Dual的USB主机端口电源控制通常会暴露在sysfs的特定路径下,你可以通过以下方式快速找到对应的节点:
- 连接USB设备后,在ADB shell中执行
find /sys -name "powered" | grep usb,会列出所有和USB相关的电源控制节点。常见的路径比如/sys/devices/platform/soc/30b20000.usb/powered(对应USB2.0主机端口)或/sys/devices/platform/soc/30b60000.usb/powered(USB3.0端口,视硬件配置而定)。 - 也可以用
lsusb查看USB设备挂载的总线号,对应到/sys/bus/usb/devices/usbX/power/control(X为总线号),不过这个节点更多是控制设备的挂起/唤醒,而非物理电源通断,优先推荐前面的powered节点。
2. 在应用中执行电源控制命令
Android应用默认没有直接写入sysfs的权限,你需要通过root权限执行shell命令来操作:
- 先确认你的Android Things镜像允许root访问(大多数官方开发板镜像默认支持)。
- 在你的应用中,通过
Runtime.exec()执行控制命令:
try { // 关闭USB端口电源 Process process = Runtime.getRuntime().exec("su"); DataOutputStream os = new DataOutputStream(process.getOutputStream()); os.writeBytes("echo 0 > /sys/devices/platform/soc/30b20000.usb/powered\n"); os.flush(); os.writeBytes("exit\n"); os.flush(); process.waitFor(); // 打开USB端口电源(需要时执行) process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(process.getOutputStream()); os.writeBytes("echo 1 > /sys/devices/platform/soc/30b20000.usb/powered\n"); os.flush(); os.writeBytes("exit\n"); os.flush(); process.waitFor(); } catch (IOException | InterruptedException e) { e.printStackTrace(); }
- 记得把命令中的sysfs路径替换成你实际找到的节点路径。
3. 额外注意事项
- 不同i.MX7开发板的硬件布局可能有差异,sysfs路径会不一样,一定要先通过ADB shell确认正确路径。
- 频繁通断电可能会对USB设备或开发板硬件造成损耗,建议按需操作。
- 如果你的应用无法获取root权限,可以尝试将应用打包为系统应用(使用和系统一致的签名),这样就能直接访问sysfs节点而无需
su。
内容的提问来源于stack exchange,提问作者chiyomin




