184 votes

Contrôler une alimentation USB (marche/arrêt) avec Linux

Est-il possible d'allumer/éteindre manuellement les alimentations depuis l'USB avec Linux ?

Il y a ce ventilateur externe USB (le genre que vous utilisez pour vous refroidir, pas pour refroidir le PC), et ce serait bien de pouvoir le contrôler depuis le terminal, parce que je veux positionner le ventilateur quelque part au loin.

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

10 votes

Je récapitule pour Linux >= 2.6.38 : Le dossier power/level est désormais obsolète ; utilisez power/control au lieu de . ( power/wakeup est ok). De plus, il n'accepte que "auto" et "on", et 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. De toute façon, vous ne pouvez pas éteindre l'appareil manuellement. Pour en savoir plus, voir la réponse ci-dessous par tlwhitec et la doc du noyau : kernel.org/doc/Documentation/usb/power-management.txt

0 votes

Duplicata possible de stackoverflow.com/q/1163824/1967396

3 votes

Cette fonctionnalité mérite vraiment une bonne interface graphique

66voto

tlwhitec Points 312

Selon le docs il y a eu plusieurs changements dans la gestion de l'alimentation USB depuis les noyaux. 2.6.32 qui semblent s'installer dans 2.6.38 . Maintenant, vous devez attendre que l'appareil devienne oisif qui est régi par le pilote de périphérique particulier. Le pilote doit le prendre en charge, sinon le périphérique ne pourra jamais atteindre cet état. Malheureusement, l'utilisateur n'a pas la possibilité de forcer cet état. Toutefois, si vous avez de la chance et que votre appareil peut devenir inactif, vous devez le désactiver :

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, allez suspendre au moment où l'appareil devient inactif.

Donc, à moins que votre ventilateur 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 avec les noyaux actuels.

0 votes

Il semble que le périphérique USB soit continuellement mis hors tension...( ?) Comment dois-je rétablir l'alimentation, après cette opération ? Mon objectif est de redémarrer le dispositif une fois, et non de modifier de façon permanente sa configuration de suspension.

5 votes

A CV un dispositif suspendu, vous pouvez désactiver à nouveau l'"autosuspend" avec echo "on" > "/sys/bus/usb/devices/usbX/power/control" mais je pense que vous devez comprendre l'objectif initial. La fonction d'autosuspension est là simplement pour permettre aux périphériques en veille d'entrer dans un état de faible puissance (où ils peuvent sembler éteints), pour être repris plus tard lorsqu'ils sont nécessaires, 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 jamais vraiment éteint. Vraiment, lisez le docs ;)

8 votes

Je peux confirmer que cela fonctionne avec des noyaux > 3.10. Il faut juste s'assurer que l'identifiant du périphérique que vous utilisez est correct : dmesg | grep "usb" et utiliser le numéro après "usb", par exemple : usb 2-4.4: SerialNumber: A0848020 que vous utiliserez : /sys/bus/usb/devices/2-4.4/power/... . Assurez-vous également que l'appareil n'est pas en cours d'utilisation. J'ai créé un script pour simplifier ce processus

65voto

Roman Cheplyaka Points 15145

Note. Les informations contenues dans cette réponse sont pertinentes pour les anciens noyaux (jusqu'à 2.6.32). Voir La réponse de tlwhitec pour les informations sur les noyaux les 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

1 votes

Whoa, merci pour ça. Je pensais que je devais passer par libUSB quoi qu'il arrive. Une idée sur la façon d'obtenir les noms des périphériques connectés ?

0 votes

D'après ce post, sans matériel spécial, ce n'est pas possible ? blog.andrew.net.au/2009/01/17

7 votes

Je reçois une erreur de permission refusée même si j'utilise sudo !

32voto

grandrew Points 106

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

Pour couper l'alimentation de tous les ports USB d'un hub, vous pouvez délier le hub du noyau en utilisant :

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

pour remettre le courant - vous pouvez le lier à nouveau en utilisant

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

La commutation de l'alimentation sur chaque port individuellement est plus délicate : j'ai pu utiliser hubpower pour contrôler chaque port - mais il y a un inconvénient : hubpower déconnecte d'abord le usbdevfs, ce qui entraîne la déconnexion de tous les périphériques USB du système, du moins sous ubuntu :

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

Avec cette ioctl J'ai pu désactiver l'alimentation d'un port individuel sans détacher tous les périphériques, mais l'alimentation est immédiatement rétablie (probablement parce que le noyau voit un périphérique non initialisé), ce qui oblige le périphérique USB à effectuer un "redémarrage à froid", ce que je voulais généralement faire. Mon hubpower patché est aquí

0 votes

Les entrées bind/unbind sont confirmées pour fonctionner sur le noyau linux 2.6.34, le chipset ICH8, et Ubuntu 10.04.

7 votes

Bind/unbind n'éteint pas le port USB quel que soit le chipset. Le périphérique est toujours alimenté...

2 votes

Le laser de la souris est éteint, le clavier ne peut pas taper, le modem arrête de clignoter - tout est bon sur ma plateforme

7voto

Carles Points 51

Je voulais faire ça, mais avec mon matériel USB, je ne pouvais pas. J'ai écrit un moyen détourné de le faire ici :

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

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

5voto

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

fonctionne pour ubuntu

2 votes

VOTRE SOLUTION EST LA SEULE QUI AIT FONCTIONNÉ DANS MON CAS. J'utilise un ordinateur portable acer make 12.04LTS Ubuntu.

2 votes

N'éteint pas l'appareil, mais le supprime de la liste des appareils. Comment puis-je mettre le port USB hors tension ?

2 votes

C'est aussi la seule solution qui a fonctionné pour moi pour éteindre une tablette Wacom Intuos5 touch M sans la débrancher (sur Fedora 28)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X