web-dev-qa-db-fra.com

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

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 ici , 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 je reçois write error: Invalid argument lorsque vous essayez d'écrire dans /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 aussi de suivre this :

Mais la sortie de lsusb -t se 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 modprobe -r usb_etc?

Mon noyau est:

$uname -r
3.2.0-4-AMD64
31
user84207

Vous pouvez utiliser mon outil 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 installer à l'échelle du système en tant que /usr/sbin/uhubctl:

Sudo make install

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

Sudo uhubctl

(vous pouvez éviter d'utiliser Sudo si vous configurez les autorisations USB udev).

Pour mettre le port 5 hors tension d'un concentrateur compatible unique:

Sudo uhubctl -a 0 -p 5

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

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

Pour désactiver puis rallumer:

Sudo 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.

Lire plus ici .

23
mvp

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 à l'appareil de s'éteindre, 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 le documentation officielle dans le noyau, là il explique les différents fichiers dans /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 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/unbind et reconnectez-le avec echo '5-4.6' > /sys/bus/usb/drivers/usb/bind mais le voyant de charge de la batterie est toujours allumé.

Mais il semble que certains hubs le font correctement .

20
Jorge Nerín

Il n'est [~ # ~] pas [~ # ~] nécessaire de modifier individuellement " autosuspend_delay_ms "fichiers.

La suspension automatique USB peut être désactivée [~ # ~] globalement [~ # ~] et [~ # ~] de manière persistante [~ # ~] 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 ci-dessous Ubuntu 18.04 illustre la modification décrite ci-dessus, ce qui entraîne le redémarrage de l'hôte avec [~ # ~] tous [~ # ~] Paramètres de suspension automatique USB désactivés:

Ubuntu 18.04 demo globally disabling USB autosuspend

0
F1Linux