Como posso desligar a energia da porta USB?

3

Estou usando o Lubuntu 16.04. Eu tenho alto-falantes analógicos que levam sua energia de um soquete USB. Eu gostaria que eles desligassem quando eu desligar o pc e suspendê-lo. Pensei que seria muito fácil, mas passei muito tempo pesquisando e ainda não tenho uma solução.

Minha melhor aposta parece ser uhubctl , já que isso parece rodar no meu hardware (o autor alerta que nem todos os hubcontrollers suportam funcionalidade). Eu acredito nisso porque eu desliguei com sucesso o teclado USB.

Então, agora eu preciso saber o que especificar para desligar a energia na entrada USB para os alto-falantes. Isso está fadado a levar algumas suposições, já que elas não são dispositivos USB reais e não serão exibidas no lsusb. Olhando para o painel traseiro e para o manual da placa-mãe, vejo que o grupo de quatro soquetes nos quais os alto-falantes estão conectados é descrito como portas USB 2.0 7-10. Meu mouse e webcam estão conectados ao mesmo grupo de soquetes.

Executando o uhubctl sem argumentos:

Current status for hub 2-1 [8087:8002, USB 2.00, 8 ports]
Port 1: 0100 power
Port 2: 0100 power
Port 3: 0100 power
Port 4: 0100 power
Port 5: 0100 power
Port 6: 0100 power
Port 7: 0100 power
Port 8: 0100 power
Current status for hub 1-1 [8087:800a, USB 2.00, 6 ports]
Port 1: 0100 power
Port 2: 0100 power
Port 3: 0100 power
Port 4: 0100 power
Port 5: 0100 power
Port 6: 0100 power
Current status for hub 4-5 [174c:3074 ASUS TEK. ASM107x, USB 3.00, 4 ports]
Port 1: 02a0 power 5gbps Rx.Detect
Port 2: 02a0 power 5gbps Rx.Detect
Port 3: 02a0 power 5gbps Rx.Detect
Port 4: 02a0 power 5gbps Rx.Detect
Current status for hub 3-9 [174c:2074 ASUS TEK. ASM107x, USB 2.10, 4 ports]
Port 1: 0100 power
Port 2: 0303 power lowspeed enable connect [047d:2043 NOVATEK Kensington U+P Keyboard]
Port 3: 0100 power
Port 4: 0100 power

Isso não é muito útil. Meu teclado aparece, mas todos os meus outros dispositivos USB - mouse, Seagate HDD, webcam - não são mencionados.

Eu tentei vários comandos:

uhubctl -a off -p 2 -l 3-9     #Turns off keyboard as expected
uhubctl -a off -p 2 -l 4-5     #ALSO turns off keyboard. Why ?

uhubctl -a off -p 12345678 -l 2-1 #Does not turn anything off
uhubctl -a off -p 123456   -l 1-1 #Does not turn anything off
uhubctl -a off -p 134      -l 4-5 #Does not turn anything off.

Então eu posso desligar o teclado. Nenhum outro dispositivo USB está listado (embora esteja lá) e não pode ser desligado.

Não tenho ideia do que os nomes dos hubs representam, por exemplo, 2-1, 1-1, 4-5, 3-9. Nem parece haver qualquer maneira de inferir os nomes de hub de lsusb.

lsusb dá:

Bus 002 Device 002: ID 8087:8002 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 008 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 007 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:800a Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 003: ID 174c:3074 ASMedia Technology Inc. ASM1074 SuperSpeed hub
Bus 004 Device 002: ID 0bc2:ab24 Seagate RSS LLC 
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 007: ID 047d:2043 Kensington 
Bus 003 Device 003: ID 174c:2074 ASMedia Technology Inc. ASM1074 High-Speed hub
Bus 003 Device 002: ID 0f62:1001 Acrox Technologies Co., Ltd Targus Mini Trackball Optical Mouse
Bus 003 Device 006: ID 046d:0994 Logitech, Inc. QuickCam Orbit/Sphere AF
Bus 003 Device 004: ID 0b05:180a ASUSTek Computer, Inc. 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

lsusb -t dá:

/:  Bus 08.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/:  Bus 07.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 10000M
/:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 480M
/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/6p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=uas, 5000M
    |__ Port 5: Dev 3, If 0, Class=Hub, Driver=hub/4p, 5000M
/:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/15p, 480M
    |__ Port 5: Dev 2, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 9: Dev 3, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 2: Dev 7, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
        |__ Port 2: Dev 7, If 1, Class=Human Interface Device, Driver=usbhid, 1.5M
    |__ Port 10: Dev 4, If 1, Class=Vendor Specific Class, Driver=btusb, 12M
    |__ Port 10: Dev 4, If 2, Class=Vendor Specific Class, Driver=btusb, 12M
    |__ Port 10: Dev 4, If 0, Class=Vendor Specific Class, Driver=btusb, 12M
    |__ Port 10: Dev 4, If 3, Class=Application Specific Interface, Driver=, 12M
    |__ Port 14: Dev 6, If 0, Class=Video, Driver=uvcvideo, 480M
    |__ Port 14: Dev 6, If 1, Class=Video, Driver=uvcvideo, 480M
    |__ Port 14: Dev 6, If 2, Class=Audio, Driver=snd-usb-audio, 480M
    |__ Port 14: Dev 6, If 3, Class=Audio, Driver=snd-usb-audio, 480M
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/8p, 480M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M

