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
。すべての偶数タイプには、1、20、2で定義された指定されたビットオフセットがあります/usr/include/linux/input-event-codes.h
。指定された値でこのビットを検索して、対象のデバイスを見つけることができます。EV_KEY
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
詳細はないことを知っていますので、さらにお問い合わせください。