Tengo una lámpara USB que compré específicamente para apagarla mediante programación en un momento determinado, por lo que necesito desconectar la alimentación de su puerto USB.
Creo que tengo un concentrador usb en usb6. La lámpara está conectada a uno de los puertos de este concentrador:
#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
Esto es lo que he probado:
Aquí hay dos soluciones, la primera sugiere:
echo disabled > /sys/bus/usb/devices/usb1/power/wakeup
echo suspend > /sys/bus/usb/devices/usb1/power/level # turn off
pero obtengo write error: Invalid argument
al intentar escribir en /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
La segunda solución:
sudo bash -c 'echo 0 > /sys/bus/usb/devices/usb6/power/autosuspend_delay_ms; echo auto > /sys/bus/usb/devices/usb6/power/control'
que apaga el dispositivo de concentrador USB.
También estaba tratando de seguir esto:
Pero la salida de lsusb -t
simplemente cuelga:
$lsusb -t
4-1:0.0: No such file or directory
4-1:0.1: No such file or directory
^C
Lo que me impide usar este método para obtener la parte '2-1.1' de esto:
echo '2-1.1' > /sys/bus/usb/drivers/usb/unbind
¿Hay alguna forma alternativa de obtener esta información?
Alternativamente, ¿hay alguna forma de cortar la alimentación de todo el subsistema usb? Algo como modprobe -r usb_etc
?
Mi núcleo es:
$uname -r
3.2.0-4-amd64
Respuesta aceptada:
Podrías usar mi herramienta uhubctl – utilidad de línea de comandos para controlar la alimentación USB por puerto para concentradores USB compatibles.
Solo funciona en concentradores compatibles con la conmutación de alimentación por puerto, pero tenga en cuenta que muchas placas base modernas tienen concentradores USB compatibles con esta función.
Para compilar:
git clone https://github.com/mvp/uhubctl
cd uhubctl
make
Para instalar en todo el sistema como /usr/sbin/uhubctl
:
sudo make install
Para enumerar el estado de todos los concentradores, sus ubicaciones y puertos que pueden ser controlados por uhubctl:
sudo uhubctl
(puede evitar usar sudo
si configura los permisos USB de udev).
Para apagar el puerto 5 de un solo concentrador compatible:
sudo uhubctl -a 0 -p 5
Si tiene más de un concentrador compatible conectado, use -l
para especificar la ubicación del concentrador para controlarlo:
sudo uhubctl -a 0 -p 5 -l 3-1.2
Para alternar entre apagado y encendido:
sudo uhubctl -a 2 -p 5
Tenga en cuenta que los concentradores USB 3.0 también son compatibles, y bastantes nuevos concentradores USB 3.0 funcionan bien.
Lea más aquí.