Control de una fuente de alimentación USB (activar / desactivar) con Linux

164

¿Es posible encender / apagar las fuentes de alimentación de USB manualmente con Linux?

Existe este ventilador de enfriamiento USB externo (del tipo que usa para enfriarse, no la PC), y sería bueno poder controlarlo desde el terminal, porque quiero colocar el ventilador en algún lugar lejos.

Supongo que esto también podría ser útil para una variedad de otras cosas, porque hay muchos juguetes USB por ahí. Tal vez purificadores de aire, etc. (Escuché que realmente no funcionan).

kamziro
fuente
9
Permítanme recapitular para Linux> = 2.6.38: el archivo power/level está en desuso ahora; utilizar power/control en su lugar . ( power/wakeupestá bien.) Además, solo acepta "auto" y "on", no "suspender" más. "auto" es lo suficientemente inteligente, y si la alimentación no se apaga mientras está inactiva, es culpa del dispositivo. De todos modos, no puede apagar la alimentación manualmente. Para obtener más información, consulte la respuesta a continuación de tlwhitec y el documento del kernel: kernel.org/doc/Documentation/usb/power-management.txt
teika kazura
Posible duplicado de stackoverflow.com/q/1163824/1967396
Floris
2
Esta característica realmente merece una buena GUI
mikebabcock
¿Requiere algún hardware especial? No está del todo claro por las respuestas,
Vojtěch Dohnal

Respuestas:

63

Nota. La información en esta respuesta es relevante para los núcleos más antiguos (hasta 2.6.32). Consulte la respuesta de tlwhitec para obtener información sobre los núcleos más nuevos.

# disable external wake-up; do this only once
echo disabled > /sys/bus/usb/devices/usb1/power/wakeup 

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

(Puede que necesite cambiar usb1 a usb n )

Fuente: Documentation / usb / power-management.txt.gz

Roman Cheplyaka
fuente
1
Whoa, gracias por eso. Estaba pensando que tenía que pasar por libUSB sin importar qué. ¿Alguna idea de cómo obtener los nombres de los dispositivos conectados también?
kamziro
Según esta publicación, ¿sin hardware especial no es posible? blog.andrew.net.au/2009/01/17
NoBugs
77
¡Recibo un error de permiso denegado incluso si uso sudo!
Wally
3
mismo por mí "permiso denegado" incluso después de usar sudo
Raulp
2
El permiso se deniega porque un comando en forma de sudo foo > barse analiza como directo a la salida y barluego se ejecuta foousandosudo . La redirección falla porque ocurre antes de obtener acceso de root. La solución es usar sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup', y así sucesivamente: obtener root, ejecutar un nuevo infierno para realizar una redirección, luego generar algo en el descriptor de archivo redirigido.
Excavar
60

Según los documentos , hubo varios cambios en la administración de energía USB desde los núcleos 2.6.32 , que parecen establecerse en 2.6.38 . Ahora tendrá que esperar a que el dispositivo quede inactivo , que se rige por el controlador del dispositivo en particular. El controlador debe admitirlo; de lo contrario, el dispositivo nunca alcanzará este estado. Desafortunadamente, ahora el usuario no tiene oportunidad de forzar esto. Sin embargo, si tienes suerte y tu dispositivo puede estar inactivo, entonces para apagar esto necesitas:

echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend"
echo "auto" > "/sys/bus/usb/devices/usbX/power/level"

o, para núcleos alrededor de 2.6.38 y superiores:

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

Esto significa literalmente, suspender en el momento en que el dispositivo queda inactivo.

Entonces, a menos que su ventilador sea algo "inteligente" que pueda ser visto como un dispositivo y controlado por un controlador, probablemente no tendrá mucha suerte en los núcleos actuales.

