Contrôle d'une alimentation USB (marche / arrêt) avec Linux

164

Est-il possible d'activer / désactiver manuellement les alimentations à partir de l'USB avec Linux?

Il y a ce ventilateur de refroidissement USB externe (le type que vous utilisez pour vous rafraîchir, pas le PC), et ce serait bien de pouvoir le contrôler depuis le terminal, car je veux positionner le ventilateur quelque part loin.

Je suppose que cela pourrait également être utile pour une variété d'autres choses, car il y a beaucoup de jouets USB là-bas. Peut-être des purificateurs d'air, etc. (j'ai entendu dire qu'ils ne fonctionnent pas vraiment).

Kamziro
la source
9
Permettez-moi de récapituler pour Linux> = 2.6.38: Le fichier power/level est maintenant obsolète; utiliser à la power/control place . ( power/wakeupc'est ok.) De plus, il n'accepte que "auto" et "on", et non plus "suspend". "auto" est assez intelligent, et si l'alimentation n'est pas coupée en mode veille, c'est la faute de l'appareil. Quoi qu'il en soit, vous ne pouvez pas couper l'alimentation manuellement. Pour plus d'informations, voir la réponse ci-dessous par tlwhitec et le document du noyau: kernel.org/doc/Documentation/usb/power-management.txt
teika kazura
Copie possible de stackoverflow.com/q/1163824/1967396
Floris
2
Cette fonctionnalité mérite vraiment une bonne interface graphique
mikebabcock
Nécessite-t-il un matériel spécial? Ce n'est pas tout à fait clair d'après les réponses,
Vojtěch Dohnal

Réponses:

63

Remarque. Les informations contenues dans cette réponse sont pertinentes pour les noyaux plus anciens (jusqu'à 2.6.32). Voir la réponse de tlwhitec pour plus d'informations sur les noyaux plus récents.

# 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

(Vous devrez peut-être changer usb1 en usb n )

Source: Documentation / usb / power-management.txt.gz

Roman Cheplyaka
la source
1
Whoa, merci pour ça. Je pensais que je devais passer par libUSB quoi qu'il arrive. Avez-vous une idée de comment obtenir les noms des périphériques connectés?
kamziro
Selon cet article, sans matériel spécial, ce n'est pas possible? blog.andrew.net.au/2009/01/17
NoBugs
7
J'obtiens une erreur d'autorisation refusée même si j'utilise sudo!
Wally
3
même pour moi "permission refusée" même après avoir utilisé sudo
Raulp
2
L'autorisation est refusée car une commande sous la forme de sudo foo > barest analysée comme directe de la sortie bar, puis exécutée en fooutilisantsudo . La redirection échoue car elle se produit avant que vous n'obteniez l'accès root. La solution est d'utiliser sudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup', et ainsi de suite: gagner la racine, lancer un nouvel enfer pour effectuer une redirection, puis sortir quelque chose dans le descripteur de fichier redirigé.
creuser
61

Selon la documentation , il y a eu plusieurs changements dans la gestion de l'alimentation USB des noyaux 2.6.32 , qui semblent s'installer dans 2.6.38 . Vous devrez maintenant attendre que le périphérique devienne inactif , ce qui est régi par le pilote de périphérique particulier. Le pilote doit le prendre en charge, sinon le périphérique n'atteindra jamais cet état. Malheureusement, l'utilisateur n'a plus aucune chance de forcer cela. Cependant, si vous avez de la chance et que votre appareil peut devenir inactif, pour désactiver cette fonction, vous devez:

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

ou, pour les noyaux autour de 2.6.38 et plus:

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

Cela signifie littéralement, suspendre au moment où l'appareil devient inactif.

Donc, à moins que votre ventilateur ne soit quelque chose d '"intelligent" qui peut être vu comme un périphérique et contrôlé par un pilote, vous n'aurez probablement pas beaucoup de chance sur les noyaux actuels.

tlwhitec
la source
Il semble que cela provoquera une mise hors tension continue du périphérique USB ... (?) Comment puis-je reprendre l'alimentation après que cela a fonctionné? Mon objectif est de redémarrer l'appareil une fois, pas de modifier définitivement sa configuration de suspension.
matanster
4
Pour reprendre un appareil suspendu, vous pouvez désactiver à nouveau la «suspension automatique» avec echo "on" > "/sys/bus/usb/devices/usbX/power/control", mais je pense que vous devez comprendre l'objectif initial. La fonction de suspension automatique est ici simplement pour permettre aux périphériques inactifs d'entrer dans un état de faible consommation (où il peut sembler éteint), pour être repris plus tard lorsque cela est nécessaire, soit par l'hôte, soit par un événement externe. Cela se produit (ou devrait se produire) automatiquement. Le port lui-même n'est en fait jamais vraiment désactivé. Vraiment, lisez la documentation ;)
tlwhitec
4
Je peux confirmer que cela fonctionne avec les noyaux> 3.10. Il suffit il faut être sûr que l'appareil « id » que vous utilisez est correct: dmesg | grep "usb"et utiliser le numéro après « USB », par exemple: usb 2-4.4: SerialNumber: A0848020vous utiliserez: /sys/bus/usb/devices/2-4.4/power/.... Assurez-vous également que l'appareil n'est pas utilisé. J'ai créé un script pour simplifier ce processus
lepe
Existe-t-il un moyen de sauvegarder cette configuration afin que chaque fois qu'elle est branchée, elle ne revienne pas aux valeurs par défaut? J'ai un appareil dont j'ai besoin pour régler le contrôle de l'alimentation sur "on" pour qu'il se recharge.
quickblueblur
@quickblueblur me semble être une règle udev .
tlwhitec
24

J'ai trouvé ces solutions qui fonctionnent au moins pour la puce de concentrateur USB Terminus FE 1.1 correctement configurée:

Pour éteindre tous les ports USB d'un concentrateur, vous pouvez dissocier le concentrateur du noyau en utilisant:

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

pour remettre sous tension - vous pouvez le relier en utilisant

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

2.La commutation de l'alimentation sur chaque port individuellement est plus délicate: j'ai pu utiliser hubpower pour contrôler chaque port - mais cela présente un inconvénient: hubpower déconnecte d'abord les usbdevfs, ce qui provoque la déconnexion de tous les périphériques USB du système, du moins sur Ubuntu :

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

Avec cette ioctldésactivation, j'ai pu désactiver l'alimentation des ports individuels sans détacher tous les périphériques - mais l'alimentation se rallume immédiatement (probablement en raison du noyau voyant un périphérique non initialisé), ce qui oblige le périphérique USB à faire un "redémarrage à froid", ce que je voulait généralement faire. Mon hubpower patché est ici

grandrew
la source
Il est confirmé que les entrées bind / unbind fonctionnent sur le noyau Linux 2.6.34, le chipset ICH8 et Ubuntu 10.04.
user1357196
5
bind / unbind ne met pas le port USB hors tension quel que soit le chipset. L'appareil est toujours sous tension ...
themihai
2
le laser de la souris est éteint, le clavier ne peut pas taper, le modem cesse de clignoter - tout va bien sur ma plate
eri
24

PowerTOP d'Intel vous permet de basculer entre des périphériques tels que des périphériques USB en temps réel. Celles-ci sont appelées «accordables».

sudo apt install powertop
sudo powertop
  • Tab sur «accordables».
  • Faites défiler jusqu'à votre appareil.
  • Appuyez sur Entrée pour basculer en mode d'économie d'énergie ( bon / mauvais )

entrez la description de l'image ici

Notez que Bad signifie que l'appareil est toujours allumé. Le passage à Bon éteindra l'appareil après le temps de sauvegarde inactif prédéfini (la valeur par défaut est 2000 ms).

Consultez la documentation PowerTOP pour plus de détails sur la manière de rendre ces modifications permanentes.
Il génère les scripts de configuration pour vous (à peu près comme décrit par d'autres auteurs sur ce fil).

REMARQUE: ces scripts n'affectent pas l'alimentation de la broche USB (qui est toujours activée).
Ceux-ci envoient uniquement le protocole du pilote pour activer et désactiver un périphérique.

Si vous souhaitez contrôler l'alimentation des broches, vous pouvez utiliser un concentrateur USB intelligent pris en charge ou, mieux encore, un microcontrôleur .

Dominic Cerisano
la source
2
Impressionnant! : Je pense que c'est la façon la plus conviviale de le faire (bien qu'à bas niveau, cela fasse les mêmes opérations que celles décrites dans les autres réponses.) Merci, et que votre réponse atteigne le haut;)
Matyas
1
Merci pour votre réponse. Où dois-je commencer à creuser pour changer le temps de sauvegarde inactif préréglé?
mikezter
Comme mentionné par les affiches précédentes, les documents du noyau sont ici: kernel.org/doc/Documentation/usb/power-management.txt
Dominic Cerisano
10

