USB-HIDデバイスにLinuxカーネルドライバーのバインド/アンバインドインターフェイスを使用する方法


26

最初の背景。Logitechゲームパネルデバイス用のドライバーを開発しています。画面のあるキーボードです。ドライバーは正常に動作していますが、デフォルトではデバイスはHIDによって処理されます。HIDがドライバーの前にデバイスを引き継ぐのを防ぐために、hid-core.cでブラックリストに追加できます。これは機能しますが、複数の人と作業しているため、特にinitramfsなどを再構築する必要があるため、面倒になっているHIDモジュールにパッチを適用し続ける必要があるため、最適なソリューションではありません。

私は、この問題のいくつかの研究を行なったし、私が見つかりました。このメーリングリストポスト最終的に連れて行ってくれました、LWNこの記事を。これは、実行時にデバイスを特定のドライバーにバインドするメカニズムについて説明しています。これはまさに私が必要なもののようです。

それで、試しました。HIDからキーボードのバインドを解除できました。これは機能し、予想どおり、入力できなくなりました。しかし、ドライバーにバインドしようとすると、「error:no such device」というメッセージが表示され、操作は失敗します。

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

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

回答:


27

OK、答えは顔を凝視していたことがわかりました。

まず、カスタムドライバーを使用する場合でも、通常はデバイスを引き継ぐ汎用ドライバーを使用する場合でも、最終的にはすべてUSBではなくHIDによって制御されます。

以前は、HIDからバインドを解除しようとしましたが、これは方法ではありません。HIDにはサブドライバーがあり、特殊なドライバーを持たないデバイスを引き継ぐものはgeneric-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つの情報だからです...


そのベンダー/製品がドライバーと互換性があることをドライバーで指定する必要がありましたか?または、「バインド」は単に問題を強制します。ブラックリストに登録されているデバイスに対して「そのようなデバイスはありません」が取得されていますが、強制的にバインドされたいと思います。なにか。
dmansfield

バインドにより強制されるため、ドライバソースでIDを要求する必要はありません。ただし、自動的にロードする場合です。
ali1234 14年

私が問題を抱えていた2つの理由:最初-カーネルのhid_ignore_listにデバイスがリストされているので、何も「隠された」バインドされません。カーネルコマンドラインに「usbhid.quirks = 0x0b0e:0x0412:0x40000000」を追加して再起動する必要がありました。フラグ0x40000000は「無視しない」です。次に、ID「0003:046D:C229.0036」の最後の部分は「0036」です。これは何を表していますか?わからない。それを見つける唯一の方法は、すでにバインドされていることを確認してから、バインドを解除して再バインドすることです。
dmansfield

自動的に再バインドする方法を見つけましたか?
ウラジウス

:私自身の自動再バインドするソリューションを追加しましたunix.stackexchange.com/a/475277/96686
Vladius
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.