Controlando uma fonte de alimentação USB (on / off) com Linux

164

É possível ligar / desligar as fontes de alimentação do USB manualmente com o Linux?

Existe essa ventoinha de refrigeração USB externa (do tipo que você usa para se refrescar, não o PC), e seria bom poder controlá-la a partir do terminal, porque quero posicionar a ventoinha em algum lugar distante.

Suponho que isso também possa ser útil para uma variedade de outras coisas, porque há muitos brinquedos USB por aí. Talvez purificadores de ar, etc. (ouvi dizer que eles realmente não funcionam).

kamziro
fonte
9
Deixe-me recapitular para Linux> = 2.6.38: O arquivo power/level está obsoleto agora; use em power/control vez disso . ( power/wakeupestá ok.) Além disso, ele aceita apenas "auto" e "on", não "suspende" mais. "auto" é inteligente o suficiente e, se a energia não for desligada enquanto estiver ociosa, a culpa é do dispositivo. De qualquer forma, você não pode desligar manualmente. Para mais, veja a resposta abaixo por tlwhitec e doc do kernel: kernel.org/doc/Documentation/usb/power-management.txt
Teika Kazura
Possível duplicata do stackoverflow.com/q/1163824/1967396
Floris
2
Este recurso realmente merece uma boa GUI
mikebabcock
Requer algum hardware especial? Não é muito claro a partir de respostas,
Vojtěch Dohnal

Respostas:

63

Nota. As informações nesta resposta são relevantes para os kernels mais antigos (até 2.6.32). Veja a resposta de tlwhitec para obter informações sobre os kernels mais recentes.

# 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

(Pode ser necessário alterar usb1 para usb n )

Fonte: Documentação / usb / power-management.txt.gz

Roman Cheplyaka
fonte
1
Whoa, obrigado por isso. Eu estava pensando que tinha que passar pelo libUSB, não importa o quê. Alguma idéia de como obter os nomes dos dispositivos conectados também?
kamziro
De acordo com este post, sem hardware especial, não é possível? blog.andrew.net.au/2009/01/17
NoBugs
7
Estou recebendo erro de permissão negada, mesmo se eu usar o sudo!
Wally
3
mesmo por mim "permissão negada", mesmo depois de usar sudo
Raulp
2
A permissão é negada porque um comando no formato de sudo foo > baré analisado como direciona a saída para bar, em seguida, execute foousandosudo . O redirecionamento falha porque acontece antes de você obter acesso root. A solução é usar sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup', e assim por diante: obter raiz, executar um novo inferno para executar um redirecionamento e, em seguida, gerar algo no descritor de arquivo redirecionado.
dig
60

De acordo com documentos , houve várias alterações no gerenciamento de energia USB dos kernels 2.6.32 , que parecem se estabelecer em 2.6.38 . Agora você precisará aguardar o dispositivo ficar ocioso , que é controlado pelo driver de dispositivo específico. O driver precisa suportá-lo, caso contrário, o dispositivo nunca chegará a esse estado. Infelizmente, agora o usuário não tem chance de forçar isso. No entanto, se você tiver sorte e seu dispositivo ficar inativo, para desativar isso, você deve:

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

ou, para kernels em torno de 2.6.38 e superior:

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

Isso significa literalmente, suspenda no momento em que o dispositivo ficar inativo.

Portanto, a menos que seu ventilador seja algo "inteligente" que possa ser visto como um dispositivo e controlado por um motorista, você provavelmente não terá muita sorte nos kernels atuais.