tlwhitec
fuente
Parece que esto hará que el dispositivo USB se apague continuamente ... (?) ¿Cómo debería reanudar la alimentación después de que esto funcionó? Mi objetivo es reiniciar el dispositivo una vez, no cambiar permanentemente su configuración de suspensión.
matanster
44
Para reanudar un dispositivo suspendido, puede volver a deshabilitar el "autosuspend" con echo "on" > "/sys/bus/usb/devices/usbX/power/control", pero creo que necesita comprender el propósito original. La función de suspensión automática está aquí simplemente para permitir que los dispositivos inactivos entren en un estado de baja potencia (donde podría parecer apagado), solo para que se reanude más tarde cuando sea necesario, ya sea por el host o algún evento externo. Eso sucede (o debería suceder) automáticamente. El puerto en sí nunca está realmente apagado. Realmente, lea los documentos ;)
tlwhitec
44
Puedo confirmar que funciona con núcleos> 3.10. Sólo tienes que estar seguro de que el dispositivo "id" que está utilizando es correcta: dmesg | grep "usb"y utilizar el número después de "USB", por ejemplo: usb 2-4.4: SerialNumber: A0848020que va a utilizar: /sys/bus/usb/devices/2-4.4/power/.... Además, asegúrese de que el dispositivo no esté en uso. Creé un script para simplificar este proceso
lepe
¿Hay alguna forma de guardar esta configuración para que cada vez que se conecte no cambie a los valores predeterminados? Tengo un dispositivo que necesito para configurar el control de energía en "encendido" para que se cargue.
quickblueblur
@quickblueblur me suena como una regla de udev .
tlwhitec
24

He encontrado estas soluciones que al menos funcionan para el chip de hub USB Terminus FE 1.1 configurado correctamente:

1.Para apagar todos los puertos USB de un concentrador, puede desvincular el concentrador del núcleo utilizando:

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/unbind

para volver a encender la alimentación, puede volver a vincularla usando

echo "1-4.4.4" > /sys/bus/usb/drivers/usb/bind

2.Cambiar la potencia en cada puerto individualmente es más complicado: pude usar el concentrador para controlar cada puerto, pero viene con un inconveniente: el concentrador desconecta primero los usbdevfs, lo que hace que todos los dispositivos USB se desconecten del sistema, al menos en ubuntu :

usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);

Con esto ioctldesactivado, pude apagar la alimentación del puerto individual sin desconectar todos los dispositivos, pero la energía vuelve a encenderse inmediatamente (probablemente debido a que el kernel vio un dispositivo no inicializado) lo que hace que el dispositivo USB solo haga un "reinicio en frío", que es lo que En general quería hacer. Mi parche de poder está aquí

abuelo
fuente
Se confirma que las entradas de vinculación / desvinculación funcionan en Linux kernel 2.6.34, el chipset ICH8 y Ubuntu 10.04.
user1357196
55
vincular / desvincular no apaga el puerto USB independientemente del conjunto de chips. El dispositivo todavía recibe energía ...
themihai
1
el láser del mouse está apagado, el teclado no puede escribir, el módem deja de parpadear - todo bien en mi plataforma
eri
24

PowerTOP de Intel le permite alternar dispositivos como periféricos usb en tiempo real. Estos se llaman 'sintonizables'.

sudo apt install powertop
sudo powertop
  • Pestaña a 'tunables'.
  • Desplácese hacia abajo a su dispositivo.
  • Presione enter para alternar el modo de ahorro de energía ( Bueno / Malo )

ingrese la descripción de la imagen aquí

Tenga en cuenta que Malo significa que el dispositivo siempre está encendido. Cambiando a bueno cambiar se apagará el dispositivo después del tiempo de ahorro inactivo predeterminado (el valor predeterminado es 2000 ms).

Consulte los documentos de PowerTOP para obtener detalles sobre cómo hacer que estos cambios sean permanentes.
Genera los scripts de configuración para usted (más o menos como lo describen otros carteles en este hilo).

NOTA: Estas secuencias de comandos no afectan la alimentación del pin USB (que siempre está activado).
Estos solo envían el protocolo del controlador para activar y desactivar un dispositivo.

Si desea controlar la alimentación del pin, puede usar un concentrador USB inteligente compatible o, mejor aún, un microcontrolador .

Dominic Cerisano
fuente
2
¡Increíble! : DI creo que esta es la forma más fácil de hacerlo (aunque en un nivel bajo realiza las mismas operaciones que se describen en las otras respuestas). Gracias, y que su respuesta llegue a la cima;)
Matyas
1
Gracias por tu respuesta. ¿Dónde debo comenzar a cavar para cambiar el tiempo de ahorro inactivo predeterminado?
mikezter
Como se mencionó en pósters anteriores, los documentos del kernel están aquí: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano
10

Puede usar mi herramienta uhubctl para controlar la alimentación USB por puerto para concentradores USB compatibles.

