You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动