Vous pouvez utiliser mon outil uhubctl pour contrôler l'alimentation USB par port pour les concentrateurs USB compatibles.

mvp
la source
bel outil sur osx, mais ne trouve pas de «hub intelligent pris en charge» sur debian pour moi.
jitter
1
Sous Linux, vous devez l'exécuter en tant que root (sous sudo) ou configurer les autorisations des périphériques udev. Il est également possible que votre hôte Linux ne dispose pas de hubs compatibles connectés.
mvp
c'est un btw «beagle bone green».
jitter
7

Je voulais faire cela, et avec mon matériel USB, je ne pouvais pas. J'ai écrit une manière hacky comment le faire ici:

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

En bref: j'ai utilisé un relais USB pour ouvrir / fermer le V CC d'un autre câble USB ...

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

fonctionne pour ubuntu

user3527264
la source
1
LA VÔTRE EST LA SEULE SOLUTION QUI A FONCTIONNÉ SUR MON CAS. J'utilise un ordinateur portable Acer Make 12.04LTS Ubuntu.
RicoRicochet
1
Ne met pas l'appareil hors tension, le supprime uniquement de la liste des appareils. Comment puis-je mettre le port USB hors tension?
rustyx
1
C'est également la seule solution qui a fonctionné pour moi pour éteindre une tablette Wacom Intuos5 touch M sans la débrancher (sur Fedora 28)
user1738984
2

