获取 evdev 设备类型

获取 evdev 设备类型

从 Linux 用户空间,如何获取 evdev/input_event 设备的类型(即鼠标或键盘)?

我知道我可以通过阅读/proc/bus/input/handlers或列出来枚举它们/sys/class/input/,但不清楚哪些设备是鼠标或键盘。

/proc/bus/input/handlers类似的行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 时,您还会看到这些神奇的数字。通过删除/添加,您可以轻松找到设备的编号,例如鼠标、蓝牙设备或条形码阅读器。对我来说,我得到以下输出:

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

我意识到这些不是很详细,请随意询问更多。

相关内容