Как из пользовательского пространства Linux получить тип (например, мышь или клавиатура) устройства evdev/input_event?
Я знаю, что могу перечислить их, прочитав /proc/bus/input/handlers
или перечислив, /sys/class/input/
но неясно, какие устройства являются мышами, а какие — клавиатурами.
строки в /proc/bus/input/handlers
like, 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_REP
20, EV_REL
2. Вы можете искать эти биты в значениях, заданных , /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
Я понимаю, что они не очень подробны, не стесняйтесь спрашивать больше.