将 XInput2 设备映射到 sysfs 节点

Map XInput2 devices to sysfs nodes

如何打开 XInput2 设备,例如正如 XIQueryDevice 所报告的那样,进入适当的 sysfs 节点?该设备是通用 HID 设备,由 evdev 输入驱动程序处理。

我知道我可以获得设备的name。我也许可以查看 Xorg.0.log 并尝试找到添加此设备时的相应日志消息,希望它提到与之关联的 /dev/input/event* 设备节点。或者我可以查看 sysfs 中的所有输入事件,查找具有该名称的事件,并希望该名称是唯一的并且与通过 XInput 报告的事件相同。但我希望有比这两个更干净的解决方案。

输入设备可以有额外的属性; XIListProperties 将枚举它们。至少在我的系统上,这些属性之一是 "Device Node",它指向设备的 /dev/input/eventX 设备。

但基本上,XIQueryDevice 找到设备,然后 XIGetProperty 找到每个设备上的 "Device Name" 属性。 (你需要一些原子实习的东西。)

xinput 实用程序 (code here) 可以显示此信息:xinput list-props $devid 并且应该作为一个完整的示例来说明如何操作。

您可以使用 xinput 命令获取设备 ID。从那里你可以使用 xinput list-props <device id> 获得设备节点路径。 属性261是设备节点。

获得设备节点后,可以使用udevadm info -p $(udevadm info -q path -n <device node path>)获取sysfs节点路径。

懒惰的 oneliner 是

 udevadm info  -q path -n $(xinput list-props `xinput | grep "search term" | awk -F "id=" '{print }' | awk  '{print }'` | grep "261" | awk -F '"' '{print }')

`

要以编程方式执行此操作,您需要使用 XIDeviceInfo 中的设备 ID 调用 XIGetProperty(例如 XIDeviceInfo->deviceid),示例调用语法为 here.

要从设备路径获取 sysfs 路径,请使用 udev_device_new_from_devnum 和 stat(如 here 所示),从设备路径创建 udev_device,然后调用 udev_device_get_syspathudev_device 作为参数。