Linuxカーネルドライバを使用してUSB-HIDデバイスインタフェースをバインド/バインド解除する方法は?

Linuxカーネルドライバを使用してUSB-HIDデバイスインタフェースをバインド/バインド解除する方法は?

最初の背景。 Logitechゲームパネルデバイス用のドライバを開発しています。スクリーン付きのキーボードです。ドライバは正常に動作しますが、デバイスはデフォルトでHIDによって処理されます。 HID がドライバーの前にデバイスを保持するのを防ぐために、hid-core.c でそのデバイスをブラックリストに載せることができます。これは効果がありますが、最善の解決策ではありません。なぜなら私は複数の人と一緒に働いており、私たち全員がHIDモジュールを常にパッチする必要があるからです。特にinitramfsなどを再構築することが頻繁に含まれているため、これは不安になっています。

私はこの問題について調べてみました。このメーリングリストの投稿結局、私をそこに連れて行ってください。LWNに関するこの記事。これは、実行時にデバイスを特定のドライバにバインドするメカニズムを説明します。これが私に必要なようです。

だから一度試してみました。 HIDでキーボードのバインドを解除できました。これは期待どおりに機能するため、これ以上入力できません。ただし、ドライバにバインドしようとすると、「エラー:そのデバイスがありません」というメッセージが表示され、操作が失敗します。

だから私の質問は:hid-coreでHIDデバイスをブラックリストに追加し、独自のドライバを提供したときに何が起こるかを複製するためにカーネルバインディング/アンバインド操作をどのように使用できますか? - つまり、置き換えるにはhid-core.cを常にパッチする必要がありますか?

私たちのドライバーのソースはここにあります:https://github.com/ali1234/lg4l

答え1

まあ、答えはすぐに私の前にあることがわかりました。

まず、カスタムドライバを使用するか、通常はデバイスに代わる通常のドライバを使用するか、最終的にUSBではなくHIDによって制御されます。

以前はHIDからバインドを解除しようとしましたが、そうではありませんでした。 HIDにはサブドライバがあり、専用ドライバがないデバイスに代わるドライバを汎用USBといいます。これがhid-g19にバインドする前にバインディングを解放する必要があります。また、「1-1.1:1.1」などのUSBアドレスではなく、「0003:046d:c229.0036」などのHIDアドレスを使用する必要があります。

したがって、再バインドする前に、dmesgで次のことを確認してください。

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

それからこれを行います。

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

次に、dmesgで次のことを確認します。

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

私が言ったように、これらの2つの主な情報は、デバイスがバインドされたときにオンラインに表示される最初の2つの情報なので、私の顔をまっすぐに見てください...

関連情報