我有一个 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
但电池充电指示灯始终亮起。
但似乎一些集线器做得很好。