Spegnimento della porta USB. Oppure disattiva l'alimentazione dell'intero sottosistema USB


28

Ho una lampada USB che ho acquistato appositamente per spegnerla a livello di programmazione in un determinato momento, quindi devo togliere l'alimentazione alla sua porta USB.

Credo di avere un hub USB su USB6. La lampada è collegata a una delle porte di questo 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

Ecco cosa ho provato:

Due soluzioni sono qui , la prima suggerisce:

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

ma ottengo write error: Invalid argumentquando provo a scrivere a /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

La seconda soluzione:

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

che spegne il dispositivo hub USB.

Stavo anche cercando di seguire questo :

Ma l'output di si lsusb -tblocca:

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

Il che mi impedisce di utilizzare questo metodo per ottenere la parte '2-1.1' a questo:

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

Esiste un modo alternativo per ottenere queste informazioni?

In alternativa, c'è un modo per spegnere l'intero sottosistema USB? Qualcosa del genere modprobe -r usb_etc?

Il mio kernel è:

$uname -r
3.2.0-4-amd64

quali errori di sintassi? in questo caso, non è necessario citare le stringhe semplici 'suspend', 'disabled'. se hai l'abitudine di citare, ottimo per te, ma in questo caso non è necessario.
user84207

Ho provato a rintracciare la lsusb -tchiamata e non ho trovato nulla di utile nel tempo in cui ho dovuto eseguire il debug. Onestamente non ho tempo in questo momento per trovare bug in lsub e non riesco nemmeno a riprodurlo in questo momento, quindi probabilmente dipende dai dispositivi che sono collegati. Dovrò aspettare per tornare a casa per provare a riproducilo.
user84207,

Risposte:


20

È possibile utilizzare uhubctl - utilità della riga di comando per controllare l'alimentazione USB per porta per hub USB compatibili.

Funziona solo su hub che supportano la commutazione dell'alimentazione per porta, ma nota che molte schede madri moderne dispongono di hub USB che supportano questa funzione.

Compilare:

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

Per elencare lo stato di tutti gli hub, le loro posizioni e le porte che possono essere controllate da uhubctl:

uhubctl

Per spegnere la porta 5 del singolo hub compatibile:

uhubctl -a 0 -p 5

Se hai più di un hub compatibile collegato, utilizza -lper specificare la posizione dell'hub per controllarlo:

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

Per spegnere e riaccendere:

uhubctl -a 2 -p 5

Si noti che sono supportati anche hub USB 3.0 e alcuni nuovi hub USB 3.0 funzionano davvero bene.

Leggi di più qui .

Divulgazione - Sono l'autore di uhubctl.


Un po 'più di informazioni sarebbe carino. Soprattutto perché sei l'autore e non è un esempio di pacchetto standard su come usarlo, cosa succede se eventuali capacità / limitazioni ha, rischi se ce ne sono, le risposte solo al link non sono preferite.
Zachary Brady,

2
Bene, copiare / incollare l'intero file README non mi sembra un'idea brillante. Ha spiegato tutti gli avvertimenti.
mvp,

No, l'intero readme sarebbe eccessivo. Proprio come è possibile utilizzare il programma per risolvere il problema posto nella domanda. E se ci sono avvertenze in quel particolare caso d'uso, non l'intera applicazione. Scusa se non sono stato chiaro nel mio primo commento.
Zachary Brady,

1
Cordiali saluti: Questo metodo funziona con la famiglia di controller host PCIe-USB Renesas UPD720202. :) Grazie.
Wossname

Grazie @Wossname. Ti dispiace aggiungerlo come nuovo numero su github.com/mvp/uhubctl/issues ? Aggiornerò l'elenco dei dispositivi supportati.
mvp,

20

Vedi Controllo di un alimentatore USB (on / off) con Linux , versione corta, per i kernel più recenti "suspend" non funziona più:

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

Ma non taglia letteralmente l'energia, segnala al dispositivo di spegnersi, spetta al dispositivo implementare la gestione dell'alimentazione e fare la cosa giusta.

Hai molti dettagli nella documentazione ufficiale nel kernel, lì spiega i vari file /sys/bus/usb/devices/.../power/e come gestire i dispositivi e le porte.

Per cose che non sono veri dispositivi USB (la tua lampada USB si presenta in lsusb?) Potresti essere sfortunato, ho provato me stesso con una lampada USB e con un logger gps che carica la sua batteria e trasferisce i dati tramite USB che mostra da usb cp210x a seriale, e nemmeno lo spegnimento. Posso "disconnettere" i gps con echo '5-4.6' > /sys/bus/usb/drivers/usb/unbinde ricollegarli con echo '5-4.6' > /sys/bus/usb/drivers/usb/bindma la luce di ricarica della batteria è sempre accesa.

Ma sembra che alcuni hub lo facciano correttamente .


0

NON è necessario modificare singolarmente i file " autosuspend_delay_ms ".

La sospensione automatica USB può essere disabilitata GLOBALMENTE e PERSISTENTEMENTE con:

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

update-grub

systemctl reboot

Bastano pochi secondi per testare la correzione proposta e convalidarne la correttezza.

Una schermata con annotazioni di Ubuntu 18.04 di seguito illustra la modifica come sopra descritto che risulta nel riavvio dell'host con TUTTE le impostazioni di sospensione automatica USB disabilitate:

Demo Ubuntu 18.04 disabilitando globalmente la sospensione automatica USB

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.