Couper l'alimentation du port USB. Ou coupez l'alimentation de tout le sous-système USB

28

J'ai une lampe USB que j'ai spécifiquement achetée afin de l'éteindre par programme à un certain moment, j'ai donc besoin de couper l'alimentation de son port USB.

Je crois que j'ai un hub USB sur USB6. La lampe est connectée à l'un des ports de ce concentrateur:

#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

Voici ce que j'ai essayé:

Deux solutions sont , la première suggère:

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

mais j'obtiens write error: Invalid argumenten essayant d'écrire à /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 deuxième solution:

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

ce qui coupe l'alimentation du périphérique hub USB.

J'essayais également de suivre ceci :

Mais la sortie de lsusb -tse bloque simplement:

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

Ce qui m'empêche d'utiliser cette méthode pour obtenir la partie '2-1.1':

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

Existe-t-il un autre moyen d'obtenir ces informations?

Sinon, existe-t-il un moyen de couper l'alimentation de l'ensemble du sous-système USB? Quelque chose comme ça modprobe -r usb_etc?

Mon noyau est:

$uname -r
3.2.0-4-amd64
user84207
la source
quelles erreurs de syntaxe? dans ce cas, il n'est pas nécessaire de citer les chaînes simples «suspend», «disabled». si vous avez l'habitude de citer, parfait pour vous, mais dans ce cas, ce n'est pas nécessaire.
user84207
J'ai essayé d'étirer l' lsusb -tappel et je n'ai rien trouvé d'utile dans le temps que j'ai dû le déboguer. Honnêtement, je n'ai pas le temps pour l'instant de trouver des bogues dans lsub, et je ne peux même pas le reproduire maintenant, donc cela dépend probablement des appareils qui sont branchés. Je vais devoir attendre pour rentrer à la maison pour essayer de reproduisez-le.
user84207

Réponses:

20

Vous pouvez utiliser uhubctl - utilitaire de ligne de commande pour contrôler l'alimentation USB par port pour les concentrateurs USB compatibles.

Il ne fonctionne que sur les concentrateurs prenant en charge la commutation d'alimentation par port, mais notez que de nombreuses cartes mères modernes ont des concentrateurs USB qui prennent en charge cette fonctionnalité.

Compiler:

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

Pour répertorier l'état de tous les concentrateurs, leurs emplacements et ports pouvant être contrôlés par uhubctl:

uhubctl

Pour couper l'alimentation sur le port 5 d'un concentrateur unique compatible:

uhubctl -a 0 -p 5

Si vous avez plus d'un concentrateur compatible connecté, utilisez -lpour spécifier l'emplacement du concentrateur pour le contrôler:

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

Pour désactiver puis rallumer:

uhubctl -a 2 -p 5

Notez que les concentrateurs USB 3.0 sont également pris en charge, et bon nombre de nouveaux concentrateurs USB 3.0 fonctionnent réellement bien.

En savoir plus ici .

Divulgation - Je suis l'auteur de uhubctl.

mvp
la source
Un peu plus d'informations serait bien. Surtout parce que vous êtes l'auteur et que ce n'est pas un exemple standard de package sur la façon de l'utiliser, que se passe-t-il s'il y a des capacités / limitations, des risques le cas échéant, les réponses Lien uniquement ne sont pas préférées.
Zachary Brady
2
Eh bien, copier / coller tout le fichier README ne me semble pas être une bonne idée. Il a toutes les mises en garde expliquées.
mvp
Non, le readme entier serait excessif. Juste comment vous pouvez utiliser le programme pour résoudre le problème posé dans la question. Et s'il y a des réserves à ce cas d'utilisation particulier, pas à l'ensemble de l'application. Désolé si je n'ai pas été clair dans mon premier commentaire.
Zachary Brady
1
Pour info: cette méthode fonctionne pour la famille Renesas UPD720202 de contrôleurs hôtes PCIe-USB. :) Merci.
Wossname
Merci @Wossname. Cela vous dérange-t-il de l'ajouter en tant que nouveau numéro sur github.com/mvp/uhubctl/issues ? Je mettrai à jour la liste des appareils pris en charge.
mvp
20

Voir Contrôler une alimentation USB (on / off) avec linux , version courte, pour les noyaux plus récents "suspend" ne fonctionne plus:

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

Mais cela ne coupe pas littéralement l'alimentation, il signale que l'appareil est mis hors tension, c'est à l'appareil de mettre en œuvre la gestion de l'alimentation et de faire la bonne chose.

Vous avez beaucoup de détails dans la documentation officielle du noyau, là, il explique les différents fichiers /sys/bus/usb/devices/.../power/et comment gérer les périphériques et les ports.

Pour les choses qui ne sont pas de vrais périphériques USB (votre lampe USB apparaît-elle dans lsusb?), Vous n'avez pas de chance, je me suis essayé avec une lampe USB et avec un enregistreur GPS qui charge sa batterie et transfère des données via USB qui montre comme un usb cp210x en série, et non plus la mise hors tension. Je peux "déconnecter" le gps avec echo '5-4.6' > /sys/bus/usb/drivers/usb/unbindet le reconnecter avec echo '5-4.6' > /sys/bus/usb/drivers/usb/bindmais la lumière de chargement de la batterie est toujours allumée.

Mais il semble que certains hubs le font correctement .

Jorge Nerín
la source
0

Il n'est PAS nécessaire de modifier individuellement les fichiers " autosuspend_delay_ms ".

La suspension automatique USB peut être désactivée GLOBALEMENT et PERSISTANTEMENT avec:

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

update-grub

systemctl reboot

Cela ne prend que quelques secondes pour tester le correctif proposé et valider son exactitude.

Une capture d'écran annotée d' Ubuntu 18.04 ci-dessous illustre la modification comme décrit ci-dessus, ce qui entraîne le redémarrage de l'hôte avec TOUS les paramètres de suspension automatique USB désactivés:

Démonstration d'Ubuntu 18.04 désactivant globalement la suspension automatique USB

F1Linux
la source