it-swarm.com.de

Ausschalten des USB-Anschlusses. Oder schalten Sie das gesamte USB-Subsystem aus

Ich habe eine USB-Lampe, die ich speziell gekauft habe, um sie zu einem bestimmten Zeitpunkt programmgesteuert auszuschalten. Daher muss ich die Stromversorgung des USB-Anschlusses unterbrechen.

Ich glaube, ich habe einen USB-Hub bei USB6. Die Lampe ist an einen der Ports 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 schlägt vor:

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 argument, wenn ich versuche, an /sys/bus/usb/devices/usb1/power/level zu schreiben:

$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 das USB-Hub-Gerät ausgeschaltet.

Ich habe auch versucht zu folgen this :

Aber die Ausgabe von lsusb -t Hängt nur:

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

Was mich daran hindert, 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?

Gibt es alternativ eine Möglichkeit, die Stromversorgung des gesamten USB-Subsystems abzuschalten? So etwas wie modprobe -r usb_etc?

Mein Kernel ist:

$uname -r
3.2.0-4-AMD64
31
user84207

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

Es funktioniert nur auf Hubs, die das Umschalten pro 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

Systemweite Installation als /usr/sbin/uhubctl:

Sudo make install

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

Sudo uhubctl

(Sie können die Verwendung von Sudo vermeiden, wenn Sie udev USB-Berechtigungen konfigurieren.).

So schalten Sie Port 5 eines einzelnen kompatiblen Hubs aus:

Sudo uhubctl -a 0 -p 5

Wenn Sie mehr als einen kompatiblen Hub angeschlossen haben, verwenden Sie -l um den Hub-Standort anzugeben, um ihn zu steuern:

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

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

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

23
mvp

Siehe Steuern eines USB-Netzteils (Ein/Aus) mit Linux , Kurzversion, für neuere Kernel funktioniert "suspend" nicht mehr:

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

Aber es unterbricht nicht buchstäblich die Stromversorgung, es signalisiert dem Gerät das Ausschalten, es liegt an dem Gerät, die Energieverwaltung zu implementieren und das Richtige zu tun.

Sie haben viele Details in der offizielle Dokumentation im Kernel, dort werden die verschiedenen Dateien in /sys/bus/usb/devices/.../power/ Und die Verwaltung der Geräte und Ports erläutert.

Für Dinge, die keine echten USB-Geräte sind (wird Ihre USB-Lampe in lsusb angezeigt?), Haben Sie möglicherweise Pech. Ich habe mich mit einer USB-Lampe und einem GPS-Logger versucht, der den Akku auflädt und Daten über den angezeigten USB überträgt als cp210x USB zu seriell, und Poweroff auch nicht. Ich kann das GPS mit echo '5-4.6' > /sys/bus/usb/drivers/usb/unbind "Trennen" und mit echo '5-4.6' > /sys/bus/usb/drivers/usb/bind Wieder verbinden, aber die Batterieladelampe ist immer eingeschaltet.

Aber es scheint, dass einige Hubs machen es richtig .

20
Jorge Nerín

Es ist [~ # ~] nicht [~ # ~] erforderlich, " autosuspend_delay_ms "Dateien.

USB-Autosuspend kann dauerhaft [~ # ~] global [~ # ~] und [~ # ~] deaktiviert werden [~ # ~] mit:

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

update-grub

systemctl reboot

Es dauert nur wenige Sekunden, um das vorgeschlagene Update zu testen und seine Richtigkeit zu überprüfen.

Ein Ubuntu 18.04 kommentierter Screenshot unten zeigt das Ändern wie oben beschrieben, was zu einem Neustart des Hosts mit [~ # ~] alle [~ # ~] USB-Autosuspend-Einstellungen deaktiviert:

(Ubuntu 18.04 demo globally disabling USB autosuspend

0
F1Linux