mvp
fuente
es una buena herramienta en osx, pero no encuentra ningún 'centro inteligente compatible' en debian para mí.
jitter
1
En Linux, debe ejecutarlo como root (en sudo) o configurar los permisos del dispositivo udev. También es posible que su host Linux no tenga hubs compatibles conectados.
mvp
es un 'beagle bone green' por cierto.
jitter
5
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

funciona para ubuntu

usuario3527264
fuente
1
LA SUYA ES LA ÚNICA SOLUCIÓN QUE TRABAJÓ EN MI CASO. Estoy usando un acer make laptop 12.04LTS Ubuntu.
RicoRicochet
1
No apaga el dispositivo, solo lo elimina de la lista de dispositivos. ¿Cómo puedo apagar el puerto USB?
rustyx
1
Esta también es la única solución que me funcionó para apagar una tableta Wacom Intuos5 touch M sin desconectarla (en Fedora 28)
user1738984
2

La alimentación USB 5v siempre está encendida (incluso cuando la computadora está apagada, en algunas computadoras y en algunos puertos). Probablemente necesite programar un Arduino con algún tipo de interruptor y controlarlo a través de la biblioteca en serie desde el USB conectado al computadora.

En otras palabras, una combinación de este tutorial de cambio y este tutorial sobre la comunicación a través de Serial libary a Arduino conectado a través de USB.

NoBugs
fuente
2

La razón por la cual la gente publica preguntas como esta se debe a la temida " EVIL " - USB "Auto-Suspend" feature ".

La suspensión automática reduce la potencia de un dispositivo USB "inactivo" y, a menos que el controlador del dispositivo admita esta función correctamente, el dispositivo puede volverse no contactable. Por lo tanto, encender / apagar un puerto USB es un síntoma del problema, no el problema en sí mismo.

Te mostraré cómo GLOBALMENTE deshabilitar la suspensión automática, negando la necesidad de activar y desactivar manualmente los puertos USB:

Respuesta corta:

NO necesita editar " autosuspend_delay_ms " individualmente: la suspensión automática de USB puede deshabilitarse global y PERSISTENTEMENTE usando los siguientes comandos:

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

update-grub

systemctl reboot

Una captura de pantalla de Ubuntu 18.04 sigue al final de la "Respuesta larga" que ilustra cómo se lograron mis resultados.

Respuesta larga:

Es cierto que la documentación del kernel de administración de energía USB indica que la suspensión automática se debe dejar de usar y en su lugar " autosuspend_delay_ms " se usa para desactivar la suspensión automática de USB:

"In 2.6.38 the "autosuspend" file will be deprecated
and replaced by the "autosuspend_delay_ms" file."

SIN EMBARGO, mis pruebas revelan que la configuración usbcore.autosuspend=-1en / etc / default / grub, como se muestra a continuación, se puede usar como una palanca GLOBAL para la funcionalidad de autosuspend USB; NO es necesario editar " autosuspend_delay_ms " individuales archivos ".

El mismo documento vinculado anteriormente establece que un valor de "0" está HABILITADO y un valor negativo está DESHABILITADO :

power/autosuspend_delay_ms

    <snip> 0 means to autosuspend
    as soon as the device becomes idle, and negative
    values mean never to autosuspend.  You can write a
    number to the file to change the autosuspend
    idle-delay time.

En la captura de pantalla de Ubuntu 18.04 anotada a continuación que ilustra cómo se lograron mis resultados (y reproducibles), observe que el valor predeterminado es "0" ( habilitado ) en autosuspend_delay_ms .

Luego, tenga en cuenta que después de SOLO configurar usbcore.autosuspend=-1en Grub, estos valores ahora son negativos ( deshabilitados ) después del reinicio. Esto me ahorrará la molestia de editar valores individuales y ahora puede deshabilitar la secuencia de comandos para desactivar la suspensión automática de USB.

captura de pantalla: valores de suspensión automática Antes y después de la edición global

Espero que esto haga que deshabilitar la suspensión automática de USB sea un poco más fácil y más programable.

F1Linux
fuente
1

Tuve un problema al conectar mi teléfono Android, no pude cargarlo porque el interruptor de encendido se encendió y luego se apagó ... PowerTop me permitió encontrar esta configuración y fue útil para solucionar el problema (el valor automático estaba causando problemas):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
Mundo maravilloso
fuente