他のhidドライバが採用したhidインタフェースにhidユニバーサルドライバをバインドする方法は?

他のhidドライバが採用したhidインタフェースにhidユニバーサルドライバをバインドする方法は?

私が直面している問題の簡単な背景。私はUSBブリッジFT260を使用して同期UART / I2C操作を実装しています。チップはHIDレポートを使用してこれらの機能を提供します。接続すると、hid 汎用ドライバは 2 つのインターフェイス、つまり 0 と 1 を検出します。 1つ目はI2C用、2つ目はUART用です。現在私FT260ドライバI2Cサポートただモジュールにロードされた(例:ft260を隠す)うまく動作します。その後、後者が隠された一般を買収したと思います。USBHIDこれに責任を負います。lsusb -t返品:

|__ Port 2: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 2: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 12M

dmesg起動すると、以下が表示されます。

hid-generic 0003:0403:6030.0001: hidraw0: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2
hid-generic 0003:0403:6030.0002: hidraw1: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2
ft260 0003:0403:6030.0001: hidraw0: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2/input
ft260 0003:0403:6030.0002: hidraw1: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2/input

UARTでは、hid-genericで動作するアプリケーションを使用する必要があります。 I2C用のドライバはUARTをサポートするように拡張することができますが(おそらく仮想COMポートで)それほど単純ではなく(少なくとも私の考えでは)、使用したい作業コードがあり、プロジェクトの残りの部分で作業を続けたいと思います。 。

次のようにインターフェイスUARTバインディングを無効にしようとすると:

echo -n 0003:0403:6030.0002 > /sys/bus/hid/drivers/ft260/unbind

バインディングが消えるのがわかります。しかし、正しいインターフェイス(1の場合)をバインドしようとすると一般的な非表示

echo -n 0003:0403:6030.0002 > /sys/bus/hid/drivers/hid-generic/bind

私は得る:

-bash: echo: write error: No such device

次のコマンドを使用してhid-ft260モジュールを削除すると、hid-genericが自動的にロードされます(ホットスワップ)。

modprobe -r hid-ft260

usbhidがPIDとVIDに基づいて一度に1つのサブドライバをロックするように聞こえますが、他のものかもしれません。この問題を迂回する方法についての洞察力があれば、非常に役立ちます。ありがとうございます。

答え1

さて、私に役立つ答えを追加します。それは明らかです一般的な非表示hid_generic_match2番目のboolパラメータを受け入れるコールバック関数(カーネル5.4.70)を提供してくださいignore_special_driver。この値が設定されると(ignore_special_driver = 1)、一致関数が返されtrue調査されます。今後、一般的な非表示ft260のuartインターフェイスに接続できます。USBHID結局のところ、それとは何の関係もありません。

私の設定では、モジュール一般的な非表示そしてft260を隠す再起動後起動ft260を隠す両方のインターフェイスを制御します。したがって、上記の問題を解決するには、次のようにします。

echo 1 > /sys/module/hid/parameters/ignore_special_drivers
echo -n "0003:0403:6030.0002" > /sys/bus/hid/drivers/ft260/unbind

ホットプラグのため、使用可能な HID-UART インターフェイスで hid-generic が正常に検出されました。

hid-generic 0003:0403:6030.0002: hidraw1: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2/input1

バインディングは次のように確認することもできます。

root@root:~# ls /sys/bus/hid/drivers/ft260/
0003:0403:6030.0001  bind  module  new_id  uevent  unbind
root@root:~# ls /sys/bus/hid/drivers/hid-generic/
0003:0403:6030.0002  bind  module  new_id  uevent  unbind

udevこのタスクを自動化するルールを作成できます。

コメントignore_special_driver=1検知前の場合ft260を隠す、VIDとPIDが一致していても、ft260ドライバは両方のインターフェイスのいずれかにバインドされません。

関連情報