L'alimentation USB 5v est toujours allumée (même lorsque l'ordinateur est éteint, sur certains ordinateurs et sur certains ports.) Vous devrez probablement programmer un Arduino avec une sorte de commutateur et le contrôler via la bibliothèque série à partir de l'USB branché sur le ordinateur.

En d'autres termes, une combinaison de ce tutoriel sur le commutateur et de ce tutoriel sur la communication via la bibliothèque série avec Arduino branché via USB.

NoBugs
la source
2

La raison pour laquelle les gens affichent des questions telles que cela est dû à l'effet dreaded- « EVIL « - Auto-Suspend USB » fonction ».

La suspension automatique coupe l'alimentation d'un périphérique USB «inactif» et à moins que le pilote du périphérique ne prenne correctement en charge cette fonction, le périphérique peut devenir incontrôlable. Donc, allumer / éteindre un port USB est un symptôme du problème, pas le problème en soi.

Je vais vous montrer comment désactiver GLOBALEMENT la suspension automatique, éliminant ainsi le besoin d'activer et de désactiver manuellement les ports USB:

Réponse courte:

Vous n'avez PAS besoin de modifier individuellement " autosuspend_delay_ms ": la suspension automatique USB peut être désactivée globalement et PERSISTANTMENT à l'aide des commandes suivantes:

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

update-grub

systemctl reboot

Une capture d'écran Ubuntu 18.04 suit à la fin de la "Longue réponse" illustrant comment mes résultats ont été atteints.

Longue réponse:

Il est vrai que la documentation du noyau de gestion de l'alimentation USB indique que la suspension automatique doit être obsolète et à sa place, « autosuspend_delay_ms » est utilisé pour désactiver la suspension automatique USB:

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

CEPENDANT, mes tests révèlent que le réglage usbcore.autosuspend=-1dans / etc / default / grub comme ci-dessous peut être utilisé comme une bascule GLOBALE pour la fonctionnalité de suspension automatique USB - vous n'avez PAS besoin d'éditer les fichiers individuels " autosuspend_delay_ms ".

Le même document lié ci-dessus indique qu'une valeur de "0" est ENABLED et une valeur négative est DISABLED :

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.

Dans la capture d'écran annotée d' Ubuntu 18.04 ci -dessous illustrant comment mes résultats ont été obtenus (et reproductibles), veuillez noter que la valeur par défaut est "0" ( activé ) dans autosuspend_delay_ms .

Notez ensuite qu'après le réglage UNIQUEMENTusbcore.autosuspend=-1 dans Grub, ces valeurs sont maintenant négatives ( désactivées ) après le redémarrage. Cela m'évitera la peine de modifier des valeurs individuelles et peut maintenant désactiver la suspension automatique USB.

capture d'écran: valeurs de suspension automatique avant et après la modification globale

J'espère que cela rendra la désactivation de la suspension automatique USB un peu plus facile et plus scriptable.

F1Linux
la source
1

J'ai eu un problème lors de la connexion de mon téléphone Android, je ne pouvais pas charger mon téléphone car l'interrupteur d'alimentation allumé puis éteint ... PowerTop m'a laissé trouver ce paramètre et a été utile pour résoudre le problème (la valeur automatique était à l'origine du problème):

echo 'on' | sudo tee /sys/bus/usb/devices/1-1/power/control
Pays des merveilles
la source