Ist es möglich, die Verbindung eines USB-Geräts zurückzusetzen, ohne die Verbindung zum PC physisch zu trennen / herzustellen?
Insbesondere ist mein Gerät eine Digitalkamera. Ich verwende gphoto2
, aber in letzter Zeit erhalte ich "Geräte-Lesefehler", daher möchte ich versuchen, die Verbindung per Software zurückzusetzen.
Soweit ich weiß, sind keine Kernelmodule für die Kamera geladen. Der einzige, der verwandt aussieht, ist usbhid
.
command-line
usb
cmcginty
quelle
quelle
Antworten:
Speichern Sie Folgendes als
usbreset.c
Führen Sie im Terminal die folgenden Befehle aus:
Kompilieren Sie das Programm:
Rufen Sie die Bus- und Geräte-ID des USB-Geräts ab, das Sie zurücksetzen möchten:
Machen Sie unser kompiliertes Programm ausführbar:
Führen Sie das Programm mit sudo-Berechtigung aus. Ersetzen Sie
<Bus>
und<Device>
ids nach Bedarf , indem Sie den folgendenlsusb
Befehl ausführen :Quelle des obigen Programms: http://marc.info/?l=linux-usb&m=121459435621262&w=2
quelle
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
, ist das einer der 2 usb 3.0 root hubs beilsusb
, er fehler: "fehler in ioctl: ist ein verzeichnis", irgendein ideia? Ich habe es auf beiden USB 3.0-Hubs versuchtIch habe mich unter Ihren speziellen Umständen noch nicht wiedergefunden, daher bin ich mir nicht sicher, ob dies ausreichen wird. Der einfachste Weg, ein USB-Gerät zurückzusetzen, ist jedoch der folgende Befehl: (Keine externen Apps erforderlich)
Dies ist die tatsächliche Einstellung, mit der ich meinen Kinect zurücksetze, da libfreenect anscheinend keine API hat, um ihn wieder in den Ruhezustand zu versetzen. Es befindet sich auf meiner Gentoo-Box, aber der Kernel sollte neu genug sein, um dieselbe Pfadstruktur für sysfs zu verwenden.
Mit freundlichen Grüßen,
1-4.6
aber Sie können diesen Gerätepfad entweder aus Ihrem Kernel-Protokoll (dmesg
) abrufen oderlsusb
die Hersteller- und Produkt-IDs abrufen und dann mit einem kurzen Befehl wie diesem auflisten, wie sich die Pfade auf verschiedene Hersteller beziehen / Produkt-ID-Paare:quelle
echo 1 > /sys/bus/usb/devices/whatever/authorized
ein Skript auszuführen, um das Gerät wieder zu aktivieren, sobald es deaktiviert wurde. Ich habe es sowohl mit meiner Maus als auch mit meiner USB-Tastatur gemacht und hatte ein völlig taubes System :)| sudo tee ...
Ansatz für privilegierte/sys
Schreibvorgänge umzusteigen: Dies funktioniert nicht richtig, wenn Ihre sudo-Anmeldeinformationen nicht bereits zwischengespeichert sind.sudo sh -c "..."
funktioniert wie erwartet, wenn sudo nach einem Passwort fragen muss.Dies setzt alle angeschlossenen USB1 / 2/3-Ports zurück [1]:
Ich glaube, das wird dein Problem lösen. Wenn Sie nicht alle USB-Endpunkte zurücksetzen möchten, können Sie die entsprechende Geräte-ID von verwenden
/sys/bus/pci/drivers/ehci_hcd
Anmerkungen: [1]: Die
*hci_hcd
Kerneltreiber steuern normalerweise die USB-Anschlüsse.ohci_hcd
unduhci_hcd
sind für USB1.1-Ports,ehci_hcd
ist für USB2-Ports undxhci_hcd
ist für USB3-Ports. (siehe https://en.wikipedia.org/wiki/Host_controller_interface_(USB,_Firewire) )quelle
ls: cannot access /sys/bus/pci/drivers/ehci_hcd/: No such file or directory
Das Problem wurde behoben, die Maus hat sofort funktioniert. +1*hci_hcd
mit*hci-pci
, wie der hci_hcd Treiber bereits in den Kernel kompiliert wird.for i in /sys/bus/usb/drivers/*/*:*; do
Ich musste dies in einem Python-Skript automatisieren, daher passte ich die äußerst hilfreiche Antwort von LiLo an Folgendes an:
In meinem Fall war es der cp210x-Treiber (von dem ich erzählen konnte
lsmod | grep usbserial
), so dass Sie das obige Snippet als reset_usb.py speichern und dies dann tun konnten:Dies kann auch hilfreich sein, wenn Sie noch kein AC-Compiler-Setup auf Ihrem System haben, aber Python.
quelle
USBDEVFS_RESET
. Ist es immer für alle Systeme gleich?USBDEVFS_RESET
ist für alle Systeme gleich. Für MIPS ist es 536892692.-t
Argument (Tree-Modus), um die von diesem Skript erwarteten Treiberinformationen anzuzeigen. Das Skript benötigt jedoch einige Aktualisierungen, um die verschiedenen Ausgabezeilen zu analysieren, die dadurch generiert werdenIch habe ein Python-Skript erstellt, das den gesamten Prozess anhand der hier gegebenen Antworten vereinfacht.
Speichern Sie das folgende Skript als reset_usb.py oder klonen Sie dieses Repo .
Verwendungszweck:
Skript:
quelle
Da es sich bei dem Sonderfall um ein Kommunikationsproblem von gphoto2 mit einer Kamera auf USB handelt, gibt es in gphoto2 die Möglichkeit, die USB-Verbindung zurückzusetzen:
Vielleicht gab es diese Option 2010 nicht, als die Frage gestellt wurde.
quelle
Die schnellste Möglichkeit zum Zurücksetzen besteht darin, den USB-Controller selbst zurückzusetzen. Wenn Sie dies tun, wird udev dazu gezwungen, die Registrierung des Geräts beim Trennen der Verbindung aufzuheben, und die Registrierung wird wiederhergestellt, sobald Sie sie aktivieren.
Dies sollte für die meisten PC-Umgebungen funktionieren. Wenn Sie jedoch eine benutzerdefinierte Hardware verwenden, können Sie einfach die Gerätenamen durchlaufen. Bei dieser Methode muss der Gerätename nicht von lsusb ermittelt werden. Sie können auch in ein automatisiertes Skript einbinden.
quelle
ehci_hcd
mitehci-pci
Weitere Informationen zu dieser Lösung (vielleicht , woher es kam . ):? Davidjb.com/blog / 2012/06 /…Ich benutze eine Art Vorschlaghammer, indem ich die Module neu lade. Dies ist mein Skript usb_reset.sh:
Und dies ist meine systemd-Servicedatei /usr/lib/systemd/system/usbreset.service, die usb_reset.sh ausführt, nachdem mein Anzeigemanager gestartet wurde:
quelle
rmmod: ERROR: Module xhci_pci is builtin.
Ich habe ein Python-Skript erstellt, das ein bestimmtes USB-Gerät basierend auf der Gerätenummer zurücksetzt. Die Gerätenummer erfahren Sie mit dem Befehl lsusb.
zum Beispiel:
In dieser Zeichenfolge ist 004 die Gerätenummer
quelle
Hier ist ein Skript, das nur eine übereinstimmende Produkt- / Lieferanten-ID zurücksetzt.
quelle
$DIR
verschwindet und das Gerät nicht sichtbar ist?Hat jemand einen Vorschlaghammer bestellt? Dies ist aus verschiedenen anderen Antworten hier zusammengesetzt.
quelle
$@
im sudo-Proxy enthaltene Code ist nur eine Gewohnheit des Habbits, da er Fehler verhindert, wenn ich später Argumente hinzufüge (und vergesse, den sudo-Proxy zu aktualisieren).Manchmal möchte ich diesen Vorgang auf einem bestimmten Gerät ausführen, wie durch VID (Hersteller-ID) und PID (Produkt-ID) angegeben. Dies ist ein Skript, das ich für diesen Zweck nützlich gefunden habe und das die raffinierte libusb-Bibliothek verwendet.
Erster Lauf:
Anschließend sollte resetDeviceConnection dieser c ++ - Datei diese Aufgabe ausführen, nämlich das Zurücksetzen einer durch vid und pid identifizierten Geräteverbindung.
(gestohlen aus meinem persönlichen TIL-Katalog: https://github.com/Marviel/TIL/blob/master/unix_tools/Reset_specific_USB_Device.md )
quelle
Ich habe ein einfaches Bash-Skript erstellt, um ein bestimmtes USB-Gerät zurückzusetzen.
quelle
Vielleicht funktioniert das auch für eine Kamera:
Im Anschluss habe ich eine ausgehungerte
USB 3.0
Festplatte auf einem3.4.42
(kernel.org) Linux wiederbelebt .dmesg
habe gesagt, dass es nach 360s ein Timeout von Befehlen gab (sorry, ich kann das Syslog hier nicht kopieren, keine verbundenen Netzwerke) und das Laufwerk komplett hängen geblieben ist. Prozesse, die auf das Gerät zugreifen, wurden im Kernel blockiert und konnten nicht beendet werden.NFS
hing,ZFS
hing,dd
hing.Danach hat alles wieder funktioniert.
dmesg
erzählte nur eine einzige Zeile über dasUSB
gefundene Gerät.Ich habe wirklich keine Ahnung, was das Folgende im Detail bewirkt. Aber es hat geklappt.
Die folgende Beispielausgabe stammt von Debian Squeeze mit
2.6.32-5-686
Kernel, daher denke ich, dass sie für 2.6 und höher funktioniert:Wenn dies nicht funktioniert, kann möglicherweise jemand anderes herausfinden, wie ein echter Reset an ein Gerät gesendet werden kann.
quelle
Versuchen Sie dies, es ist ein Software-Unplug (Auswerfen).
Manchmal funktioniert es bei manchen Geräten nicht einfach, das Gerät zu lösen.
Beispiel:
Ich möchte meinen "Genius NetScroll 120" entfernen oder auswerfen.
Dann überprüfe ich zuerst mein angeschlossenes USB-Gerät
Ok, ich habe meine Maus gefunden, sie hat einen Bus 002, ein Gerät 009, einen IDVendor 0458 und ein IDProduct 003a. Dies ist also ein Referenzgerät für die Maus.
Dies ist wichtig. Die Busnummer ist der Pfad des Anfangsnamens zum Gerät. Ich überprüfe die Produkt-ID und den Hersteller, um sicherzustellen, dass das richtige Gerät entfernt wird.
Achten Sie auf die Ordner, überprüfen Sie den Anfang mit Ordnernummer 2, ich werde diese überprüfen, weil mein Bus 002 ist, und nacheinander überprüfe ich jeden Ordner, der den richtigen idVendor und das richtige idProduct über meine Mausinformationen enthält.
In diesem Fall werde ich die Informationen mit diesem Befehl abrufen:
Ok, der Pfad /sys/bus/usb/drivers/usb/2-1.3/ stimmt mit meiner Info-Maus überein! XDDD.
Es ist Zeit, das Gerät zu entfernen!
Stecken Sie das USB-Gerät wieder ein und es funktioniert wieder!
quelle
Wenn Sie Ihren Gerätenamen kennen, funktioniert dieses Python-Skript:
quelle