我有一个绑定到驱动程序的输入类设备(加速计),该驱动程序公开了我需要从用户态访问的 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 规则明确识别设备的容易程度相比,这似乎是一项大量的工作。
我是否错过了一个简单的方法,或者我应该接受它?
答案1
通过编程,您可以首先stat("/dev/input/accelerometer0", &stat_struct)
找出主设备号和次设备号。
然后使用libudev
sudev_device_new_from_devnum()
获取struct udev_device
加速度计的 a ,然后udev_device_get_syspath()
获取其 sysfs 目录的路径名。