Controllo di un alimentatore USB (acceso / spento) con Linux


164

È possibile accendere / spegnere gli alimentatori da USB manualmente con Linux?

C'è questa ventola di raffreddamento USB esterna (il tipo che usi per rinfrescarti, non il PC), e sarebbe bello poterlo controllare dal terminale, perché voglio posizionare la ventola da qualche parte lontano.

Suppongo che questo potrebbe essere utile anche per una varietà di altre cose, perché ci sono molti giocattoli USB là fuori. Forse depuratori d'aria, ecc. (Ho sentito che in realtà non funzionano).


9
Consentitemi di ricapitolare per Linux> = 2.6.38: il file power/level è ora obsoleto; usa power/control invece . ( power/wakeupva bene.) Inoltre, accetta solo "auto" e "on", non "sospendere" più. "auto" è abbastanza intelligente, e se l'alimentazione non viene spenta mentre è inattivo, è colpa del dispositivo. Ad ogni modo non è possibile spegnere manualmente. Per di più, vedi la risposta di seguito da tlwhitec e il documento del kernel: kernel.org/doc/Documentation/usb/power-management.txt
teika kazura


2
Questa funzione merita davvero una buona interfaccia grafica
mikebabcock,

Richiede hardware speciale? Non è del tutto chiaro dalle risposte,
Vojtěch Dohnal,

Risposte:


63

Nota. Le informazioni in questa risposta sono rilevanti per i kernel più vecchi (fino a 2.6.32). Vedi la risposta di tlwhitec per le informazioni sui kernel più recenti.

# 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

(Potrebbe essere necessario cambiare usb1 in usb n )

Fonte: documentazione / usb / power-management.txt.gz


1
Whoa, grazie per quello. Pensavo di dover passare attraverso libUSB, non importa quale. Qualche idea su come ottenere anche i nomi dei dispositivi collegati?
Kamziro,

Secondo questo post, senza hardware speciale non è possibile? blog.andrew.net.au/2009/01/17
NoBugs

7
Ricevo un errore di autorizzazione negata anche se uso sudo!
Wally,

3
lo stesso per me "permesso negato" anche dopo aver usato sudo
Raulp

2
L'autorizzazione viene negata perché un comando sotto forma di sudo foo > barviene analizzato come diretto all'output bar, quindi eseguito fooutilizzandosudo . Il reindirizzamento non riesce perché si verifica prima di ottenere l'accesso come root. La soluzione è usare sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup', e così via: ottenere root, eseguire un nuovo inferno per eseguire un reindirizzamento, quindi emettere qualcosa nel descrittore di file reindirizzato.
scavare

61

Secondo i documenti , ci sono state diverse modifiche alla gestione dell'alimentazione USB dai kernel 2.6.32 , che sembrano risolversi in 2.6.38 . Ora dovrai attendere che il dispositivo diventi inattivo , che è governato dal driver del dispositivo specifico. Il driver deve supportarlo, altrimenti il ​​dispositivo non raggiungerà mai questo stato. Sfortunatamente, ora l'utente non ha alcuna possibilità di forzarlo. Tuttavia, se sei fortunato e il tuo dispositivo può diventare inattivo, quindi per disattivarlo devi:

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

oppure, per i kernel intorno alla 2.6.38 e successive:

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

Questo significa letteralmente, sospendere nel momento in cui il dispositivo diventa inattivo.

Quindi, a meno che il tuo fan non sia qualcosa di "intelligente" che può essere visto come un dispositivo e controllato da un driver, probabilmente non avrai molta fortuna sui kernel attuali.


Sembra che questo causerà lo spegnimento continuo del dispositivo USB ... (?) Come dovrebbe essere ripristinato da me dopo che ha funzionato? Il mio obiettivo è riavviare il dispositivo una volta, non per modificare in modo permanente la sua configurazione di sospensione.
matanster

