关闭 USB 端口的电源。或关闭整个 USB 子系统的电源

use*_*207 37 kernel usb power-management

我有一个专门购买的 USB 灯,以便在某个时间以编程方式将其关闭,因此我需要断开其 USB 端口的电源。

我相信我在 usb6 上有一个 USB 集线器。灯连接到此集线器中的端口之一:

#myhost$ lsusb 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
...
...
Bus 008 Device 006: ID 050d:0234 Belkin Components F5U234 USB 2.0 4-Port Hub
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

这里有两个解决方案,第一个建议:

echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 
echo suspend > /sys/bus/usb/devices/usb1/power/level  # turn off
Run Code Online (Sandbox Code Playgroud)

但我write error: Invalid argument在尝试写信时得到/sys/bus/usb/devices/usb1/power/level

$sudo bash -c 'echo disabled > /sys/bus/usb/devices/usb6/power/wakeup'
$echo suspend|sudo tee /sys/bus/usb/devices/usb6/power/level suspend
tee: /sys/bus/usb/devices/usb6/power/level: Invalid argument
$sudo bash -c 'echo suspend> /sys/bus/usb/devices/usb6/power/level'bash: line 0: echo: write error: Invalid argument
Run Code Online (Sandbox Code Playgroud)

第二种解决方案:

sudo bash -c 'echo 0 > /sys/bus/usb/devices/usb6/power/autosuspend_delay_ms; echo auto > /sys/bus/usb/devices/usb6/power/control'
Run Code Online (Sandbox Code Playgroud)

这确实会关闭 USB 集线器设备的电源。

我也试图遵循这一点

但是lsusb -t只是挂起的输出:

$lsusb -t
4-1:0.0: No such file or directory
4-1:0.1: No such file or directory
^C
Run Code Online (Sandbox Code Playgroud)

这阻止了我使用这种方法来获得“2-1.1”部分:

echo '2-1.1' > /sys/bus/usb/drivers/usb/unbind
Run Code Online (Sandbox Code Playgroud)

有没有其他方法来获取这些信息?

或者,有没有办法关闭整个 USB 子系统的电源?像modprobe -r usb_etc什么?

我的内核是:

$uname -r
3.2.0-4-amd64
Run Code Online (Sandbox Code Playgroud)

mvp*_*mvp 30

您可以使用我的工具uhubctl - 命令行实用程序来控制兼容 USB 集线器的每个端口的 USB 电源。

它仅适用于支持每端口电源切换的集线器,但请注意,许多现代主板都有支持此功能的 USB 集线器。

编译:

git clone https://github.com/mvp/uhubctl
cd uhubctl
make
Run Code Online (Sandbox Code Playgroud)

要在系统范围内安装为/usr/sbin/uhubctl

sudo make install
Run Code Online (Sandbox Code Playgroud)

要列出所有集线器的状态、它们的位置和可以由 uhubctl 控制的端口:

sudo uhubctl
Run Code Online (Sandbox Code Playgroud)

sudo如果您配置了 udev USB 权限,则可以避免使用)。

要关闭单个兼容集线器的端口 5 的电源:

sudo uhubctl -a 0 -p 5
Run Code Online (Sandbox Code Playgroud)

如果您连接了多个兼容集线器,请使用-l指定集线器位置来控制它:

sudo uhubctl -a 0 -p 5 -l 3-1.2
Run Code Online (Sandbox Code Playgroud)

要关闭然后打开电源:

sudo uhubctl -a 2 -p 5
Run Code Online (Sandbox Code Playgroud)

请注意,还支持 USB 3.0 集线器,并且许多新的 USB 3.0 集线器实际上运行良好。

在这里阅读更多

  • 好吧,复制/粘贴整个 [README](https://github.com/mvp/uhubctl/blob/master/README.md) 文件对我来说似乎不是个好主意。它解释了所有警告。 (3认同)
  • @mvp 我认为可以改进这个答案的一件事是简要解释该程序用于打开/关闭端口的底层 API 或机制。我在 Github 上的 README 中也无法清楚地看到这些信息。 (2认同)

Jor*_*rín 22

请参阅使用 linux 控制 USB 电源(开/关),简短版本,对于较新的内核,“暂停”不再起作用:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"
echo "auto" > "/sys/bus/usb/devices/usbX/power/control"
Run Code Online (Sandbox Code Playgroud)

但它并没有真正切断电源,它向设备发出关闭电源的信号,由设备来实施电源管理并做正确的事情。

您在内核的官方文档中有很多详细信息,其中解释了各种文件/sys/bus/usb/devices/.../power/以及如何管理设备和端口。

对于不是真正的 USB 设备的东西(你的 USB 灯是否出现在 lsusb 中?)你可能不走运,我已经尝试过使用 USB 灯和 GPS 记录器为电池充电并通过 USB 传输数据,显示作为 cp210x USB 转串口,也没有断电。我可以“断开”gpsecho '5-4.6' > /sys/bus/usb/drivers/usb/unbind并重新连接,echo '5-4.6' > /sys/bus/usb/drivers/usb/bind但电池充电灯始终亮着。

但似乎有些集线器做得很好