最初の背景。 Logicoolゲームパネルデバイス用のドライバーを開発しています。それはその上に画面を備えたキーボードです。ドライバーはうまく機能していますが、デフォルトではデバイスはHIDによって処理されます。 HIDがドライバーの前にデバイスを引き継ぐのを防ぐために、hid-core.cでブラックリストに載せることができます。これは機能しますが、私が複数の人と作業しているため、すべての作業が面倒になってきているHIDモジュールにパッチを適用し続ける必要があるため、特にinitramfsなどの再構築が頻繁に必要になるため、これは最善の解決策ではありません。
私はこの問題についていくつか調査を行ったところ、- このメーリングリストの投稿 が見つかり、最終的に このLWNに関する記事 に移動しました。これは、実行時にデバイスを特定のドライバーにバインドするためのメカニズムを説明します。これはまさに私が必要としているもののようです。
なので、試してみました。 HIDからキーボードをアンバインドすることができました。これは機能し、予想通り、入力できなくなりました。しかし、それをドライバーにバインドしようとすると、「エラー:そのようなデバイスはありません」と表示され、操作が失敗します。
だから私の質問です:hid-coreでHIDデバイスをブラックリストに登録し、独自のドライバーを提供するときに何が起こるかを複製するために、カーネルバインド/バインド解除操作をどのように使用しますか? -つまり-常にhid-core.cにパッチを当てる必要性を置き換えるには?
ドライバーのソースはこちらです https://github.com/ALi1234/lg4l
わかりました、答えは私を正面から見つめていました。
まず、カスタムドライバーを使用する場合でも、通常デバイスを引き継ぐ汎用ドライバーを使用する場合でも、最終的にはUSBではなく、すべてHIDによって制御されます。
以前、私はそれをHIDからアンバインドしようとしましたが、これは方法ではありません。 HIDにはサブドライバーがあり、特殊なドライバーを持たないデバイスを引き継ぐものはgeneric-usbと呼ばれます。 hid-g19にバインドする前に、これをアンバインドする必要がありました。また、私は「0003:046d:c229.0036」のようなHIDアドレスを使用する必要があり、「1-1.1:1.1」のようなUSBアドレスは使用しませんでした。
再バインドする前に、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つになるためです。