Est-il possible d'activer/désactiver manuellement les alimentations USB avec Linux?
Il y a ce ventilateur de refroidissement USB externe (celui que vous utilisez pour vous rafraîchir, pas le PC), et il serait bien de pouvoir le contrôler depuis le terminal, car je veux placer 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 que les purificateurs d'air, etc. (j'ai entendu dire qu'ils ne marchaient pas vraiment).
Remarque. Les informations contenues dans cette réponse sont pertinentes pour les noyaux plus anciens (jusqu'à 2.6.32). Voir réponse de tlwhitec pour plus d'informations sur les nouveaux noyaux.
# 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
Selon le docs, plusieurs modifications ont été apportées à la gestion de l'alimentation USB à partir de noyaux . 2.6.32 , qui semblent s'installer dans 2.6.38 . Vous devez maintenant attendre que le périphérique devienne inactif , ce qui est régi par le pilote de périphérique concerné. Le pilote doit le prendre en charge, sinon le périphérique n'atteindra jamais cet état. Malheureusement, l'utilisateur n'a aucune chance de le forcer. Toutefois, si vous avez de la chance et que votre appareil peut devenir inactif, vous devez:
echo "0" > "/sys/bus/usb/devices/usbX/power/autosuspend"
echo "auto" > "/sys/bus/usb/devices/usbX/power/level"
ou, pour les noyaux supérieurs aux 2.6.38 et supérieurs:
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 fan soit quelque chose d '"intelligent" pouvant ê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.
J'ai trouvé ces solutions qui fonctionnent au moins pour une puce de concentrateur USB Terminus FE 1.1 correctement configurée:
1.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 lier de nouveau 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 comporte un inconvénient: hubpower commence par déconnecter les fichiers usbdevfs qui entraînent la déconectivité de tous les périphériques USB. du système, au moins sur Ubuntu:
usb_ioctl.ioctl_code = USBDEVFS_DISCONNECT;
rc = ioctl(fd, USBDEVFS_IOCTL, &usb_ioctl);
Avec cette ioctl
désactivée, je pouvais couper l’alimentation de port individuel sans déconnecter tous les périphériques - mais le courant est immédiatement rétabli (probablement parce que le noyau voit un périphérique non initialisé), ce qui provoque un redémarrage à froid du périphérique USB "qui est ce que je voulais généralement faire. Mon hubpower corrigé est ici
PowerTOP d’Intel vous permet de basculer en temps réel sur des périphériques tels que des périphériques USB. Celles-ci sont appelées "accordables".
Sudo apt install powertop
Sudo powertop
Notez que Bad signifie que l'appareil est toujours allumé. Le passage à Bon éteindra l'appareil après le délai d'enregistrement inactif prédéfini (la valeur par défaut est 2 000 ms).
Voir les documents PowerTOP pour savoir comment rendre ces modifications permanentes.
Il génère les scripts de configuration pour vous (à peu près comme décrit par d’autres affiches sur ce sujet).
REMARQUE: ces scripts n’affectent pas l’alimentation des broches 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 .
Vous pouvez utiliser uhubctl - utilitaire de ligne de commande pour contrôler l’alimentation USB par port pour les concentrateurs USB compatibles.
Divulgation - Je suis l'auteur de uhubctl.
Je voulais faire cela, et avec mon matériel USB, je ne pouvais pas. J'ai écrit un moyen 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 Vc d'un autre câble USB ...
echo '2-1' |Sudo tee /sys/bus/usb/drivers/usb/unbind
travaille pour Ubuntu
L’USB 5v est toujours sous tension (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é au ordinateur.
En d'autres termes, une combinaison de this changer de tutoriel et de this tutoriel sur la communication via la bibliothèque série à Arduino branché via USB.
Un problème s'est produit lors de la connexion de mon téléphone Android. Je ne pouvais pas charger mon téléphone, car l'interrupteur était allumé puis éteint ... PowerTop m'a permis de trouver ce paramètre et m'a aidé à résoudre le problème était à l'origine du problème):
echo 'on' | Sudo tee /sys/bus/usb/devices/1-1/power/control
La raison pour laquelle les gens posent des questions comme celle-ci est due à la redoutable- "DIABLE" - suspension automatique USB " caractéristique ".
La suspension automatique met automatiquement un périphérique USB "inactif" hors tension et, à moins que le pilote du périphérique ne prenne cette fonctionnalité en charge correctement, il risque de devenir impossible à contacter. Allumer/éteindre un port USB est donc un symptôme du problème, pas le problème en lui-même.
Je vais vous montrer comment GLOBALEMENT désactiver la suspension automatique, éliminant ainsi la nécessité d'activer et de désactiver manuellement les ports USB:
Vous n'avez PAS besoin de modifier " autosuspend_delay_ms " individuellement: la suspension automatique USB peut être désactivée globalement et DE MANIÈRE PERSISTANTE à l'aide des commandes suivantes:
sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="/&usbcore.autosuspend=-1 /' /etc/default/grub
update-grub
systemctl reboot
Un écran Ubuntu 18.04 suit à la fin de la "Réponse longue" illustrant comment mes résultats ont été atteints.
Il est vrai que la documentation du noyau sur la gestion de l'alimentation USB indique que autosuspend doit être obsolète et se trouver à sa place " autosuspend_delay_ms "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 mon test révèle que la configuration de usbcore.autosuspend=-1
dans /etc/default/grub comme ci-dessous peut être utilisé comme commutateur GLOBAL pour la suspension automatique USB fonctionnalité- vous ne PAS devez modifier individuellement " autosuspend_delay_ms "fichiers.
Le même document lié ci-dessus indique que la valeur "0" est ENABLED et a valeur négative est DÉSACTIVÉ:
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 ci-dessous Ubuntu 18.04 illustrant comment mes résultats ont été obtenus (et reproductibles), remarquez que la valeur par défaut est "0" ( activé ) dans autosuspend_delay_ms .
Notez ensuite qu’après que SEULEMENT ait réglé usbcore.autosuspend=-1
dans Grub, ces valeurs sont maintenant négatives () désactivées ) après le redémarrage. Cela me épargnera la peine de modifier des valeurs individuelles et permet maintenant de script pour désactiver la suspension automatique USB.
Espérons que cela rende la désactivation de la suspension automatique USB un peu plus facile et plus scriptable-