4
Per riprendere un dispositivo sospeso, è possibile disabilitare nuovamente la "sospensione automatica" con echo "on" > "/sys/bus/usb/devices/usbX/power/control", ma penso che sia necessario comprendere lo scopo originale. La funzione di sospensione automatica è qui semplicemente per consentire ai dispositivi inattivi di entrare in uno stato di basso consumo (dove potrebbe sembrare spento), per poi essere ripreso in seguito quando è necessario, dall'host o da qualche evento esterno. Ciò accade (o dovrebbe accadere) automaticamente. La porta stessa in realtà non è mai veramente disattivata. Davvero, leggi i documenti ;)
tlwhitec,

4
Posso confermare che funziona con kernel> 3.10. Basta essere sicuri che il dispositivo "id" che si sta utilizzando è corretta: dmesg | grep "usb"e utilizzare il numero dopo "USB", per esempio: usb 2-4.4: SerialNumber: A0848020che si intende utilizzare: /sys/bus/usb/devices/2-4.4/power/.... Inoltre, assicurarsi che il dispositivo non sia in uso. Ho creato uno script per semplificare questo processo
lepe

C'è un modo per salvare questa configurazione in modo che ogni volta che è collegato non ritorni ai valori predefiniti? Ho un dispositivo di cui ho bisogno per impostare il controllo dell'alimentazione su "on" per caricarlo.
quickblueblur

@quickblueblur mi sembra una regola udev .
tlwhitec,

24

Ho trovato queste soluzioni che funzionano almeno per il chip hub USB Terminus FE 1.1 correttamente configurato:

1.Per spegnere tutte le porte USB di un hub, è possibile separare l'hub dal kernel usando:

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

per riaccendere - è possibile ricollegarlo usando

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

2. Commutare l'alimentazione su ciascuna porta singolarmente è più complicato: sono stato in grado di utilizzare l' hubpower per controllare ciascuna porta - ma ha un aspetto negativo: l'hubpower disconnette prima gli usbdevfs che causano la disconnessione di tutti i dispositivi USB dal sistema, almeno su Ubuntu :

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

Con questo ioctldisabilitato sono stato in grado di spegnere l'alimentazione della singola porta senza scollegare tutti i dispositivi - ma l'alimentazione si riaccende immediatamente (probabilmente a causa del kernel che vede un dispositivo non inizializzato) che fa sì che il dispositivo USB faccia solo un "riavvio a freddo" che è quello che generalmente voleva farlo. Il mio hubpower con patch è qui


Le voci bind / unbind sono confermate per funzionare su kernel Linux 2.6.34, chipset ICH8 e Ubuntu 10.04.
user1357196,

5
bind / unbind non spegne la porta USB indipendentemente dal chipset. Il dispositivo è ancora alimentato ...
themihai

2
il laser del mouse è spento, il tipo di tastiera non può essere, il modem smette di lampeggiare - tutto bene sulla mia piattaforma
eri

24

PowerTOP di Intel ti consente di attivare / disattivare dispositivi come periferiche USB in tempo reale. Questi sono chiamati "parametri sintonizzabili".

sudo apt install powertop
sudo powertop
  • Tab su 'sintonizzabili'.
  • Scorri verso il basso fino al dispositivo.
  • Premi Invio per attivare / disattivare la modalità di risparmio energetico ( Buono / Cattivo )

inserisci qui la descrizione dell'immagine

Si noti che Bad indica che il dispositivo è sempre acceso. Passando a Buono , il dispositivo si spegne dopo il tempo di risparmio inattivo preimpostato (il valore predefinito è 2000 ms).

Consulta i documenti PowerTOP per i dettagli su come rendere permanenti queste modifiche.
Genera gli script di configurazione per te (praticamente come descritto da altri poster su questo thread).

NOTA: questi script non influiscono sull'alimentazione del pin USB (che è sempre attivo).
Questi inviano solo il protocollo del driver per attivare e disattivare un dispositivo.

Se si desidera controllare l'alimentazione dei pin, è possibile utilizzare un hub USB intelligente supportato o, meglio ancora, un microcontrollore .


2
Eccezionale! : DI pensa che questo sia il modo più semplice per farlo (sebbene a basso livello compia le stesse operazioni descritte nelle altre risposte.) Grazie, e che la tua risposta raggiunga la cima;)
Matyas

1
Grazie per la tua risposta. Dove devo iniziare a scavare per modificare il tempo di risparmio inattivo preimpostato?
mikezter,

