Abrufen des EVDEV-Gerätetyps

Abrufen des EVDEV-Gerätetyps

Wie kann ich aus dem Linux-Benutzerbereich den Typ (d. h. Maus oder Tastatur) eines evdev/input_event-Geräts ermitteln?

Ich weiß, dass ich sie durch Lesen /proc/bus/input/handlersoder Auflisten aufzählen kann /sys/class/input/, aber es ist unklar, bei welchen Geräten es sich um Mäuse oder Tastaturen handelt.

Die Zeilen in /proc/bus/input/handlers„Gefällt mir“ H: Handlers=sysrq kbd event3 ledsscheinen darauf hinzudeuten, dass es sich hier um eine Tastatur mit „kbd“ handelt, aber ich kann diesbezüglich keine tatsächliche Dokumentation finden.

Antwort1

Der Kernel denkt nicht wirklich über Gerätetypen nach, sondern eher über die Arten von Ereignissen, die Geräte erzeugen können (siehedie Ereigniscode-Dokumentationim Kernel).

Daher benötigen Sie einige Heuristiken, um Gerätetypen zu identifizieren. Viele Geräte können Tastenereignisse erzeugen; Tastaturen haben die Besonderheit, sowohl Tastenereignisse ( EV_KEY) als auch sich wiederholende Ereignisse ( EV_REP) zu erzeugen. Mäuse sind meines Erachtens die einzigen Geräte, die relative Ereignisse ( EV_REL) erzeugen.

Geräte legen die Ereignistypen offen, die sie in der evDatei in ihrem Klassenverzeichnis generieren können capabilities. Jeder gerade Typ hat einen bestimmten Bit-Offset, der in definiert ist /usr/include/linux/input-event-codes.h; EV_KEYist 1, EV_REP20, EV_REL2. Sie können nach diesen Bits in den von angegebenen Werten suchen, /sys/class/input/input*/capabilities/evum die Geräte zu finden, an denen Sie interessiert sind.

Antwort2

Um Details zu einem beliebigen Gerät zu finden (ich verwende event22), können Sie Folgendes ausführen (im Terminal/Python/C++):

udevadm info -a -n /dev/input/event22

Die Ausgabe ist eine riesige Liste mit Details, von denen nur zwei wichtig sind: Produkt und Anbieter:

ATTRS{idProduct}=="0100"
ATTRS{idVendor}=="04b4"

Wenn Sie lsusb in einem Terminal verwenden, sehen Sie diese magischen Zahlen ebenfalls. Durch Entfernen/Hinzufügen können Sie die Nummern für Ihr Gerät, z. B. eine Maus, ein Bluetooth-Gerät oder einen Barcodeleser, leicht herausfinden. Bei mir hat es folgende Ausgabe gegeben:

Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 8087:0a2b Intel Corp. 
Bus 001 Device 061: ID 04b4:0100 Cypress Semiconductor Corp. Cino FuzzyScan F760-B
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Wenn ich meinen Barcodeleser entferne und erneut starte, ist das Fuzzyscan-Gerät verschwunden. Dann weiß ich, dass mein Barcodeleser 04b4:0100 ist.

Jetzt kann ich diese Nummer auch in der Evdev-Bibliothek finden. Zuerst erstelle ich ein Programm, um udevadm info für jedes einzelne Gerät auszuführen. Irgendwann finde ich ein Gerät mit 04b4 und 0100. Der Gerätename kann für evdev verwendet werden. In C++ kann ich Folgendes ausführen:

int fd = open("/dev/input/event22", O_RDONLY|O_NONBLOCK)
int rc = libevdev_new_from_fd(fd, &m_evDev);
int vendor = libevdev_get_id_vendor(m_evDev),
int productId = libevdev_get_id_product(m_evDev);
if (vendor == 0x4b4 && productId == 0x100)
    printf("Wooow, you find the barcode scanner!");

Hinweis: Möglicherweise ist dieses Gerät für den Benutzer nicht zulässig. In diesem Fall müssen Sie Lese-/Schreibrechte wie folgt hinzufügen:

sudo chmod a+=wr /dev/input/event22

Mir ist klar, dass diese nicht sehr detailliert sind. Fragen Sie ruhig nach.

verwandte Informationen