Controlar una fuente de alimentación USB (on / off) con linux


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

Hay un ventilador externo USB (del tipo que se usa para enfriarse, no para el 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, así, porque hay un montón de juguetes USB por ahí. Tal vez purificadores de aire, etc (escuché que realmente no funcionan aunque).

 139
Author: kamziro, 2011-01-16

9 answers

Nota. La información en esta respuesta es relevante para los núcleos más antiguos (hasta 2.6.32). Vea la respuesta de tlwhitec para la 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

(Es posible que deba cambiar usb1 a usb n)

Fuente: Documentación/usb/power-management.txt.gz

 58
Author: Roman Cheplyaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-06 14:08:45

De acuerdo con la docs, hubo varios cambios en la administración de energía USB de los núcleos 2.6.32, que parecen asentarse en 2.6.38. Ahora tendrá que esperar a que el dispositivo se convierta en idle, que se rige por el controlador de dispositivo en particular. El controlador debe admitirlo, de lo contrario el dispositivo nunca alcanzará este estado. Por desgracia, ahora el usuario no tiene la oportunidad de forzar esto. Sin embargo, si tienes suerte y tu dispositivo puede quedar inactivo, entonces para apague esto necesita:

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, ir suspender en el momento en que el dispositivo se vuelve inactivo.

Así que 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 con los núcleos actuales.

 53
Author: tlwhitec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-01 14:56:16

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

1.To apague todos los puertos USB de un concentrador, puede desvincular el concentrador del kernel usando:

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

Para volver a encender la energía-puede atarla de nuevo usando

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

2.La conmutación de energía en cada puerto individualmente es más complicada: pude usar hubpower para controlar cada puerto , pero viene con un inconveniente: hubpower primero desconecta los usbdevfs que causan todos los dispositivos USB para desconectar del sistema, al menos en ubuntu:

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

Con este ioctl deshabilitado, pude apagar la alimentación del puerto individual sin desconectar todos los dispositivos, pero la alimentación se vuelve a encender inmediatamente (probablemente debido a que el núcleo vio un dispositivo no iniciado), lo que hace que el dispositivo USB solo haga un "reinicio en frío" que es lo que generalmente quería hacer. Mi hubpower parcheado está aquí

 21
Author: grandrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-07 08:12:33

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

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

introduzca la descripción de la imagen aquí

Tenga en cuenta que Bad significa que el dispositivo está siempre encendido. Cambiar a Bueno apagará el dispositivo después del tiempo de ahorro inactivo preestablecido (predeterminado es 2000ms).

Consulte los documentos 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 se describe en otros posters en este hilo).

NOTA: Estos scripts no afectan la alimentación del pin USB (que siempre está encendida).
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.

 17
Author: Dominic Cerisano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-27 22:41:12

Quería hacer esto, y con mi hardware USB no pude. Escribí una manera hacky cómo hacerlo aquí: http://pintant.cat/2012/05/12/power-off-usb-device / . En resumen: Usé un relé USB para abrir / cerrar el Vc de otro cable USB...

 7
Author: Carles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-20 10:25:10

Podrías usar uhubctl - utilidad de línea de comandos para controlar la alimentación USB por puerto para concentradores USB compatibles.

Divulgación - Soy el autor de uhubctl.

 7
Author: mvp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-20 03:58:30
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

Funciona para ubuntu

 5
Author: user3527264,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-12 17:05:34

La alimentación USB de 5v está siempre encendida (incluso cuando el equipo está apagado, en algunos equipos y en algunos puertos.) Probablemente necesitará programar un Arduino con algún tipo de interruptor, y controlarlo a través de la biblioteca Serie desde USB conectado a la computadora.

En otras palabras, una combinación de this switch tutorial y this tutorial sobre la comunicación a través de Libary Serial a Arduino conectado a través de USB.

 2
Author: NoBugs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-24 02:55:56

Tuve un problema al conectar mi teléfono Android, no pude cargar mi teléfono porque el interruptor de encendido y luego apagado ... PowerTOP me dejó encontrar esta configuración y fue útil para solucionar el problema (el valor automático estaba causando el problema):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
 0
Author: WonderLand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-17 08:51:42