Apagar la alimentación al puerto usb. O apague la alimentación de todo el subsistema usb

28

Tengo una lámpara usb que compré específicamente para apagarla mediante programación en un momento determinado, por lo que necesito quitar la alimentación de su puerto usb.

Creo que tengo un usb-hub en usb6. La lámpara está conectada a uno de los puertos en 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 intentado:

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 write error: Invalid argumentcuando intento escribir a /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 usb-hub.

También estaba tratando de seguir esto :

Pero la salida de lsusb -tsimplemente se 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' para 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 desconectar 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
user84207
fuente
¿Qué errores de sintaxis? en este caso, no es necesario citar las cadenas simples 'suspender', 'deshabilitado'. si tiene el hábito de citar, excelente para usted, pero en este caso no es necesario.
user84207
Traté de desviar la lsusb -tllamada y no encontré nada útil en el tiempo que tuve que depurarla. Sinceramente, no tengo tiempo en este momento para encontrar errores en lsub, y ni siquiera puedo reproducirlo en este momento, por lo que probablemente dependa de los dispositivos que estén conectados. Tendré que esperar para llegar a casa para intentar reproducirlo
user84207

Respuestas:

20

Puede usar la utilidad de línea de comando uhubctl para controlar la alimentación USB por puerto para concentradores USB compatibles.

Funciona solo en concentradores que admiten conmutación de alimentación por puerto, pero tenga en cuenta que muchas placas base modernas tienen concentradores USB que admiten esta función.

Compilar:

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

Para enumerar el estado de todos los concentradores, sus ubicaciones y puertos que puede controlar uhubctl:

uhubctl

Para apagar el puerto 5 del concentrador único compatible:

uhubctl -a 0 -p 5

Si tiene más de un concentrador compatible conectado, use -lpara especificar la ubicación del concentrador para controlarlo:

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

Para apagar y encender:

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 realmente funcionan bien.

Lee más aquí .

Divulgación: soy el autor de uhubctl.

mvp
fuente
Un poco más de información sería bueno. Especialmente porque usted es el autor y no es un paquete estándar de ejemplos de cómo usarlo, qué ocurre si tiene capacidades / limitaciones, riesgos si los hay, no se prefieren las respuestas de solo enlace.
Zachary Brady
2
Bueno, copiar / pegar todo el archivo README no me parece una idea brillante. Tiene todas las advertencias explicadas.
mvp
No, todo el archivo Léame sería excesivo. Cómo puede usar el programa para resolver el problema planteado en la pregunta. Y si hay algunas advertencias para ese caso de uso en particular, no toda la aplicación. Lo siento si no estaba claro en mi primer comentario.
Zachary Brady
1
FYI: Este método funciona para la familia de controladores de host PCIe-USB Renesas UPD720202. :) Gracias.
Wossname
Gracias @Wossname. ¿Te importaría agregarlo como un nuevo número en github.com/mvp/uhubctl/issues ? Actualizaré la lista de dispositivos compatibles.
mvp
20

Consulte Control de una fuente de alimentación USB (activar / desactivar) con Linux , versión corta, para los núcleos más nuevos "suspender" ya no funciona:

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

Pero literalmente no corta la energía, indica al dispositivo que se apague, depende del dispositivo implementar la administración de energía y hacer lo correcto.

Tiene muchos detalles en la documentación oficial en el núcleo, allí explica los diversos archivos /sys/bus/usb/devices/.../power/y cómo administrar los dispositivos y puertos.

Para cosas que no son dispositivos usb reales (¿su lámpara usb se muestra en lsusb?) Usted no tiene suerte, lo he probado con una lámpara usb y con un registrador gps que carga su batería y transfiere datos a través de usb que muestra como un usb cp210x a serie, y tampoco lo hace el apagado. Puedo "desconectar" el GPS echo '5-4.6' > /sys/bus/usb/drivers/usb/unbindy volver a conectarlo, echo '5-4.6' > /sys/bus/usb/drivers/usb/bindpero la luz de carga de la batería siempre está encendida.

Pero parece que algunos centros lo hacen correctamente .

Jorge Nerín
fuente
0

NO es necesario editar individualmente los archivos " autosuspend_delay_ms ".

La suspensión automática de USB se puede deshabilitar GLOBALMENTE y PERSISTENTEMENTE con:

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

update-grub

systemctl reboot

Toma solo unos segundos probar la solución propuesta y validar su corrección.

Una captura de pantalla anotada de Ubuntu 18.04 a continuación ilustra la modificación como se describió anteriormente, lo que resulta en el reinicio del host con TODAS las configuraciones de suspensión automática de USB deshabilitadas:

La demostración de Ubuntu 18.04 deshabilita globalmente la suspensión automática de USB

F1Linux
fuente