从 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_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 时,您还会看到这些神奇的数字。通过删除/添加,您可以轻松找到设备的编号,例如鼠标、蓝牙设备或条形码阅读器。对我来说,我得到以下输出:
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
我意识到这些不是很详细,请随意询问更多。