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

É possível ligar / desligar fonts de alimentação a partir de USB manualmente com o linux?

Há um ventilador de refrigeração USB externo (do tipo que você usa para se refrescar, não o PC), e seria bom poder controlá-lo a partir do terminal, porque quero posicionar o ventilador em algum lugar distante.

Acho que isso também pode 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 embora).

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

     # 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 

    (Você pode precisar mudar usb1 para usb n )

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

    De acordo com os documentos , houve várias mudanças no gerenciamento de energia do USB a partir dos kernels 2.6.32 , que parecem se instalar no 2.6.38 . Agora você precisará aguardar o dispositivo ficar ocioso , o que é controlado pelo driver de dispositivo específico. O driver precisa suportá-lo, caso contrário, o dispositivo nunca alcançará esse estado. Infelizmente, agora o usuário não tem chance de forçar isso. No entanto, se você tiver sorte e seu dispositivo puder ficar ocioso, desligue-o e faça o seguinte:

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

    ou, para os kernels em torno de 2.6.38 e acima:

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

    Isso significa literalmente, vá suspender no momento em que o dispositivo ficar ocioso.

    Então, a menos que seu fã seja algo “inteligente” que possa ser visto como um dispositivo e controlado por um driver, você provavelmente não terá muita sorte nos kernels atuais.

    Eu encontrei essas soluções que pelo menos funcionam para o chip do terminal terminus FE 1.1 USB configurado corretamente:

    1. Para desligar a energia em 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 de volta usando

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

    2.Alterar energia em cada porta individualmente é mais complicado: eu consegui usar a potência do hub para controlar cada porta – mas ela vem com uma desvantagem: a hubpower primeiro desconecta o usbdevfs 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 este ioctl desativado, eu consegui desligar a energia de uma porta individual sem separar todos os dispositivos – mas a energia volta imediatamente (provavelmente devido ao kernel ter visto um dispositivo não inicializado) que faz com que o dispositivo USB apenas faça um “reinício a frio” Eu geralmente queria fazer. Meu hubpower remendado está aqui

    PowerTOP da Intel permite que você alterne dispositivos como periféricos usb em tempo real. Estes são chamados de ‘sintonizadores’.

     sudo apt install powertop sudo powertop 
    • Vá até ‘sintonizadores’.
    • Desloque-se para o seu dispositivo.
    • Pressione Enter para alternar o modo de economia de energia ( bom / ruim )

    insira a descrição da imagem aqui

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

    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 energia do pino USB (que está sempre ativada).
    Estes apenas enviam o protocolo do driver para ativar e desativar um dispositivo.

    Se você quiser controlar a energia do pino, você pode usar um hub USB inteligente compatível ou, melhor ainda, um microcontrolador .

    Eu queria fazer isso, e com o meu hardware USB não consegui. Eu escrevi um jeito hacky como fazer isso aqui: http://pintant.cat/2012/05/12/power-off-usb-device/ . Em pouco tempo: usei um relé USB para abrir / fechar o Vc de outro cabo USB …

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

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

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

    funciona para o Ubuntu

    A energia USB de 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 switch, e controlá-lo via biblioteca Serial a partir do USB conectado ao computador.

    Em outras palavras, uma combinação deste tutorial de switch e este tutorial sobre comunicação via biblioteca serial para o Arduino conectado via USB.

    Eu tive um problema ao conectar meu telefone Android, eu não poderia carregar meu telefone porque o poder ligar e desligar … PowerTop deixe-me encontrar essa configuração e foi útil para corrigir o problema (valor automático estava causando problema):

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