Mam lampę USB, którą kupiłem specjalnie w celu programowego wyłączenia w określonym czasie, dlatego muszę odłączyć zasilanie od portu USB.
Wydaje mi się, że mam hub usb w usb6. Lampa jest podłączona do jednego z portów w tym koncentratorze:
#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
Oto, co próbowałem:
Dwa rozwiązania są tutaj pierwszy proponuje:
echo disabled > /sys/bus/usb/devices/usb1/power/wakeup
echo suspend > /sys/bus/usb/devices/usb1/power/level # turn off
ale dostaję, write error: Invalid argument
gdy próbuję napisać do /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
Drugie rozwiązanie:
sudo bash -c 'echo 0 > /sys/bus/usb/devices/usb6/power/autosuspend_delay_ms; echo auto > /sys/bus/usb/devices/usb6/power/control'
który wyłącza zasilanie urządzenia USB-Hub.
Próbowałem również śledzić to :
Ale wynik po lsusb -t
prostu zawiesza się:
$lsusb -t
4-1:0.0: No such file or directory
4-1:0.1: No such file or directory
^C
Co uniemożliwia mi użycie tej metody, aby uzyskać część „2-1.1”:
echo '2-1.1' > /sys/bus/usb/drivers/usb/unbind
Czy istnieje alternatywny sposób uzyskania tych informacji?
Alternatywnie, czy istnieje sposób na odcięcie zasilania całego podsystemu USB? Coś takiego modprobe -r usb_etc
?
Moje jądro to:
$uname -r
3.2.0-4-amd64
źródło
lsusb -t
połączenie i nie znalazłem nic przydatnego w czasie, kiedy musiałem go debugować. Naprawdę nie mam teraz czasu na znalezienie błędów w lsub i nie mogę nawet teraz odtworzyć tego, więc prawdopodobnie zależy to od podłączonych urządzeń. Będę musiał poczekać, aż wrócę do domu, aby spróbować powielać to.Odpowiedzi:
Możesz użyć narzędzia wiersza poleceń uhubctl do sterowania zasilaniem USB na port dla zgodnych koncentratorów USB.
Działa tylko na koncentratorach obsługujących przełączanie zasilania na port, ale należy pamiętać, że wiele nowoczesnych płyt głównych ma koncentratory USB obsługujące tę funkcję.
Kompilować:
Aby wyświetlić status wszystkich koncentratorów, ich lokalizacji i portów, które mogą być kontrolowane przez uhubctl:
Aby wyłączyć zasilanie portu 5 pojedynczego kompatybilnego koncentratora:
Jeśli masz więcej niż jeden kompatybilny koncentrator, użyj go,
-l
aby określić lokalizację koncentratora, aby go kontrolować:Aby wyłączyć, a następnie włączyć zasilanie:
Należy pamiętać, że koncentratory USB 3.0 są również obsługiwane, a całkiem sporo nowych koncentratorów USB 3.0 faktycznie działa dobrze.
Przeczytaj więcej tutaj .
Ujawnienie - jestem autorem uhubctl.
źródło
Zobacz Kontrolowanie zasilacza USB (włączanie / wyłączanie) w systemie Linux , wersja skrócona, dla nowszych jąder „zawieszenie” już nie działa:
Ale to nie dosłownie odcina zasilanie, sygnalizuje, że urządzenie się wyłączy, to od urządzenia zależy zarządzanie energią i właściwe postępowanie.
Masz wiele szczegółów w oficjalnej dokumentacji jądra, tam objaśnia różne pliki
/sys/bus/usb/devices/.../power/
i jak zarządzać urządzeniami i portami.W przypadku rzeczy, które nie są prawdziwymi urządzeniami USB (czy Twoja lampa USB pokazuje się w LSUSB?) Nie masz szczęścia, próbowałem się z lampą USB i rejestratorem GPS, który ładuje baterię i przesyła dane przez USB, który pokazuje jako cp210x USB do szeregowego, i nie wyłącza się. Mogę „odłączyć” GPS za pomocą
echo '5-4.6' > /sys/bus/usb/drivers/usb/unbind
i ponownie go podłączyć,echo '5-4.6' > /sys/bus/usb/drivers/usb/bind
ale funkcja ładowania baterii jest zawsze włączona.Ale wydaje się, że niektóre huby robią to poprawnie .
źródło
NIE jest konieczna indywidualna edycja plików „ autosuspend_delay_ms ”.
Automatyczne usypianie USB można wyłączyć globalnie i uporczywie z:
Potrwa zaledwie kilka sekund, aby przetestować proponowaną poprawkę i zweryfikować jej poprawność.
Poniższy zrzut ekranu z adnotacjami na Ubuntu 18.04 ilustruje modyfikację w sposób opisany powyżej, co powoduje ponowne uruchomienie hosta z wyłączonymi WSZYSTKIMI ustawieniami automatycznego zawieszania USB:
źródło