我有一个绑定到驱动程序的输入类设备(加速度计),该驱动程序公开了我需要从用户区访问的 sysfs 属性。使用 udev 规则,我提供了一个明确标识我的设备的别名,即ll /dev/input
产量:
lrwxrwxrwx 1 root root 6 May 18 13:47 accelerometer0 -> event0
drwxr-xr-x 2 root root 60 May 18 13:47 by-path
crw-rw---- 1 root input 13, 64 May 18 13:47 event0
crw-rw---- 1 root input 13, 65 May 18 13:47 event1
crw-rw---- 1 root input 13, 66 May 18 13:47 event2
到目前为止,一切都很好:我可以open("/dev/input/accelerometer0")
在我的用户空间代码中开始流式传输数据。但是,例如,更改数据速率,我需要写入pollrate_ms
相关 sysfs 目录中的属性。一个ls /sys/class/input/
产量:
event0 event1 event2 input0 input1 input2
我碰巧知道它pollrate_ms
位于 中input0/device
,但我需要以编程方式解决这个问题,特别是因为未来的更新可能会导致该编号发生变化。
我知道我可以使用libudev
枚举/sys/class/input
然后使用 for 循环来探索每个目录,直到找到包含pollrate_ms
. 与通过 udev 规则明确识别设备的容易程度相比,这似乎是很多工作。
我错过了一个简单的方法还是我应该把它吸起来?
以编程方式,您可以首先
stat("/dev/input/accelerometer0", &stat_struct)
找出主要和次要设备号。然后使用
libudev
's为您的加速度计udev_device_new_from_devnum()
获取 astruct udev_device
,然后udev_device_get_syspath()
获取其 sysfs 目录的路径名。