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、20、2 ですEV_REP
。EV_REL
で指定された値でこれらのビットを探す/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 を使用すると、これらの魔法の数字も表示されます。削除/追加することで、マウス、Bluetooth デバイス、バーコード リーダーなどのデバイスの番号を簡単に見つけることができます。私の場合は、次の出力が得られました。
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
あまり詳しくないのは承知していますが、さらに質問がある場合は遠慮なくお尋ねください。