linux-usb-connect/disconnect-Ereignis
Hallo, ich arbeite auf einem embedded-linux-Gerät mit einem usb-port, der verwendet die g_ether Treiber für usb-Netzwerk.
Wenn der usb-Stecker angeschlossen ist die Ausgabe von dmesg ist:
g_ether gadget: full-speed config #2: RNDIS
Wenn das usb-Kabel nicht angeschlossen ist, ist keine Meldung von dmesg.
Mit C, wie kann ich mir für das verbinden/trennen Veranstaltungen?
Dem embedded linux-OS hat keine extras. Es gibt keine dbus-daemon oder hotplug-Helfer-Skript. Ich bin auch nicht sicher, ob diese wäre schon hilfreich.
- Tun Sie mindestens udev?
- Habe ich leider nicht. Ist es unmöglich zu hören, diese Art der Veranstaltung im Benutzer-Modus ohne udev?
- Ich glaube, dass ist der beste Weg, um die kernel-Veranstaltungen. Eine alternative ist die ältere usbd im linux-hotplug.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen, dass alles in Ihrer einzigen Prozess, müssen Sie die libudev entweder Ereignisse aus
udevd
oder direkt aus dem kernel.Sehen, dass es möglicherweise ein problem zu verwenden libudev in Ihrer Anwendung (Mangel an Dokumentation?), eine alternative ist die Nutzung der udevadm Programm, das können:
udevd
(udevadm monitor --udev --property
),udevadm monitor --kernel --property
), undudevadm info --query all --export-db
)udevadm
ist Teil der udev-Paket, aber sollte nicht müssenudevd
wenn Sie es nur zu berichten, kernel-Ereignisse. Sie können es verwenden, indem Sie Ihre Prozess laichen Sie und analysieren Sie Ihre standard-Ausgabe - (aber Sie haben, um es zu starten über stdbuf-o L
).Entweder Weg, es wird wahrscheinlich eine Menge Arbeit. Ich habe bereits implementiert, eine Menge von dieser in meinen NCD Programmiersprache, einschließlich der überwachung von USB-Geräten. Möchten Sie vielleicht einen Blick auf NCD; es ist nützlich, für eine Vielzahl von Konfigurations-Aufgaben und verarbeitet hotplugging gut. Zum Beispiel, diese NCD-Programm drucken Sie USB-Gerät-Ereignisse auf der standard-Ausgabe:
Dadurch wird NCD etwas drucken, wie das (mit einer anfänglichen
added
Ereignis für alle USB-Geräte, die bereits angeschlossen ist):Können Sie auch verwenden, NCD, die nur für diese, und analysieren diese standard-Ausgabe - das ist viel einfacher als messing mit udevadm direkt.
Beachten Sie, dass die NCD selbst verwendet
udevadm
, und es hat erfordern udevd ausgeführt werden; aber warum ist das problem überhaupt? (mit der Arbeit, die diese Abhängigkeit, die entfernt werden konnten)Können Sie
libudev
oder analysierenudevadm
Ausgabe als @Ambroz Bizjak vorgeschlagen. Obwohl, ich rate davon ab, das hinzufügen einer zusätzlichen Prozess (stdbuf
) und Sprache (NCD
), nur zu analysieren udevadm Ausgang.Einen Schritt zwischen Ebene libudev und Parsen der Ausgabe ist die änderung von udevadm Quellen. Diese Lösung reduziert die benötigten Ressourcen und überspringt den parsing-Prozess insgesamt. Wenn man sich die udev-Paket, finden Sie die Quellen für udevd und udevadm in der
udev
Verzeichnis.Dort haben Sie die main-routine in
udevadm.c
und die Quelle fürudevadm monitor
imudevadm-monitor.c
. Jedes Ereignis empfangen wird gedruckt durchprint_device()
. Dies ist, wo Sie legen Sie Ihre code.Wenn Sie tight auf den Speicher, können Sie ausziehen, nicht benötigte code für
control
,info
,settle
,test-builtin
,test
undtrigger
. Auf meinem system (Ubuntu 12.04), dies reduziert die Größe von udevadm von über 75%.Leider gibt es keine udev-Ereignis erzeugt auf verbinden/trennen, so ist es fast unmöglich, diese Ereignisse überwachen.
Sie konnten beobachten kernel-Meldungen (es scheint zu sein, verrückte Idee). Möglich besser ist es, zu modifizieren kernel.
update: ich verstehe nicht, warum diese Antwort bekam negative Bewertung.
Vielleicht sind einige Leute mix-USB-host-Teil (die erzeugt UDEV-Ereignisse auf dem Gerät-plug/unplug) und USB-Gerät/gadget-Teil (die nicht produzieren keine solchen Ereignisse)
Also, wenn Ihr linux-computer arbeitet als gadget (USB-Gerät angeschlossen ist, welche an einige USB-host), es ist keine gute Art zu fangen-plug/unplug-events.
Beweis: Nachricht von Greg Kroah-Hartman