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

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

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

我相信我有一个 USB 集线器 USB6。灯连接到该集线器中的端口之一:

#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

答案1

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

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

首先,您的操作系统可能已经在软件包存储库中包含 uhubctl,请参阅自述文件了解如何安装它,但请确保您使用最新版本(撰写本文时为 2.4.0)。

如果您的操作系统没有此软件包的最新版本,您可以按如下方式从源安装它:

编译:

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

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

sudo make install

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

sudo uhubctl

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

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

sudo uhubctl -a 0 -p 5

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

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

要关闭然后再打开电源:

sudo uhubctl -a 2 -p 5

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

更多这里

答案2

使用 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但电池充电指示灯始终亮起。

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

相关内容