web-dev-qa-db-ja.com

Linuxで生のHID入力をキャプチャする方法は?

私が成し遂げたいことの短いバージョン:実装されているフットペダル(興味があるならINFINITY-IN-USB-1)があります汎用HIDデバイスとして、Linuxでコントロールキーおよびaltキーとして動作するようにしたいと思います。私はXのレベルで何かを探しています。つまり、個々のプログラムだけではありません。

より長いバージョン:私はこのセットアップをWindowsで動作させていますXP dll RegisterRawInputDevicesとGetRawInputDataを呼び出して入力をリッスンすることで隠されたウィンドウ。すべてはかなり単純な Autohotkey スクリプトで達成されます(興味のある人はここに投稿できます)。ポイントは、追加のドライバーなどは不要で、ネイティブのWindowsのみです。 dllが必要です。

このセットアップをLinuxで動作させたい(具体的にはUbuntuの下のGnomeですが、ときどき他のディストリビューション/ウィンドウマネージャーを使用するので、Xのレベルでのソリューションを高く評価します)。このフットペダルは、キーボードまたはジョイスティックとしても登録されませんが、UsagePage 12、Usage 3のHIDデバイスとして登録されます。最新のUbuntuは、Microsoft Natural Keyboardのお気に入りのキーを検出および使用できます。 *。私はフットペダルを使用するのと同じ方法を使用して(つまり、バンドルされたソフトウェアなしで)Windowsでこれらのキーを使用します。だから、このペダルはLinuxでも動作すると思いますが、問題はどのようにですか?

[Linuxの低レベルのものは初めてなので、該当する場合はいつでも紹介またはチュートリアルへのリンクをたっぷりとお寄せください。]

*知らない人のために、Microsoft Natural Keyboardは通常のキーボードと汎用HIDデバイスの両方として登録します。一部のアプリケーション(バンドルされたアプリケーションなど)がHID入力を解釈する方法を知らない場合、通常のキーは機能しますが、お気に入りのキーと特別な機能キーは役に立ちません。


明確にするために、Linuxはペダルの踏み込みを入力として認識していません。 USBデバイスは認識しますが、xevはペダルを踏んだ場合の出力を提供しません。筆記用ソフトウェアにWINEでペダルをうまく使用している人々の報告を見てきましたが、それはWindowsのように機能しなければならず、私が望むものを与えません(これにより、すべてのネイティブLinuxアプリでペダルがキーボードのように見えます)。低レベルのLinuxキーボードドライバーが必要かどうか疑問に思いますか?


詳細は次のとおりです。端末でこれを発行した場合

cat /dev/usb/hiddev0

dev/usb/hiddev0は私のペダルです)、ペダルを踏むことに対応する生のコードを取得します。それが始まりです。私はそれらの生のコードが何を意味するかを知っています:0001、0010、0100はそれぞれ各ペダルに対応し、ペダルを押す組み合わせはそれらのバイナリ番号の組み合わせを送信し、まだ押されているペダルのペダルトリガー入力のリリースペダルが上がっている、0000が送信されます)。

Xでdev/usb/hiddev0そして、生のコードを特別なキーコードに変換して、xmodmapなどでマップできるようにしますか?

31
polyglot

uinputが必要です。/dev/usb/hiddev0でリッスンし、/dev/input/uinputで送信する新しいイベントを作成します。

これはそれを説明し、小さなチュートリアルを提供します: Linux-2.6.xでuinputドライバーを使用してユーザー入力を送信します {これはEInfochipsの「ダッシュボード」出版問題です1月2007「今月のヒント」記事は、 this アーカイブページ}に記載されています。

19
Adam Goode

デバイスは/ dev/inputに表示されますか?その場合は、キーボードまたはマウスの場合と同様に、「evdev」Xドライバーを使用して接続します。

4

ここでも同じ問題がありますが、ワイヤレスキーボードの特別なキーがあります。あなたの痛みが分かります。

とにかく、これを機能させるために、私の方法をここに示します:

  1. sleep 10; killall catその後、別の端末ですばやく:cat /dev/usb/hiddevice0 > key1.usbdumpそしてデバイスを押す/使用します。これにより、そのキーのhiddeviceのバイナリ出力がダンプされます。
  2. 私はすぐにpythonスクリプトを一緒にハックして、hiddevice入力を読み取り、イベントを起動します。これまでのところ、キーがヒットしたときは動作します。これはAdamが提案したものと似ていますが、おそらくよりエレガントですが、プログラミング/使用がより難しく、pythonはすぐに利用できます。

したがって、これは進行中の作業です(最初に押されたときのみ機能します)が、おそらくこのような何かがあなたのために働く可能性があります:

sf1 = open("test.usbdump").read() # read the earlier usb dump from hiddevice
kb = open("/dev/usb/hiddev0")
while 1:
    # Prints true if the specific key has been read.
    print (kb.read(len(sf1)) == sf1)
    # Basically all that has to be done is if ^ is true, then fire off the event you want.

誰かが私のプログラムを手伝ってくれたり、これを間違っているのなら、教えてください。 ;)

Hiddeviceの初期ダンプに含まれているヘッダーがいくつかあることに気付きました。いくつかのbless hex編集とビット差分を使用すると、重要な値を見つけて、Pythonでそれらをチェックできます。 (たとえば、16進数の「B0」は、キーボードで特殊機能キーが押されたことを意味します。後で、どのキーが押されたかなどの詳細が表示されます。)

