Получение типа устройства evdev

Получение типа устройства evdev

Как из пользовательского пространства Linux получить тип (например, мышь или клавиатура) устройства evdev/input_event?

Я знаю, что могу перечислить их, прочитав /proc/bus/input/handlersили перечислив, /sys/class/input/но неясно, какие устройства являются мышами, а какие — клавиатурами.

строки в /proc/bus/input/handlerslike, H: Handlers=sysrq kbd event3 ledsпохоже, предполагают, что это клавиатура с наличием «kbd», но я не могу найти никакой фактической документации на этот счет.

решение1

Ядро на самом деле не рассуждает с точки зрения типов устройств, а скорее с точки зрения типов событий, которые могут создавать устройства (см.документация кодов событийв ядре).

В результате вам нужна некоторая эвристика для определения типов устройств. Многие устройства могут производить ключевые события; клавиатуры имеют особенность производить как ключевые события ( EV_KEY), так и повторяющиеся события ( EV_REP). Мыши, я думаю, единственные устройства, которые производят относительные события ( EV_REL).

Устройства выставляют типы событий, которые они могут генерировать в evфайле в своем capabilitiesкаталоге классов. Каждый четный тип имеет заданное смещение бита, определенное в /usr/include/linux/input-event-codes.h; EV_KEYравно 1, EV_REP20, EV_REL2. Вы можете искать эти биты в значениях, заданных , /sys/class/input/input*/capabilities/evчтобы найти интересующие вас устройства.

решение2

Чтобы найти подробную информацию о любом устройстве (я использую event22), вы можете запустить это (в терминале/python/C++):

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

На выходе получается огромный список деталей, из которых важны только 2 — продукт и поставщик:

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

Когда вы используете lsusb в терминале, вы также видите эти магические числа. Удаляя/добавляя, вы можете легко узнать числа для вашего устройства, например, мыши, устройства Bluetooth или считывателя штрих-кодов. Для меня я получил следующий вывод:

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

Когда я убираю свой считыватель штрихкодов и снова запускаю, устройство Fuzzyscan исчезает. Тогда я знаю, что мой считыватель штрихкодов — 04b4:0100.

Теперь в библиотеке Evdev я также могу найти эти номера. Сначала я создаю программу для запуска udevadm info для каждого устройства. В какой-то момент я нахожу устройство с 04b4 и 0100. Имя устройства может быть использовано для evdev. В C++ я могу запустить:

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!");

Примечание: Возможно, это устройство не разрешено пользователю, тогда вам нужно добавить права чтения/записи следующим образом:

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

Я понимаю, что они не очень подробны, не стесняйтесь спрашивать больше.

Связанный контент