tlwhitec
fonte
Parece que isso fará com que o dispositivo USB seja desligado continuamente ... (?) Como a energia deve ser reiniciada por mim depois que isso funcionou? Meu objetivo é reiniciar o dispositivo uma vez, não alterar permanentemente sua configuração de suspensão.
matanster
4
Para retomar um dispositivo suspenso, você pode desativar novamente a "suspensão automática" com echo "on" > "/sys/bus/usb/devices/usbX/power/control", mas acho que você precisa entender o objetivo original. O recurso de suspensão automática está aqui apenas para permitir que os dispositivos inativos entrem em um estado de baixa energia (onde pode parecer desligado), apenas para serem retomados mais tarde, quando necessário, pelo host ou por algum evento externo. Isso acontece (ou deveria acontecer) automaticamente. A porta em si nunca é realmente desligada. Realmente, não ler os docs ;)
tlwhitec
4
Posso confirmar que funciona com kernels> 3.10. Só tenho que ter certeza de que o dispositivo "id" você está usando está correto: dmesg | grep "usb"e usar o número depois de "USB", por exemplo: usb 2-4.4: SerialNumber: A0848020você vai usar: /sys/bus/usb/devices/2-4.4/power/.... Além disso, verifique se o dispositivo não está em uso. Eu criei um script para simplificar este processo
Lepe
Existe uma maneira de salvar essa configuração para que, toda vez que for conectado, ela não retorne aos padrões? Eu tenho um dispositivo no qual preciso definir o controle de energia como "ligado" para que ele seja carregado.
quickblueblur 30/01/19
@quickblueblur parece uma regra do udev para mim.
tlwhitec 31/01/19
24

Encontrei estas soluções que funcionam pelo menos para o chip hub Terminus FE 1.1 USB configurado corretamente:

1.Para desligar todas as portas USB de um hub, você pode desvincular o hub do kernel usando:

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

para ligar novamente - você pode ligá-lo novamente usando

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

2.Alterar o poder de cada porta individualmente é mais complicado: eu era capaz de usar o poder do hub para controlar cada porta - mas ele tem uma desvantagem: o poder do hub primeiro desconecta o usbdevfs, o que faz com que todos os dispositivos USB se desconectem do sistema, pelo menos no ubuntu :

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

Com isso ioctldesativado, eu era capaz de desligar a energia de portas individuais sem desconectar todos os dispositivos - mas a energia é ligada imediatamente (provavelmente devido ao kernel que vê um dispositivo não inicializado), o que faz com que o dispositivo USB faça uma "reinicialização a frio", que é o que eu geralmente queria fazer. Meu hubpower remendado está aqui

bisavô
fonte
As entradas bind / unbind estão confirmadas para funcionar no kernel Linux 2.6.34, no chipset ICH8 e no Ubuntu 10.04.
user1357196
5
ligar / desligar não desliga a porta USB, independentemente do chipset. O dispositivo ainda recebe energia ...
themihai
1
Laser Mouse está desligado, teclado tipo cant, modem pára de piscar - tudo de bom na minha plataforma
eri
24

O PowerTOP da Intel permite alternar dispositivos como periféricos USB em tempo real. Estes são chamados de 'ajustáveis'.

sudo apt install powertop
sudo powertop
  • Passe o mouse para 'tunables'.
  • Role para baixo até o seu dispositivo.
  • Pressione Enter para alternar para o modo de economia de energia ( Bom / Ruim )

insira a descrição da imagem aqui

Observe que Bad significa que o dispositivo está sempre ligado. Alternando para Bom desligará o dispositivo após o tempo de economia inativo predefinido (o padrão é 2000ms).

Consulte os documentos do PowerTOP para obter detalhes sobre como tornar essas alterações permanentes.
Ele gera os scripts de configuração para você (praticamente como descrito por outros pôsteres neste tópico).

NOTA: Esses scripts não afetam a alimentação do pino USB (que está sempre ativado).
Eles enviam apenas o protocolo do driver para ativar e desativar um dispositivo.

Se você deseja controlar a energia dos pinos, pode usar um hub USB inteligente compatível ou, melhor ainda, um microcontrolador .

Dominic Cerisano
fonte
2
Impressionante! : DI acho que esta é a maneira mais amigável de fazer isso (embora em nível baixo faça as mesmas operações descritas nas outras respostas.) Obrigado e que sua resposta chegue ao topo;)
Matyas
1
Obrigado pela sua resposta. Onde preciso começar a cavar para alterar o tempo de economia inativo predefinido?
Mikezter
Como mencionado por anterior cartazes, documentos do kernel está aqui: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano
10

Você pode usar minha ferramenta uhubctl para controlar a energia USB por porta para hubs USB compatíveis.

