Czy w systemie Linux można ręcznie włączać / wyłączać zasilacze z USB?
Jest taki zewnętrzny wentylator chłodzący USB (taki, którego używasz do chłodzenia się, a nie komputera) i byłoby miło móc nim sterować z terminala, ponieważ chcę ustawić wentylator gdzieś daleko.
Przypuszczam, że może to być również przydatne do wielu innych rzeczy, ponieważ istnieje wiele zabawek USB. Może oczyszczacze powietrza itp. (Chociaż słyszałem, że tak naprawdę nie działają).
power/level
jest teraz przestarzały; użyjpower/control
zamiast tego . (power/wakeup
jest ok.) Ponadto akceptuje tylko „auto” i „on”, a nie „suspend”. „auto” jest wystarczająco inteligentne i jeśli zasilanie nie jest wyłączane w stanie bezczynności, jest to wina urządzenia. W każdym razie nie możesz ręcznie wyłączyć zasilania. Aby uzyskać więcej, zobacz odpowiedź poniżej autorstwa tlwhitec i dokumentację jądra: kernel.org/doc/Documentation/usb/power-management.txtOdpowiedzi:
Uwaga. Informacje zawarte w tej odpowiedzi dotyczą starszych jąder (do 2.6.32). Zobacz odpowiedź tlwhitec, aby uzyskać informacje o nowszych jądrach.
(Może być konieczna zmiana z usb1 na usb n )
Źródło: Documentation / usb / power-management.txt.gz
źródło
sudo foo > bar
jest analizowane jako bezpośrednie wyjściebar
, a następnie uruchamianefoo
przy użyciusudo
. Przekierowanie kończy się niepowodzeniem, ponieważ dzieje się to przed uzyskaniem dostępu do konta roota. Rozwiązaniem jest użyciesudo sh -c 'echo disabled > /sys/bus/usb/devices/usb1/power/wakeup'
i tak dalej: uzyskaj root, uruchom nowe piekło, aby wykonać przekierowanie, a następnie wyślij coś do deskryptora przekierowanego pliku.Zgodnie z dokumentacją , w jądrze 2.6.32 wprowadzono kilka zmian w zarządzaniu energią USB , które wydają się być zgodne z wersją 2.6.38 . Teraz musisz poczekać, aż urządzenie przejdzie w stan bezczynności , którym zarządza dany sterownik urządzenia. Sterownik musi to wspierać, w przeciwnym razie urządzenie nigdy nie osiągnie tego stanu. Niestety teraz użytkownik nie ma szans, aby to wymusić. Jeśli jednak masz szczęście i Twoje urządzenie może stać się bezczynne, aby to wyłączyć, musisz:
lub dla jąder około 2.6.38 i nowszych:
Dosłownie oznacza to przejście w stan wstrzymania w momencie, gdy urządzenie stanie się bezczynne.
Więc jeśli twój wentylator nie jest czymś „inteligentnym”, co może być postrzegane jako urządzenie i kontrolowane przez sterownik, prawdopodobnie nie będziesz miał dużo szczęścia w obecnych jądrach.
źródło
echo "on" > "/sys/bus/usb/devices/usbX/power/control"
, ale myślę, że musisz zrozumieć pierwotny cel. Funkcja automatycznego zawieszania służy jedynie do umożliwienia bezczynnym urządzeniom przejścia w stan niskiego poboru mocy (w którym może wydawać się wyłączone), tylko po to, aby wznowić je później, gdy zajdzie taka potrzeba, przez hosta lub jakieś zdarzenie zewnętrzne. Dzieje się to (lub powinno się zdarzyć) automatycznie. Sam port w rzeczywistości nigdy nie jest naprawdę wyłączony. Naprawdę, przeczytaj dokumentację ;)dmesg | grep "usb"
i użyć numeru po „USB”, na przykład:usb 2-4.4: SerialNumber: A0848020
można użyć:/sys/bus/usb/devices/2-4.4/power/...
. Upewnij się również, że urządzenie nie jest używane. Stworzyłem skrypt, aby uprościć ten procesZnalazłem te rozwiązania, które działają przynajmniej dla poprawnie skonfigurowanego układu koncentratora USB Terminus FE 1.1:
Aby wyłączyć zasilanie wszystkich portów USB huba, możesz odłączyć huba od jądra za pomocą:
aby ponownie włączyć zasilanie - możesz je z powrotem związać za pomocą
2. Przełączanie zasilania w każdym porcie z osobna jest trudniejsze: mogłem użyć hubpower do sterowania każdym portem - ale ma to wadę: hubpower najpierw odłącza usbdevfs, co powoduje odłączenie wszystkich urządzeń USB od systemu, przynajmniej na ubuntu :
Po
ioctl
wyłączeniu tej opcji mogłem wyłączyć zasilanie poszczególnych portów bez odłączania wszystkich urządzeń - ale zasilanie włącza się natychmiast (prawdopodobnie z powodu niezainicjowanego urządzenia jądra), co powoduje, że urządzenie USB po prostu wykonuje „zimny restart”, co jest tym, co ja ogólnie chciałem zrobić. Moja łatana hubpower jest tutajźródło
PowerTOP firmy Intel umożliwia przełączanie urządzeń, takich jak urządzenia peryferyjne USB w czasie rzeczywistym. Nazywa się to „tuningiem”.
Pamiętaj, że Złe oznacza, że urządzenie jest zawsze włączone. Przełączenie na Dobra wyłączy urządzenie po ustawionym czasie nieaktywności (domyślnie 2000 ms).
Zobacz dokumentację PowerTOP, aby dowiedzieć się, jak wprowadzić te zmiany na stałe.
Generuje dla ciebie skrypty konfiguracyjne (prawie tak, jak opisano to na innych plakatach w tym wątku).
UWAGA: Te skrypty nie mają wpływu na zasilanie pinów USB (które jest zawsze włączone).
Wysyłają one tylko protokół sterownika, aby aktywować i dezaktywować urządzenie.
Jeśli chcesz kontrolować moc pinów, możesz użyć obsługiwanego inteligentnego koncentratora USB lub jeszcze lepiej mikrokontrolera .
źródło
Możesz użyć mojego narzędzia uhubctl do kontrolowania mocy USB na port dla kompatybilnych koncentratorów USB.
źródło
Chciałem to zrobić, ale ze sprzętem USB nie mogłem. Napisałem hacky sposób, jak to zrobić tutaj:
http://pintant.cat/2012/05/12/power-off-usb-device/ .
W skrócie: użyłem przekaźnika USB do otwarcia / zamknięcia V CC innego kabla USB ...
źródło
działa dla ubuntu
źródło
Zasilanie USB 5v jest zawsze włączone (nawet gdy komputer jest wyłączony, na niektórych komputerach i na niektórych portach). Prawdopodobnie będziesz musiał zaprogramować Arduino za pomocą jakiegoś przełącznika i sterować nim przez bibliotekę szeregową z USB podłączonego do komputer.
Innymi słowy, połączenie tego samouczka przełącznika i tego samouczka dotyczącego komunikacji przez bibliotekę szeregową z Arduino podłączonym przez USB.
źródło
Powodem, dla którego ludzie publikują takie pytania, jest przerażająca - wręcz „ ZŁA ” - funkcja automatycznego wstrzymywania USB .
Automatyczne zawieszenie zmniejsza moc do „bezczynnego” urządzenia USB i jeśli sterownik urządzenia nie obsługuje tej funkcji prawidłowo, kontakt z urządzeniem może być niemożliwy. Zatem włączanie / wyłączanie portu USB jest objawem problemu, a nie samym problemem.
Pokażę Ci, jak GLOBALNIE wyłączyć automatyczne zawieszanie, eliminując potrzebę ręcznego włączania i wyłączania portów USB:
Krótka odpowiedź:
Nie trzeba do edycji „ autosuspend_delay_ms ” indywidualnie: automatyczne usypianie USB może być wyłączone globalnie i uporczywie za pomocą następujących poleceń:
Na końcu „długiej odpowiedzi” pojawia się zrzut ekranu Ubuntu 18.04, który ilustruje, w jaki sposób osiągnięto moje wyniki.
Długa odpowiedź:
Prawdą jest, że dokumentacja jądra zarządzania energią USB stwierdza, że autosuspend ma zostać wycofane, a zamiast tego „ autosuspend_delay_ms ” służy do wyłączania automatycznego zawieszania USB:
JEDNAK moje testy wykazały, że ustawienie
usbcore.autosuspend=-1
w / etc / default / grub, jak poniżej, może być używane jako GLOBALNY przełącznik funkcji automatycznego zawieszania USB - NIE musisz edytować poszczególnych plików " autosuspend_delay_ms ".Ten sam dokument, do którego prowadzi powyższy link, stwierdza, że wartość „0” jest WŁĄCZONA, a wartość ujemna jest WYŁĄCZONA :
Na poniższym zrzucie ekranu Ubuntu 18.04 z adnotacjami, pokazującym, w jaki sposób moje wyniki zostały osiągnięte (i można je odtworzyć), proszę zauważyć, że domyślną wartością jest „0” ( włączone ) w autosuspend_delay_ms .
Następnie zauważ, że po TYLKO ustawieniu
usbcore.autosuspend=-1
w Grub, te wartości są teraz ujemne ( wyłączone ) po ponownym uruchomieniu. Pozwoli mi to zaoszczędzić kłopotów z edytowaniem poszczególnych wartości i może teraz wyłączyć automatyczne zawieszanie USB za pomocą skryptu.Mam nadzieję, że to sprawia, że wyłączenie automatycznego zawieszania USB jest trochę łatwiejsze i bardziej skryptowalne -
źródło
Miałem problem podczas podłączania telefonu z Androidem, nie mogłem naładować telefonu, ponieważ włącznik zasilania włącza się i wyłącza ... PowerTop pozwolił mi znaleźć to ustawienie i był przydatny do rozwiązania problemu (przyczyną problemu była wartość automatyczna):
źródło