web-dev-qa-db-ja.com

USB-HIDデバイス用のLinuxカーネルドライバーのバインド/バインド解除インターフェースの使用方法

最初の背景。 Logicoolゲームパネルデバイス用のドライバーを開発しています。それはその上に画面を備えたキーボードです。ドライバーはうまく機能していますが、デフォルトではデバイスはHIDによって処理されます。 HIDがドライバーの前にデバイスを引き継ぐのを防ぐために、hid-core.cでブラックリストに載せることができます。これは機能しますが、私が複数の人と作業しているため、すべての作業が面倒になってきているHIDモジュールにパッチを適用し続ける必要があるため、特にinitramfsなどの再構築が頻繁に必要になるため、これは最善の解決策ではありません。

私はこの問題についていくつか調査を行ったところ、- このメーリングリストの投稿 が見つかり、最終的に このLWNに関する記事 に移動しました。これは、実行時にデバイスを特定のドライバーにバインドするためのメカニズムを説明します。これはまさに私が必要としているもののようです。

なので、試してみました。 HIDからキーボードをアンバインドすることができました。これは機能し、予想通り、入力できなくなりました。しかし、それをドライバーにバインドしようとすると、「エラー:そのようなデバイスはありません」と表示され、操作が失敗します。

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

ドライバーのソースはこちらです https://github.com/ALi1234/lg4l

27
ali1234

わかりました、答えは私を正面から見つめていました。

まず、カスタムドライバーを使用する場合でも、通常デバイスを引き継ぐ汎用ドライバーを使用する場合でも、最終的には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つになるためです。

29
ali1234