web-dev-qa-db-ja.com

特定のデバイスのsysfsディレクトリを見つける方法は?

ユーザーランドからアクセスする必要のある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")して、データのストリーミングを開始できます。ただし、たとえば、データレートを変更するには、関連するsysfsディレクトリの_pollrate_ms_属性に書き込む必要があります。 _ls /sys/class/input/_は次のようになります。

_event0  event1  event2  input0  input1  input2
_

_pollrate_ms_が_input0/device_にあることを偶然知っていますが、特に将来の更新によりその番号が変更される可能性があるため、これをプログラムで把握する必要があります。

libudevを使用して_/sys/class/input_を列挙し、forループを使用して_pollrate_ms_を含むディレクトリが見つかるまでこれらの各ディレクトリを探索できることを知っています。 udevルールを介してデバイスを明確に識別することがいかに簡単であったかと比較すると、それは多くの作業のように思えます。

私は簡単な方法で逃しているのですか、それとも私はそれを吸うべきですか?

1
David H Olson

プログラムでは、最初にstat("/dev/input/accelerometer0", &stat_struct)して、メジャーデバイス番号とマイナーデバイス番号を見つけることができます。

次に、libudevudev_device_new_from_devnum()を使用して加速度計の_struct udev_device_を取得し、次にudev_device_get_syspath()を使用してsysfsディレクトリのパス名を取得します。

0
telcoM