USB-Anschluss ausschalten. Oder schalten Sie das gesamte USB-Subsystem aus


28

Ich habe eine USB-Lampe, die ich speziell gekauft habe, um sie zu einem bestimmten Zeitpunkt programmgesteuert auszuschalten. Daher muss ich die Stromversorgung für den USB-Anschluss unterbrechen.

Ich glaube, ich habe einen USB-Hub bei USB6. Die Lampe ist an einen der Anschlüsse in diesem Hub angeschlossen:

#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

Folgendes habe ich versucht:

Zwei Lösungen sind hier , die erste schon sagt:

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

aber ich bekomme write error: Invalid argumentbeim Versuch zu schreiben /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

Die zweite Lösung:

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

Dadurch wird die Stromversorgung des USB-Hub-Geräts ausgeschaltet.

Ich versuche auch zu folgen , dies :

Aber die Ausgabe von lsusb -thängt nur:

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

Das hindert mich daran, diese Methode zu verwenden, um den '2-1.1'-Teil dazu zu bringen:

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

Gibt es eine alternative Möglichkeit, diese Informationen zu erhalten?

Alternativ gibt es eine Möglichkeit, das gesamte USB-Subsystem auszuschalten? So etwas wie modprobe -r usb_etc?

Mein Kernel ist:

$uname -r
3.2.0-4-amd64

Welche Syntaxfehler? In diesem Fall ist es nicht erforderlich, die einfachen Zeichenfolgen "suspend" und "disabled" in Anführungszeichen zu setzen. Wenn Sie gerne zitieren, ist dies eine gute Gewohnheit für Sie, in diesem Fall wird es jedoch nicht benötigt.
User84207

Ich habe versucht, den lsusb -tAnruf zu verfolgen , und habe in der Zeit, in der ich ihn debuggen musste, nichts Nützliches gefunden. Ich habe momentan ehrlich gesagt keine Zeit, Fehler in lsub zu finden, und ich kann sie momentan nicht einmal reproduzieren. Das hängt also wahrscheinlich von den angeschlossenen Geräten ab. Ich muss warten, bis ich nach Hause komme, um es zu versuchen reproduziere es.
User84207

Antworten:


20

Sie können das Befehlszeilenprogramm uhubctl verwenden , um die USB-Leistung pro Port für kompatible USB-Hubs zu steuern.

Es funktioniert nur bei Hubs, die das Schalten per Port unterstützen. Beachten Sie jedoch, dass viele moderne Motherboards über USB-Hubs verfügen, die diese Funktion unterstützen.

Kompilieren:

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

So listen Sie den Status aller Hubs, ihrer Standorte und Ports auf, die von uhubctl gesteuert werden können:

uhubctl

So schalten Sie Port 5 eines einzelnen kompatiblen Hubs aus:

uhubctl -a 0 -p 5

Wenn Sie mehr als einen kompatiblen Hub angeschlossen haben, -lgeben Sie den Hub-Standort an, um ihn zu steuern:

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

So schalten Sie das Gerät aus und wieder ein:

uhubctl -a 2 -p 5

Beachten Sie, dass auch USB 3.0-Hubs unterstützt werden und einige neue USB 3.0-Hubs tatsächlich gut funktionieren.

Lesen Sie hier mehr .

Offenlegung - Ich bin der Autor von uhubctl.


Ein bisschen mehr Information wäre nett. Vor allem, weil Sie der Autor sind und es kein Standardpaket für die Verwendung ist. Was passiert, wenn Funktionen / Einschränkungen vorhanden sind und Risiken bestehen? Antworten nur auf Links werden nicht bevorzugt.
Zachary Brady

2
Nun, das Kopieren / Einfügen der gesamten README- Datei scheint mir keine gute Idee zu sein. Es hat alle Vorbehalte erklärt.
MVP

Nein, die ganze Liesmich wäre übertrieben. Wie Sie das Programm verwenden können, um das in der Frage gestellte Problem zu lösen. Und wenn es irgendwelche Einschränkungen für diesen bestimmten Anwendungsfall gibt, nicht für die gesamte Anwendung. Entschuldigung, wenn ich in meinem ersten Kommentar nicht klar war.
Zachary Brady

1
Zu Ihrer Information: Diese Methode funktioniert für die Renesas UPD720202-Familie von PCIe-USB-Hostcontrollern. :) Vielen Dank.
Wossname

Danke @Wossname. Haben Sie etwas dagegen, es als neue Ausgabe unter github.com/mvp/uhubctl/issues hinzuzufügen ? Ich werde die Liste der unterstützten Geräte aktualisieren.
MVP

20

Siehe Steuern eines USB-Netzteils (ein / aus) mit Linux , kurze Version, für neuere Kernel "suspend" funktioniert nicht mehr:

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

Es unterbricht jedoch nicht buchstäblich die Stromversorgung, sondern signalisiert dem Gerät, dass es ausgeschaltet werden soll. Es liegt an dem Gerät, die Energieverwaltung zu implementieren und das Richtige zu tun.

Sie haben viele Details in der offiziellen Dokumentation im Kernel, dort werden die verschiedenen Dateien erklärt/sys/bus/usb/devices/.../power/ und wie man die Geräte und Ports verwaltet.

Für Dinge, die keine echten USB-Geräte sind (wird Ihre USB-Lampe in Lsusb angezeigt?), Habe ich mich mit einer USB-Lampe und einem GPS-Logger versucht, der den Akku auflädt und Daten über USB überträgt, die angezeigt werden up als cp210x usb zu seriell, und auch nicht ausschalten. Ich kann das GPS mit "trennen" echo '5-4.6' > /sys/bus/usb/drivers/usb/unbindund es mit wieder verbindenecho '5-4.6' > /sys/bus/usb/drivers/usb/bind aber die Batterieladeleuchte ist immer an.

Aber es scheint, dass einige Hubs es richtig machen .


0

Es ist NICHT erforderlich, " autosuspend_delay_ms " -Dateien einzeln zu bearbeiten .

USB Autosuspend kann GLOBAL und DAUERHAFT deaktiviert werden mit:

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

update-grub

systemctl reboot

Es dauert nur ein paar Sekunden, um den vorgeschlagenen Fix zu testen und seine Richtigkeit zu überprüfen.

Ein Ubuntu 18.04 kommentierten Screenshot unten zeigt es , wie oben beschrieben , die Ergebnisse in Host - Modifikation mit dem Neustart ALLE USB Autosuspend Einstellungen deaktiviert ist :

Ubuntu 18.04 Demo deaktiviert den automatischen USB-Suspend

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.