Desligando a energia da porta USB. Ou desligue a energia do subsistema USB inteiro

28

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

Eu acredito que tenho um hub usb em 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

Aqui está o que eu tentei:

Duas soluções estã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 argumentao tentar escrever para /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 hub USB.

Eu também estava tentando seguir isso :

Mas a saída de lsusb -tapenas 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 essas informações?

Como alternativa, 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
user84207
fonte
que erros de sintaxe? nesse caso, não há necessidade de citar as seqüências simples 'suspend', 'disabled'. se você costuma citar, ótimo para você, mas nesse caso não é necessário.
user84207
Tentei rastrear a lsusb -tchamada e não encontrei nada útil dentro do tempo necessário para depurá-la. Sinceramente, não tenho tempo agora para encontrar bugs no lsub e nem consigo reproduzi-lo agora, então provavelmente depende dos dispositivos que estão conectados. Vou ter que esperar para chegar em casa e tentar reproduzi-lo.
user84207

Respostas:

20

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

Funciona apenas em hubs que suportam comutação de energia por porta, mas observe que muitas placas-mãe modernas possuem hubs USB que suportam esse recurso.

Compilar:

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

Para listar o status de todos os hubs, seus locais e portas que podem ser controlados pelo uhubctl:

uhubctl

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

uhubctl -a 0 -p 5

Se você tiver mais de um hub compatível conectado, use -lpara 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

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

Leia mais aqui .

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

mvp
fonte
Um pouco mais de informação seria bom. Especialmente porque você é o autor e não é um exemplo de pacote padrão de como usá-lo, e se houver algum recurso / limitação, risco, se houver, as respostas apenas ao Link não são preferidas.
Zachary Brady
2
Bem, copiar / colar todo o arquivo LEIA-ME não parece uma idéia brilhante para mim. Tem todas as ressalvas explicadas.
Mvp
Não, o leia-me inteiro seria excessivo. Como você pode usar o programa para resolver o problema colocado na pergunta. E se houver alguma advertência para esse caso de uso específico, não o aplicativo inteiro. Desculpe se eu não estava claro no meu primeiro comentário.
Zachary Brady
11
FYI: Esse método funciona para a família Renesas UPD720202 de controladores host PCIe-USB. :) Obrigado.
Wossname 16/02
Obrigado @Wossname. Você se importa de adicioná-lo como nova edição em github.com/mvp/uhubctl/issues ? Vou atualizar a lista de dispositivos suportados.
Mvp
20

Consulte Controlar uma fonte de alimentação USB (on / off) com linux , versão curta, para saber mais sobre 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 isso literalmente não reduz 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 do kernel. Lá, ele explica os vários arquivos /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ê pode ter azar, tentei usar uma lâmpada USB e um registrador GPS que carrega sua bateria e transfere dados através de USB que mostra up como um usb cp210x para serial, e nem poweroff. Eu posso "desconectar" o GPS echo '5-4.6' > /sys/bus/usb/drivers/usb/unbinde reconectá-lo comecho '5-4.6' > /sys/bus/usb/drivers/usb/bind mas a luz de carregamento da bateria está sempre ligada.

Mas parece que alguns hubs fazem isso corretamente .

Jorge Nerín
fonte
0

NÃO é necessário editar individualmente os arquivos " autosuspend_delay_ms ".

A suspensão automática de USB pode ser desativada GLOBALMENTE e PERSISTENTEMENTE com:

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

update-grub

systemctl reboot

Leva apenas alguns segundos para testar a correção proposta e validar sua 'correção.

Uma captura de tela anotada do Ubuntu 18.04 abaixo ilustra a modificação conforme descrito acima, que resulta na reinicialização do host com TODAS as configurações de suspensão automática de USB desabilitadas:

Demonstração do Ubuntu 18.04 desativando globalmente a suspensão automática de USB

F1Linux
fonte