Czy można zresetować połączenie urządzenia USB bez fizycznego odłączania / podłączania od komputera?
W szczególności moje urządzenie to aparat cyfrowy. Używam gphoto2
, ale ostatnio dostaję „błędy odczytu urządzenia”, więc chciałbym spróbować zresetować oprogramowanie połączenia.
Z tego, co mogę powiedzieć, nie ma modułów jądra ładowanych do kamery. Jedyny, który wygląda na spokrewniony, to usbhid
.
command-line
usb
cmcginty
źródło
źródło
Odpowiedzi:
Zapisz następujące jako
usbreset.c
Uruchom następujące polecenia w terminalu:
Skompiluj program:
Uzyskaj identyfikator magistrali i urządzenia urządzenia USB, które chcesz zresetować:
Spraw, aby nasz skompilowany program był wykonywalny:
Uruchom program z uprawnieniami sudo; dokonaj niezbędnych podstawień
<Bus>
i<Device>
identyfikatorów zgodnie zlsusb
poleceniem:Źródło powyższego programu: http://marc.info/?l=linux-usb&m=121459435621262&w=2
źródło
echo $(lsusb | grep Mouse) mouse=$( lsusb | grep Mouse | perl -nE "/\D+(\d+)\D+(\d+).+/; print qq(\$1/\$2)") sudo /path/to/c-program/usbreset /dev/bus/usb/$mouse
usbreset /dev/bus/usb/011/001
jeden z 2 głównych hubów USB 3.0 wlsusb
, pojawia się błąd: „Błąd w ioctl: czy katalog”, jakieś idee? Próbowałem na obu hubach USB 3.0Nie znalazłem się wcześniej w konkretnych okolicznościach, więc nie jestem pewien, czy to wystarczy, ale najprostszym sposobem na zresetowanie urządzenia USB jest to polecenie: (Nie są wymagane żadne aplikacje zewnętrzne)
Właśnie tego używam do resetowania Kinect, ponieważ libfreenect wydaje się nie mieć API do przywracania go do stanu uśpienia. Jest na moim pudełku Gentoo, ale jądro powinno być wystarczająco nowe, aby używać tej samej struktury ścieżki dla sysfs.
Oczywiście, że nie,
1-4.6
ale możesz albo pobrać tę ścieżkę urządzenia z dziennika jądra (dmesg
), albo użyć czegoś takiego,lsusb
aby uzyskać identyfikatory dostawcy i produktu, a następnie użyć szybkiego polecenia, aby wyświetlić relacje między ścieżkami do różnych dostawców / pary identyfikatora produktu:źródło
echo 1 > /sys/bus/usb/devices/whatever/authorized
skryptu w celu ponownego włączenia urządzenia, gdy tylko zostanie wyłączone. Zrobiłem to zarówno na mojej myszy, jak i na klawiaturze USB i skończyłem z całkowicie głuchym systemem :)| sudo tee ...
podejścia do uprzywilejowanego/sys
pisze: To psuje się źle, jeśli nie masz jeszcze buforowanych poświadczeń sudo.sudo sh -c "..."
działa zgodnie z oczekiwaniami, gdy sudo musi poprosić o hasło.Spowoduje to zresetowanie wszystkich podłączonych portów USB1 / 2/3 [1]:
Wierzę, że to rozwiąże twój problem. Jeśli nie chcesz resetować wszystkich punktów końcowych USB, możesz użyć odpowiedniego identyfikatora urządzenia z
/sys/bus/pci/drivers/ehci_hcd
Uwagi: [1]:
*hci_hcd
sterowniki jądra zwykle kontrolują porty USB.ohci_hcd
iuhci_hcd
są dla portów USB 1.1,ehci_hcd
są dla portów USB2 ixhci_hcd
dla portów USB3. (patrz https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire) )źródło
ls: cannot access /sys/bus/pci/drivers/ehci_hcd/: No such file or directory
to rozwiązało problem, mysz natychmiast zaczęła działać. +1*hci_hcd
z*hci-pci
, jak kierowca hci_hcd jest już skompilowany do jądra.for i in /sys/bus/usb/drivers/*/*:*; do
Musiałem zautomatyzować to w skrypcie python, więc dostosowałem niezwykle pomocną odpowiedź LiLo na następujące:
W moim przypadku był to sterownik cp210x (o którym mogłem powiedzieć
lsmod | grep usbserial
), więc możesz zapisać powyższy fragment jako reset_usb.py, a następnie zrobić to:Może to być również pomocne, jeśli nie masz jeszcze konfiguracji kompilatora ac w swoim systemie, ale masz python.
źródło
USBDEVFS_RESET
. Czy zawsze jest tak samo dla wszystkich systemów?USBDEVFS_RESET
jest taki sam dla wszystkich systemów. W przypadku MIPS jest to 536892692.-t
argumentu (tryb drzewa), aby wyświetlić informacje o sterowniku, których oczekuje ten skrypt, ale skrypt potrzebuje następnie aktualizacji, aby przeanalizować różne generowane linie wyjścioweStworzyłem skrypt w języku Python, który upraszcza cały proces na podstawie odpowiedzi tutaj.
Zapisz poniższy skrypt jako reset_usb.py lub sklonuj to repozytorium .
Stosowanie:
Scenariusz:
źródło
Ponieważ szczególnym przypadkiem tego pytania jest problem z komunikacją gphoto2 z aparatem na USB, w gphoto2 istnieje możliwość zresetowania połączenia USB:
Być może ta opcja nie istniała w 2010 r., Kiedy zadano pytanie.
źródło
Najszybszym sposobem na zresetowanie będzie zresetowanie samego kontrolera USB. Spowoduje to wymuszenie udev do wyrejestrowania urządzenia po rozłączeniu, a rejestracja powróci po włączeniu.
Powinno to działać w większości środowisk komputerowych. Jeśli jednak używasz niestandardowego sprzętu, możesz po prostu iterować nazwy urządzeń. Dzięki tej metodzie nie musisz szukać nazwy urządzenia przez lsusb. Możesz również włączyć do skryptu automatycznego.
źródło
ehci_hcd
jeehci-pci
. Więcej informacji na temat tego rozwiązania (być może skąd pochodzi?): Davidjb.com/blog / 2012/06 /…Używam swego rodzaju młota, ponownie ładując moduły. To jest mój skrypt usb_reset.sh:
A to jest mój plik usługi systemd /usr/lib/systemd/system/usbreset.service, który uruchamia usb_reset.sh po uruchomieniu mojego menedżera diplay:
źródło
rmmod: ERROR: Module xhci_pci is builtin.
Stworzyłem skrypt Pythona, który zresetuje określone urządzenie USB na podstawie numeru urządzenia. Możesz znaleźć numer urządzenia z polecenia lsusb.
na przykład:
W tym ciągu 004 jest numerem urządzenia
źródło
Oto skrypt, który resetuje tylko pasujący identyfikator produktu / dostawcy.
źródło
$DIR
zniknie, a urządzenie nie będzie widoczne?Czy ktoś zamówił młot? Jest to zestawione z różnych innych odpowiedzi tutaj.
źródło
$@
W proxy sudo jest tylko siła habbit mając zapobiega błędy gdybym później zdecydować, aby dodać argumenty (i zapomnij zaktualizować proxy sudo).Czasami chcę wykonać tę operację na określonym urządzeniu, określonym przez VID (identyfikator dostawcy) i PID (identyfikator produktu). Jest to skrypt, który uznałem za przydatny w tym celu, który wykorzystuje zręczną bibliotekę libusb.
Pierwszy bieg:
Następnie resetDeviceConnection tego pliku c ++ powinien wykonać to zadanie polegające na zresetowaniu połączenia urządzenia określonego przez vid i pid.
(skradziony z mojego osobistego katalogu TIL: https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )
źródło
Zrobiłem prosty skrypt bash do zresetowania konkretnego urządzenia USB.
źródło
Być może działa to również w przypadku aparatu:
Po przywróceniu głodującego
USB 3.0
dysku twardego na3.4.42
Linux (kernel.org) po mojej stronie.dmesg
powiedział, że upłynął limit czasu poleceń po 360s (przepraszam, nie mogę skopiować syslog tutaj, nie podłączonych sieci) i dysk został całkowicie zawieszony. Procesy uzyskiwania dostępu do urządzenia zostały zablokowane w jądrze, niemożliwe do zabicia.NFS
zawieszony,ZFS
zawieszony,dd
zawieszony.Po wykonaniu tej czynności wszystko znów działało.
dmesg
powiedział tylko jeden wiersz oUSB
znalezionym urządzeniu.Naprawdę nie mam pojęcia, co szczegółowo robi poniższe. Ale zadziałało.
Poniższy przykładowy wynik pochodzi z Debian Squeeze z
2.6.32-5-686
jądrem, więc myślę, że działa dla wersji 2.6 i nowszych:Jeśli to nie zadziała, być może ktoś inny może wymyślić, jak wysłać prawdziwy reset do urządzenia.
źródło
Wypróbuj to, to oprogramowanie odłączyć (Eject).
Czasami nie działa po prostu odznacz urządzenie dla niektórych urządzeń.
Przykład:
Chcę usunąć lub wysunąć mój „Genius NetScroll 120”.
Następnie najpierw sprawdź podłączone urządzenie USB
Ok, znalazłem moją mysz, ma ona magistralę 002, urządzenie 009, idVendor 0458 i idProduct 003a, więc jest to informacja o urządzeniu referencyjnym na temat myszy.
Jest to ważne, ponieważ numer magistrali jest początkową ścieżką nazwy urządzenia i sprawdzę identyfikator produktu i dostawcę, aby upewnić się, że urządzenie ma zostać usunięte.
Zwróć uwagę na foldery, sprawdź początek z folderem nr 2, sprawdzę ten, ponieważ moja magistrala to 002, i jeden po drugim sprawdzam każdy folder zawierający poprawny idVendor i idProduct na temat moich informacji o myszy.
W takim przypadku odzyskam informacje za pomocą tego polecenia:
Ok, ścieżka /sys/bus/usb/drivers/usb/2-1.3/ pasuje do mojej myszy informacyjnej! XDDD.
Czas usunąć urządzenie!
Podłącz ponownie urządzenie USB i znów działa!
źródło
Jeśli znasz nazwę swojego urządzenia, ten skrypt w języku Python będzie działał:
źródło