linux usb verbinden / trennen Ereignis

8

Hallo Ich arbeite an einem eingebetteten Linux-Gerät mit einem USB-Port, der den g_ether-Treiber für USB-Netzwerke verwendet.

Wenn der USB-Stecker angeschlossen ist, lautet die dmesg-Ausgabe:

  

g_ether Gadget: volle Geschwindigkeit config # 2: RNDIS

Wenn das USB-Kabel nicht angeschlossen ist, wird keine Nachricht in dmesg geschrieben.

Wie kann ich auf die Ereignisse zum Verbinden / Trennen warten?

Das integrierte Linux-Betriebssystem hat keine Extras. Es gibt keinen dbus-Daemon oder Hotplug-Hilfsskript. Ich bin mir nicht einmal sicher, ob das hilfreich wäre.

    
eat_a_lemon 19.08.2011, 00:28
quelle

3 Antworten

4

Wenn Sie alles in Ihrem einzigen Prozess haben wollen, müssen Sie libudev verwenden, um entweder Ereignisse von udevd oder direkt vom Kernel zu bekommen.

Da es möglicherweise problematisch ist, libudev in Ihrer Anwendung zu verwenden (fehlende Dokumentation?), verwenden Sie alternativ die udevadm Programm, das:

  • melden Geräteereignisse nach der Verarbeitung von udevd ( udevadm monitor --udev --property ),
  • melden Ereignisse direkt vom Kernel ( udevadm monitor --kernel --property ) und
  • dump udevd's Datenbank der aktuellen Geräte (aber nicht die des Kernels!) ( udevadm info --query all --export-db )

udevadm ist Teil des Pakets udev, sollte jedoch udevd nicht benötigen, wenn Sie es nur zum Melden von Kernel-Ereignissen verwenden. Sie können es verwenden, indem Sie Ihren Prozess spawnen und seine Standardausgabe parsen lassen (aber Sie müssen es über stdbuf -o L ).

Wie auch immer, es wird wahrscheinlich eine Menge Arbeit sein. Ich habe bereits eine Menge davon in meiner NCD-Programmiersprache implementiert, einschließlich der Überwachung von USB-Geräten. Vielleicht möchten Sie sich NCD ansehen. Es ist nützlich für viele Konfigurationsaufgaben und behandelt Hotplugging gut. Dieses NCD-Programm druckt beispielsweise USB-Geräteereignisse auf die Standardausgabe:

%Vor%

Dadurch wird NCD so etwas ausgeben (mit einem anfänglichen added -Ereignis für jedes USB-Gerät, das bereits angeschlossen war):

%Vor%

Sie können NCD auch nur dafür verwenden und diese Standardausgabe parsen - was viel einfacher ist, als direkt mit udevadm zu arbeiten.

Beachten Sie, dass NCD selbst udevadm verwendet und das Ausführen von udevd erfordert. Aber warum ist das überhaupt ein Problem? (mit etwas Arbeit könnte diese Abhängigkeit entfernt werden)

    
Ambroz Bizjak 31.10.2011, 09:31
quelle
3

Sie können libudev verwenden oder pars udevadm output als @Ambroz Bizjak empfehlen. Ich rate jedoch davon ab, einen zusätzlichen Prozess ( stdbuf ) und eine Sprache ( NCD ) hinzuzufügen, nur um die Ausgabe von udevadm zu analysieren.

Ein Schritt zwischen der einfachen libudev- und der analysierenden Ausgabe ändert die udevadm-Quellen. Diese Lösung reduziert die benötigten Ressourcen und überspringt den Analyseprozess vollständig. Wenn Sie sich das Paket udev ansehen, finden Sie die Quellen für udevd und udevadm im Verzeichnis udev .

Dort haben Sie die Hauptroutine in udevadm.c und die Quelle für udevadm monitor in udevadm-monitor.c . Jedes erhaltene Ereignis wird über print_device() gedruckt. Hier fügen Sie Ihren Code ein.

Wenn Sie wenig Speicher haben, können Sie nicht benötigten Code für control , info , settle , test-builtin , test und trigger entfernen. Auf meinem System (Ubuntu 12.04) reduziert dies die Größe von udevadm um etwa 75%.

    
Olaf Dietsche 23.10.2013 11:44
quelle
-3

Leider wird beim Verbinden / Trennen kein udev-Ereignis erzeugt, daher ist es fast unmöglich, diese Ereignisse zu überwachen.
Sie könnten Kernel-Nachrichten überwachen (es scheint eine verrückte Idee zu sein). Möglicher besserer Weg ist es, den Kernel zu modifizieren.

update: Ich verstehe nicht, warum diese Antwort negativ bewertet wurde.
Vielleicht mischen einige Leute den USB-Host-Part (der UDEV-Events auf Gerätestecker / -stecker erzeugt) und den USB-Geräte- / Gadget-Part (der solche Ereignisse nicht erzeugt)

Wenn Ihr Linux-Computer also als Gadget funktioniert (USB-Gerät, das an einen USB-Host angeschlossen ist), gibt es keine gute Möglichkeit, Plug-and-Unplug-Ereignisse zu erfassen.

Beweis: Nachricht von Greg Kroah-Hartman

    
edo1 03.06.2016 11:35
quelle

Tags und Links