Come menzionato nei precedenti poster, i documenti del kernel sono qui: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano

10

È possibile utilizzare il mio strumento uhubctl per controllare l'alimentazione USB per porta per hub USB compatibili.


ottimo strumento su osx, ma non trova alcun 'hub intelligente supportato' su debian per me.
jitter

1
Su Linux, è necessario eseguirlo come root (sotto sudo) o per configurare le autorizzazioni del dispositivo udev. È anche possibile che il tuo host Linux non abbia hub compatibili collegati.
MVP

è un 'beagle bone green' tra i due.
jitter


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

funziona per Ubuntu


1
LA TUA È L'UNICA SOLUZIONE CHE HA FUNZIONATO SUL MIO CASO. Sto usando un acer make laptop 12.04LTS Ubuntu.
RicoRicochet,

1
Non spegne il dispositivo, lo rimuove solo dall'elenco dei dispositivi. Come posso spegnere la porta USB?
Rustyx,

1
Questa è anche l'unica soluzione che ha funzionato per me per spegnere un tablet Wacom Intuos5 touch M senza scollegarlo (su Fedora 28)
user1738984

2

L'alimentazione USB 5v è sempre attiva (anche quando il computer è spento, su alcuni computer e su alcune porte). Probabilmente dovrai programmare un Arduino con una sorta di switch e controllarlo tramite libreria seriale da USB collegato al computer.

In altre parole, una combinazione di questo tutorial switch e di questo tutorial sulla comunicazione tramite Araryino tramite libary seriale è collegata tramite USB.


2

Il motivo per cui la gente pubblica domande come questa è dovuto alla temuta - in effetti " EVIL " - funzione " Auto-Suspend USB ".

La sospensione automatica interrompe l'alimentazione di un dispositivo USB "inattivo" e, a meno che il driver del dispositivo non supporti correttamente questa funzione, il dispositivo può diventare non raggiungibile. Quindi accendere / spegnere una porta USB è un sintomo del problema, non il problema in sé.

Ti mostrerò come disabilitare GLOBALMENTE la sospensione automatica, annullando la necessità di attivare e disattivare manualmente le porte USB:

Risposta breve:

NON è necessario modificare " autosuspend_delay_ms " singolarmente: la sospensione automatica USB può essere disabilitata a livello globale e PERSISTENTEMENTE utilizzando i seguenti comandi:

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

update-grub

systemctl reboot

Un Ubuntu 18.04 screen-grab segue alla fine della "risposta Lunghi" che illustra come sono stati raggiunti i miei risultati.

Risposta lunga:

È vero che la documentazione del kernel di gestione dell'alimentazione USB afferma che l'autosuspend deve essere deprecato e al suo posto " autosuspend_delay_ms " utilizzato per disabilitare l'autosuspend USB:

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

TUTTAVIA i miei test rivelano che l'impostazione usbcore.autosuspend=-1in / etc / default / grub come di seguito può essere utilizzata come interruttore GLOBAL per la funzionalità di sospensione automatica USB - NON è necessario modificare singoli file " autosuspend_delay_ms ".

Lo stesso documento collegato sopra afferma che un valore di "0" è ABILITATO e un valore negativo è DISATTIVATO :

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.

Nella schermata annotata di Ubuntu 18.04 riportata di seguito che illustra come i miei risultati sono stati raggiunti (e riproducibili), si noti che il valore predefinito è "0" ( abilitato ) in autosuspend_delay_ms .

Quindi notare che dopo aver impostato SOLOusbcore.autosuspend=-1 in Grub, questi valori sono ora negativi ( disabilitati ) dopo il riavvio. Questo mi risparmierà il fastidio di modificare i singoli valori e ora è possibile disabilitare lo script di disabilitazione della sospensione automatica USB.

screengrab: valori di sospensione automatica prima e dopo la modifica globale

Spero che questo renda la disabilitazione della sospensione automatica USB un po 'più facile e più scriptabile-


1

Ho avuto un problema durante la connessione del mio telefono Android, non sono riuscito a caricare il telefono perché l'accensione e lo spegnimento ... PowerTop mi ha permesso di trovare questa impostazione ed è stato utile per risolvere il problema (il valore automatico causava il problema):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
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.