Udevは常にusbhidドライバを自分のデバイスに自動的にバインドしません。

Udevは常にusbhidドライバを自分のデバイスに自動的にバインドしません。

Ubuntu 19.10を実行する複数のシステムがあります。
すべてのシステムで検出されるUSB HIDデバイスがあり、
3つのシステムすべてでまったく同じudevルールファイル(99-MyDevice.rules)を使用しています。

SUBSYSTEM=="usb",ATTRS{idVendor}=="XXXX",ATTRS{idProduct}=="YYYY",MODE="0660",GROUP="timothy",SYMLINK+="mydevice%n"

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="timothy"

3つのシステムすべてで、デバイスが/ dev / mydeviceとして正しく表示されます。

これで実行すると、lsusb -t次のものが出力されます。

Port 4: Dev 3, If 1, Class=Human Interface Device, Driver=, 12M  

空ですが、Driver時には実際にドライバ(私が望むもの)をロードして次のように出力します。

Port 4: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M  

ドライバをロードした後、ソフトウェアはデバイスを検出して使用できます。
問題は、ドライバが自動的にロードされることがほとんどないことです。

これまで、ドライバを手動でロードする2つの方法がありました(成功かどうか)。

方法1:
以下を使用してドライバを手動で割り当て/バインドできます。

echo -n "4-3:1.0" > /sys/bus/usb/drivers/usbhid/bind

この時点でlsusb -tドライバがロードされたことを示します。

Port 4: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M

aclその後、これを使用するには/ dev / mydevice ...を変更する必要があります。

このアプローチが常に動作するわけではありません。せいぜいランダムに感じられます。

方法2:

コンピュータからデバイスを論理的に切断し、再接続します。
(物理的に切断するのではなく)VMWareをインストールし、デバイスをゲストシステムに数秒間接続して
これを実行しました。
デバイスがホストに再接続された後、ほとんどの場合、ドライバは
自動的にバインドされ、ソフトウェアでデバイスを表示または使用できます。
(このアプローチでは、何も修正する必要はありませんacl。)

いくつかの注意:

  • RaspbianがインストールされているRaspberryPIでこのデバイスを使用しても、この問題は発生しません。
  • 同じ種類のデバイスが複数あり、この問題はすべてのデバイスで発生します。
  • この問題は Windows では発生しません。
  • WindowsのUbuntuシステム仮想マシンではこの問題は発生しません。
  • MacOSではこの問題は発生しません。
  • 私が覚えている限り、以前のバージョンのUbuntuでもこれは起こりません(完全にはわかりません)。
  • デバイス自体はSTM32F4に基づいています。

usbhid毎回ドライバーを強制的に結ぶ方法を知っていますか?

修正する:


デバイスを物理的に接続した後、次のコマンドを実行すると、usbhidドライバが毎回正しくバインドされることがわかりました。

sudo rmmod usbhid && sudo modprobe usbhid

rmmod最初に使用する必要がありましたが、
単に実行するだけでmodprobeは問題は解決されませんでした。

だから:

  1. 物理接続:Driver=, 12MB
  2. 上記のコマンドを実行します。Driver=usbhid, 12MB

これによると源泉 ドライバ自体がサポートするデバイスを選択します。

したがって、私はこのコマンドがusbhidドライバがデバイス
を処理できるかどうかを再評価することになると思います。

ここで自動化する方法を理解する必要があります。

ベストアンサー1

/etc/modules-load.d/00-my-usbhid.confにラインファイルを生成します。

usbhid

モジュールは自動的にロードされるため、最新のシステムではこれを行う必要はありませんが、時にはモジュールを強制的にロードする必要があるかもしれません。

他のすべての方法が失敗した場合は、カーネルブートパラメータを追加してみてください。

usbhid.quirks=0x0463:0xffff:0x08

到着NOGET属性を再度有効にします。動作していることを確認してください。

https://www.cyberciti.biz/faq/linux-how-to-load-a-kernel-module-automatically-at-boot-time/ https://bugzilla.redhat.com/show_bug.cgi?id=1715504 https://github.com/networkupstools/nut/issues/515

おすすめ記事