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


28

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

我相信我在usb6有一个usb-hub。灯泡连接到此集线器中的端口之一:

#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

这是我尝试过的:

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

echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 
echo suspend > /sys/bus/usb/devices/usb1/power/level  # turn off

但是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

第二种解决方案:

sudo bash -c 'echo 0 > /sys/bus/usb/devices/usb6/power/autosuspend_delay_ms; echo auto > /sys/bus/usb/devices/usb6/power/control'

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

我也试图遵循

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

$lsusb -t
4-1:0.0: No such file or directory
4-1:0.1: No such file or directory
^C

这使我无法使用此方法来获得“ 2-1.1”部分:

echo '2-1.1' > /sys/bus/usb/drivers/usb/unbind

是否有获取此信息的替代方法?

或者,是否有办法切断整个USB子系统的电源?像modprobe -r usb_etc什么?

我的内核是:

$uname -r
3.2.0-4-amd64

什么语法错误?在这种情况下,无需引用简单的字符串“ suspend”,“ disabled”。如果您习惯于报价,这对您很有帮助,但是在这种情况下,则不需要。
user84207 2014年

我尝试跟踪该lsusb -t调用,但在必须调试的时间内没有发现任何有用的信息。老实说,我现在没有时间在lsub中发现错误,而且我现在甚至无法重现它,因此,这可能取决于所插入的设备。我必须等待回家才能尝试复制它。
user84207 2014年

Answers:


20

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

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

编译:

git clone https://github.com/mvp/uhubctl
cd uhubctl
make

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

uhubctl

要关闭单个兼容集线器的端口5的电源,请执行以下操作:

uhubctl -a 0 -p 5

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

uhubctl -a 0 -p 5 -l 3-1.2

要先关闭电源再打开:

uhubctl -a 2 -p 5

请注意,还支持USB 3.0集线器,并且实际上有许多新的USB 3.0集线器可以正常工作。

在这里阅读更多

披露-我是uhubctl的作者。


多一点信息将是很好的。尤其是因为您是作者,并且不是使用它的标准软件包示例,如果它具有任何功能/限制,如果存在任何风险,则不推荐仅链接的答案。
Zachary Brady

2
好吧,对我而言,复制/粘贴整个自述文件似乎不是一个好主意。它有所有警告说明。
mvp

不,整个自述文件将过多。以及如何使用该程序来解决问题中提出的问题。而且,如果对该特定用例有任何警告,请注意整个应用程序。抱歉,如果我在第一条评论中不清楚。
Zachary Brady

1
仅供参考:此方法适用于瑞萨的UPD720202系列PCIe-USB主机控制器。:) 谢谢。
Wossname

谢谢@Wossname。您介意在github.com/mvp/uhubctl/issues中将其添加为新问题吗?我将更新支持的设备列表。
mvp

20

有关较新的内核“ suspend”不再起作用的信息,请参见使用linux(简短版本)控制USB电源(开/关)

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend_delay_ms"
echo "auto" > "/sys/bus/usb/devices/usbX/power/control"

但是它并没有真正切断电源,而是指示设备断电,这取决于设备实施电源管理并执行正确的操作。

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

对于不是真正的USB设备的事情(您的usb灯是否显示在lsusb中?),您的运气太差了,我已经尝试过使用usb灯和gps记录器为自己充电,并通过显示数据的usb传输数据用作cp210x usb到串行设备,关闭电源也不行。我可以“断开” gps的echo '5-4.6' > /sys/bus/usb/drivers/usb/unbind连接,然后重新连接,echo '5-4.6' > /sys/bus/usb/drivers/usb/bind但是电池充电指示灯始终亮着。

但是,似乎某些集线器可以正确执行此操作


0

它是不是需要单独编辑“ autosuspend_delay_ms ”文件。

USB autosuspend可以禁用GLOBALLY坚持用:

sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&usbcore.autosuspend=-1 /' /etc/default/grub

update-grub

systemctl reboot

仅需几秒钟即可测试建议的修复程序并验证其正确性。

下面的带注释的Ubuntu 18.04屏幕截图说明了如何按上述说明进行修改,从而导致主机在禁用所有 USB自动暂停设置的情况下重启:

Ubuntu 18.04演示在全球禁用USB自动挂起

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.