mvp
fonte
ferramenta fina no osx, mas não encontra nenhum 'hub inteligente suportado' no debian para mim.
jitter
1
No Linux, você precisa executá-lo como root (em sudo) ou configurar as permissões do dispositivo udev. Também é possível que seu host Linux não tenha hubs compatíveis conectados.
Mvp
é um 'beagle bone green' entre.
Jitter
7

Eu queria fazer isso e, com o meu hardware USB, não consegui. Eu escrevi uma maneira hacky como fazê-lo aqui:

http://pintant.cat/2012/05/12/power-off-usb-device/ .

De uma forma resumida: usei um relé USB para abrir / fechar o V CC de outro cabo USB ...

Carles
fonte
5
echo '2-1' |sudo tee /sys/bus/usb/drivers/usb/unbind

trabalha para ubuntu

user3527264
fonte
1
A SUA É A ÚNICA SOLUÇÃO QUE FUNCIONOU NO MEU CASO. Eu estou usando um acer make laptop 12.04LTS Ubuntu.
RicoRicochet
1
Não desliga o dispositivo, apenas o remove da lista de dispositivos. Como desligar a porta USB?
Rustyx
1
Esta é também a única solução que funcionou para mim para desligar um toque M tablet Wacom Intuos5 sem desconectá-lo (no Fedora 28)
user1738984
2

A energia USB 5v está sempre ligada (mesmo quando o computador está desligado, em alguns computadores e em algumas portas). Você provavelmente precisará programar um Arduino com algum tipo de comutador e controlá-lo através da biblioteca Serial da USB conectada ao computador.

Em outras palavras, uma combinação deste tutorial de chave e deste tutorial sobre comunicação via biblioteca serial ao Arduino é conectada via USB.

NoBugs
fonte
2

A razão pela qual as pessoas postam perguntas como essa deve-se ao temido - de fato " EVIL " - recurso "Suspensão automática de USB ".

A suspensão automática reduz a energia de um dispositivo USB "inativo" e, a menos que o driver do dispositivo ofereça suporte a esse recurso corretamente, o dispositivo pode ficar incontestável. Portanto, ligar / desligar uma porta USB é um sintoma do problema, não o problema em si.

Vou mostrar-lhe como desativar GLOBALMENTE a suspensão automática, negando a necessidade de ativar e desativar manualmente as portas USB:

Resposta curta:

NÃO é necessário editar " autosuspend_delay_ms " individualmente: o USB autosuspend pode ser desativado globalmente e PERSISTENTEMENTE usando os seguintes comandos:

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

update-grub

systemctl reboot

Uma captura de tela do Ubuntu 18.04 segue no final da "Resposta longa", ilustrando como meus resultados foram alcançados.

Resposta longa:

É verdade que a documentação do kernel do USB Power Management declara suspensão automática e está em seu lugar " autosuspend_delay_ms " usado para desativar a suspensão automática USB:

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

No entanto, meus testes revelam que a configuração usbcore.autosuspend=-1em / etc / default / grub como abaixo pode ser usada como uma alternância GLOBAL para a funcionalidade de suspensão automática de USB - você NÃO precisa editar " autosuspend_delay_ms " individual arquivos " .

O mesmo documento vinculado acima afirma que um valor de "0" é ATIVADO e um valor negativo é DESATIVADO :

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.

Na captura de tela anotada do Ubuntu 18.04 abaixo, ilustrando como meus resultados foram alcançados (e reproduzíveis), observe que o padrão é "0" ( ativado ) em autosuspend_delay_ms .

Observe que, após a configuração ONLYusbcore.autosuspend=-1 no Grub, esses valores agora são negativos ( desabilitados ) após a reinicialização. Isso vai me poupar o trabalho de editar valores individuais e agora pode gerar um script para desativar a suspensão automática de USB.

screengrab: valores de suspensão automática Antes e depois da edição global

Espero que isso torne a desativação da suspensão automática de USB um pouco mais fácil e mais programável.

F1Linux
fonte
1

Ocorreu um problema ao conectar o meu telefone Android, não pude carregar o telefone porque o interruptor liga e desliga ... O PowerTop me permitiu encontrar essa configuração e foi útil para corrigir o problema (o valor automático estava causando um problema):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
País das maravilhas
fonte