Wyłączanie zasilania portu USB. Lub wyłącz zasilanie całego podsystemu USB

28

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 argumentgdy 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 -tprostu 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
użytkownik84207
źródło
jakie błędy składniowe? w tym przypadku nie ma potrzeby cytowania prostych ciągów „zawieszenie”, „wyłączone”. jeśli masz w zwyczaju cytowania, to świetnie dla Ciebie, ale w tym przypadku nie jest to konieczne.
user84207,
Próbowałem nawiązać lsusb -tpołą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.
user84207

Odpowiedzi:

20

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ć:

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

Aby wyświetlić status wszystkich koncentratorów, ich lokalizacji i portów, które mogą być kontrolowane przez uhubctl:

uhubctl

Aby wyłączyć zasilanie portu 5 pojedynczego kompatybilnego koncentratora:

uhubctl -a 0 -p 5

Jeśli masz więcej niż jeden kompatybilny koncentrator, użyj go, -laby określić lokalizację koncentratora, aby go kontrolować:

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

Aby wyłączyć, a następnie włączyć zasilanie:

uhubctl -a 2 -p 5

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.

mvp
źródło
Przydałoby się trochę więcej informacji. Zwłaszcza, że ​​jesteś autorem i nie jest to standardowy przykład pakietu, w jaki sposób z niego korzystać, co jeśli ma jakiekolwiek możliwości / ograniczenia, ryzykuje, jeśli tak, odpowiedzi tylko na link nie są preferowane.
Zachary Brady
2
Cóż, kopiowanie / wklejanie całego pliku README nie wydaje mi się dobrym pomysłem. Wyjaśniono wszystkie zastrzeżenia.
mvp
Nie, cały readme byłby nadmierny. Jak wykorzystać program do rozwiązania problemu postawionego w pytaniu. A jeśli są jakieś zastrzeżenia do tego konkretnego przypadku użycia, nie cała aplikacja. Przepraszam, jeśli nie byłem jasny w moim pierwszym komentarzu.
Zachary Brady
1
Informacje: Ta metoda działa w przypadku kontrolerów hosta PCIe-USB z rodziny UPD720202 firmy Renesas. :) Dzięki.
Wossname
Dzięki @Wossname. Czy masz coś przeciwko dodaniu go jako nowego problemu na github.com/mvp/uhubctl/issues ? Zaktualizuję listę obsługiwanych urządzeń.
mvp
20

Zobacz Kontrolowanie zasilacza USB (włączanie / wyłączanie) w systemie Linux , wersja skrócona, dla nowszych jąder „zawieszenie” już nie działa:

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

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/unbindi ponownie go podłączyć, echo '5-4.6' > /sys/bus/usb/drivers/usb/bindale funkcja ładowania baterii jest zawsze włączona.

Ale wydaje się, że niektóre huby robią to poprawnie .

Jorge Nerín
źródło
0

NIE jest konieczna indywidualna edycja plików „ autosuspend_delay_ms ”.

Automatyczne usypianie USB można wyłączyć globalnie i uporczywie z:

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

update-grub

systemctl reboot

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:

Demo systemu Ubuntu 18.04 globalnie wyłączające automatyczne zawieszanie USB

F1Linux
źródło