Posso ver que há alguma relação entre os nomes dos hubs e os números de barramento / porta, mas não consigo criar uma regra.

Percebi no lsusb que os dispositivos USB 2.0 parecem usar um controlador Intel, enquanto os dispositivos USB 3.0 e 2.1 parecem usar um controlador ASUS. Gostaria de saber se os chips da Intel podem não suportar o controle de energia, então eu tentei os alto-falantes no soquete USB 2.1, que eu posso desligar quando está conectado ao teclado. Sem sorte.

Alguém tem alguma idéia de por que o uhubctrl se comporta da maneira como funciona?

Talvez o uhubctl seja um arenque vermelho e não funcione. Eu sei que existem outras maneiras de mudar de energia no Ubuntu, mas eles parecem depender de ser capaz de determinar o diretório que representa o soquete usb. Isso eu não tenho ideia de como fazer.

    
por user1759557 27.04.2018 / 21:34

1 resposta

4

  • uhubctl está usando o mesmo método de endereçamento para dispositivos USB como kernel do Linux: b-x.y.z , onde b é o número do barramento USB, x , y , z são números de porta da cadeia de hub começando da raiz Hub USB para um determinado barramento. Este endereçamento é semi-estável - ele não será alterado se você desconectar e conectar dispositivos USB de volta à (s) mesma (s) porta (s) física (s).
  • Para responder à sua segunda pergunta, preciso citar esta do arquivo uhubctl README:

    If you have compatible USB 3.0 hub connected to USB3 upstream port, it will be detected as 2 independent virtual hubs: USB2 and USB3, and your USB devices will be connected to USB2 or USB3 virtual hub depending on their capabilities and connection speed. To control power for such hubs, it is necessary to turn off/on power on both USB2 and USB3 virtual hubs for power off/on changes to take effect. uhubctl will try to do this automatically (unless you disable this behavior with option -e).

  • E, finalmente, o uhubctl listará apenas os hubs USB que afirmam oferecer suporte a PPPS (comutação de energia por porta). No entanto, existem hubs que reivindicam suporte, mas não funcionam realmente (a comutação de circuitos está fisicamente ausente). Estou mantendo lista de todos os hubs que funcionam , com certeza.

Divulgação: Sou autor de uhubctl :) Sinta-se à vontade para abrir questões contra o uhubctl aqui .

    
por mvp 27.04.2018 / 23:31
0

Esta é uma resposta antiga de outubro de 2016, que ainda é relevante em abril de 2018 para o Ubuntu 16.04 LTS: Como desligar a energia USB do meu mouse, quando eu suspendo o notebook? .

O atual obstáculo com links OP, comentários de acompanhamento e respostas propostas é que o ID do produto é estático 1b1a:7001 , mas os números de barramento e dispositivo continuam mudando.

A solução

Crie um script (qualquer nome que você quiser) no diretório /etc/pm/sleep.d/ e coloque o seguinte:

#!/bin/bash
ZeroBUS=$(lsusb | grep 174c:2074 | cut -c  5-7 )

# Strip leading zeros
BUS=$(echo $ZeroBUS | sed 's/^0*//')

# Build "usbX" usb number
USB=usb$BUS

case $1 in
     suspend|suspend_hybrid|hibernate)
     echo "Powering off: " $USB
        echo $USB | sudo tee /sys/bus/usb/drivers/usb/unbind
        ;;
     resume|thaw)
        # No need to do anything here, kernel unsuspends USB devices
        # Show how to power on for interest sake but since device is
        # powered off the usb number will be blank.
        echo "Powering on: " $USB
        echo $USB | sudo tee /sys/bus/usb/drivers/usb/bind
        ;;
esac

Marque o arquivo como executável com sudo chmod +x file_name , em que "file_name" é o nome que você escolheu.

A explicação

Esta solução desliga todo o hub USB que no meu caso significava telefone, mouse sem fio, teclado sem fio, etc. Ao chamar o script do terminal, a senha do sudo precisa ser digitada. Esperemos que quando chamados de poderes sudo systemd sejam herdados. Eu não pude testar isso, porque eu não tenho um mouse com fio. Portanto, o refinamento adicional pode ser necessário para os poderes do sudo.

A energia não é cortada fisicamente quando a BIOS está fornecendo uma fonte de alimentação constante de 5V, mas os dispositivos no barramento são instruídos a se desligarem. No meu caso, o teclado e o mouse sem fio pararam de funcionar e tiveram que recorrer ao teclado do laptop e ao touchpad para voltar a ligá-lo.

Você pode testar isso manualmente chamando o script e passando os parâmetros "suspender". Passar o parâmetro "resume" não faz nada porque o dispositivo está desligado, não tem ID de dispositivo para ligá-lo novamente.

Pedimos desculpas por "copiar e colar" com uma pequena revisão para alterar o nome do dispositivo, mas estou focado em escrever scripts para testar o Ubuntu 18.04 nesse período movimentado.

    
por WinEunuuchs2Unix 28.04.2018 / 04:03