Desligando a energia para a porta usb. Ou desligue a energia para todo o subsistema usb

24

Eu tenho uma lâmpada USB que comprei especificamente para desligá-la programaticamente em um determinado momento, portanto, preciso remover a energia da porta USB.

Eu acredito que eu tenha um hub usb na usb6. A lâmpada está conectada a uma das portas neste hub:

#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

Veja o que tentei:

Duas soluções são aqui , a primeira sugere:

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

mas recebo write error: Invalid argument ao tentar gravar em /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

A segunda solução:

sudo bash -c 'echo 0 > /sys/bus/usb/devices/usb6/power/autosuspend_delay_ms; echo auto > /sys/bus/usb/devices/usb6/power/control'

que desliga a energia do dispositivo usb-hub.

Eu também estava tentando seguir this :

Mas a saída de lsusb -t apenas trava:

$lsusb -t
4-1:0.0: No such file or directory
4-1:0.1: No such file or directory
^C

O que me impede de usar esse método para obter a parte '2-1.1':

echo '2-1.1' > /sys/bus/usb/drivers/usb/unbind

Existe uma maneira alternativa de obter essa informação?

Alternativamente, existe uma maneira de desligar a energia de todo o subsistema usb? Algo como modprobe -r usb_etc ?

Meu kernel é:

$uname -r
3.2.0-4-amd64
    
por user84207 01.11.2014 / 21:51

2 respostas

17

Veja Controlando uma fonte de alimentação USB (ligado / desligado) com linux , versão curta, para novos kernels "suspend" não funciona mais:

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

Mas, literalmente, não corta a energia, sinaliza o dispositivo para desligar, cabe ao dispositivo implementar o gerenciamento de energia e fazer a coisa certa.

Você tem muitos detalhes na documentação oficial no kernel, lá Ele explica os vários arquivos em /sys/bus/usb/devices/.../power/ e como gerenciar os dispositivos e portas.

Para coisas que não são dispositivos usb reais (sua lâmpada usb aparece em lsusb?) você está sem sorte, eu tentei com uma lâmpada usb e com um logger gps que carrega sua bateria e transfere dados através de usb que aparece como um usb cp210x para serial, e também não faz poweroff. Eu posso "desconectar" o GPS com echo '5-4.6' > /sys/bus/usb/drivers/usb/unbind e reconectá-lo com echo '5-4.6' > /sys/bus/usb/drivers/usb/bind , mas a luz de carga da bateria está sempre ligada.

Mas parece que alguns hubs fazem isso corretamente .

    
por 07.11.2014 / 11:53
16

Você pode usar o uhubctl - utilitário de linha de comando para controlar a energia USB por porta de hubs USB compatíveis .

Funciona apenas em hubs que suportam comutação de energia por porta, mas note que muitas placas-mães modernas têm hubs USB que suportam esse recurso.

Para compilar:

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

Para listar o status de todos os hubs, suas localizações e portas que podem ser controladas pelo uhubctl:

uhubctl

Para desligar a energia na porta 5 do hub compatível único:

uhubctl -a 0 -p 5

Se você tiver mais de um hub compatível conectado, use -l para especificar o local do hub para controlá-lo:

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

Para ativar e desativar a energia:

uhubctl -a 2 -p 5

Note que os hubs USB 3.0 também são suportados e alguns novos hubs USB 3.0 funcionam bem.

Leia mais aqui .

Divulgação - Eu sou o autor do uhubctl.

    
por 08.11.2016 / 21:05