私の最終結果はこれです:hiddevice0はハングし、しばらくするとデータの提供を停止するようですが、理由はわかりませんが、代わりに/ dev/input/event *を使用します(あなたにも役立つかもしれません)。繰り返しますが、同じ16進編集と低レベルの解析が成功につながります。途中でSudo cat /dev/input/event3 | hexdumpは、あなたにとって重要なバイトを判断するのに非常に役立ちます。

したがって、Sk-8812 IBMキーボードを使用していて、特殊キーを使用したい場合は、私と話して、使用したスクリプトを入手できます。

2
kapace

Lircdを調査する必要があります。リモートコントロールからの入力を解釈します。一部のサポートされているリモートは、明らかに自分自身を一般的な隠しデバイスとして提示するため、デバイスをlircdと通信させることができます。

2
joeforker

私のブログでXの下で任意のキーシムを送信するためにInfinity IN-USB-1(別名「VEC USB Footpedal」)を入手した方法について書きました。

LinuxではVEC/Infinity USBフットペダルをキーボードとして使用

(IN-USB-2や、VECとP.I. Engineeringが販売している他のUSBフットコントローラーモデルとそのクローンでも動作するはずです。)

短いバージョンは次のとおりです。

Xを取得してペダルを認識します

ペダルはHID準拠のUSBデバイスであり、カーネルはそれを検出し、/dev/input/eventXノードを介してユーザー空間でイベントを利用できるようにすることに問題はありません。確認するには、evtestプログラムを実行できます(Debianの場合:Sudo apt install evtest)。したがって、フットペダルを使用するためにHIDレベルに移動する必要はありません。

問題は、udevがキーボードまたはマウスとしてタグ付けしないため、Xはそれを無視することです。これは、1行のudevルールファイルで修正できます( Parlatype Issue 28 でこのソリューションを提供してくれた開発者Gabor Karsayに Parlatype に感謝します)。

ACTION=="add|change", KERNEL=="event[0-9]*", ATTRS{idVendor}=="05f3", ATTRS{idProduct}=="00ff", ENV{ID_INPUT_KEYBOARD}="1"

その行を/etc/udev/rules.d/10-vec-usb-footpedal.rulesというファイルに入れます。何も再起動する必要はありません。udevは自動的にファイルを検出するはずです。

これで、USBペダルを取り外して再接続すると、Xによって認識されます(そしてマウスボタンイベントを送信します)。確認するには、xevを実行します。

Udev hwdbを使用したキーシムの再マッピング

マウスのクリックだけを送信するペダルを持つことは、おそらくあなたが望むものではありません。ペダルスイッチによって送信されるこのキーコードは、udev hwdbファイルを使用して再マップできます。

次の行を含むファイルを/etc/udev/hwdb.d/(私は/etc/udev/hwdb.d/60-usb-footpedal.hwdbに置きます)の下に作成します:/etc/udev/hwdb.d/60-usb-footpedal.hwdb

evdev:input:b*v05F3p00FF*
 KEYBOARD_KEY_90001=f14
 KEYBOARD_KEY_90002=f15
 KEYBOARD_KEY_90003=f16

今回は、バイナリhwdbファイルを更新するようシステムに通知する必要があります。

$ Sudo systemd-hwdb update

次に、デバイスを取り外して再接続します。

Hwdbファイルの最初の行はデバイス(ベンダー05F3、製品00FF)と一致し、後続の行はスキャンコード(16進数)をキーコードにマップします。 F14、F15、およびF16ファンクションキーを選択しましたが、利用可能なキーコードのリストは / usr/include/linux/input-event-codes.h ;で定義されています。そのファイルで定義されている名前をhwdbキーコードとして使用するには、それらを小文字に変換し、key_プレフィックスを削除します。

コンピューターのデフォルト(pc + us)xkbキーボードレイアウトは、F14F15、およびF16をそれぞれXF86Launch5XF86Launch6、およびXF86Launch7のキーシムにマップします。ここでxevを開いてペダルを押すと、それらのキーシムが発せられます。これらのキーシムを使用して、各ペダルスイッチをデスクトップまたはウィンドウマネージャーでホットキーとしてマッピングできます。

Xmodmapなどを使用して、XF86* keysymsを他のキーに再マッピングすることもできます。 vimでキーをマップ可能にすること、ドキュメントへのリンク、必要に応じてHIDデバイスを直接読み取るためのポインター、およびMac OS Xのソリューションを含む詳細については、my weblog post

フットコントローラー

最後に言及することは、python footcontroller というプログラムです。evdevデバイス(/ dev/input/eventX)からイベントを読み取り、キーを発行するように構成できます。ストローク(xdotoolを使用)またはペダルの踏み込みに応じてスクリプトを実行するxmodmapの代わりに使用して、ペダルに任意のキーストロークを送信させることができます。

1
cristoper

バインディング/ショートカットには、compiz、easystroke、xmacroの組み合わせを使用します。

あなたのニーズのために、欠けているのはxbindkeysだと思います。これをセットアップするのに役立つかもしれないこのリンクを見つけました:

http://linux-trackball.dreamhosters.com/

とにかく、いくつかのマウスデバイスを区別する方法があるのだろうかと思います。

0
bitozoid