デバイスにUSBドライバを割り当てる方法

デバイスにUSBドライバを割り当てる方法

この質問には2つの側面があります。

まず、USBデバイスからドライバを手動で取り外し、他のドライバを接続するにはどうすればよいですか?たとえば、接続すると、USBストレージドライバを自動的に使用するデバイスがあります。

USBビュー出力

Vendor Id: xxxx
Product Id: xxxx
...
    Number of Interfaces: 2
    Interface Number: 0
        Name: usb-storage
        Number of Endpoints: 2
        ...
    Interface Number: 1
        Name: (none)
        Number of Endpoints: 2
        ...

USBストレージドライバを使用したくないので、私のアプリケーションはこのlibusbライブラリを使用してUSBストレージドライバを切り離してインターフェイスを宣言します。その後、USBデバイスとホストLinuxシステムで実行されているアプリケーションにデータを送信できます。

アプリケーションの外部からドライバを手動で分離するにはどうすればよいですか?


次に、デバイスプラグインに接続するドライバを自動的に割り当てるにはどうすればよいですか?現在のデバイス権限を自動的に設定するためのudevルール設定があります。

SUBSYSTEM=="usb", ATTR{idVendor}=="xxxx", MODE="0666"

udevルールを使用してUSBデバイスの特定のインターフェイスにドライバを割り当てることはできますか?たとえば、インターフェイス0でusb-storageの代わりにusbnetモジュールを自動的に使用したい場合、udevでこれは可能ですか?

答え1

あなたの質問の最初の部分については周りを見回しましたが、すでにlibusbで実行しているよりもUSBドライバを切り離すより良い方法が見つかりませんでした。

質問の2番目の部分については、udevは次のことを行うことができます。反応ドライバがロードされますがロードされませんデバイスに割り当てる特定のドライバです。

Linuxカーネルの各ドライバは、1つ以上のデバイスを担当します。ドライバ自体がサポートするデバイスを選択します。プログラムでこれを行います。つまり、デバイスのベンダーと製品IDを確認したり、使用できない場合(以前のデバイスなど)、自動検出ヒューリスティックおよび完全性チェックを実行したりします。ドライバは、自分がサポートしているデバイスを見つけたと確信すると、デバイスに自分で接続されます。つまり、通常、特定のドライバが特定のデバイスを使用するように強制することはできません。しかし、時にはデバイスドライバが許可する内容について寛大な場合があります。できる仕事を知らないんです。マイレージが異なります!過去には、奇妙なPCIデバイス/ベンダーIDをサポートする必要があるドライバに手動で追加する必要がありましたが、結果がずれていて興味深いカーネルクラッシュが発生しました。

これでモジュールの場合は追加の手順があります。これモジュールローダー新しいデバイスが検出されると、カーネルによって目覚めます。デバイスを識別し、USBデバイスの場合、次のような「modalias」文字列が渡されます。

usb:v046DpC221d0170dc00dsc00dp00ic03isc00ip00

この文字列には、デバイスクラス(usb)とクラス固有の情報(サプライヤ/デバイス/シリアル番号、デバイスクラスなど)が含まれます。各カーネルドライバには1行が含まれています。たとえば、次のようになります。

MODULE_ALIAS("usb:...")

usbaliasと一致する必要があります(ワイルドカードは複数のデバイスを一致させるために使用されます)。modaliasドライバがサポートしているドライバと一致すると、ドライバがロードされます(またはすでに存在する場合は新しいデバイスに関する通知)。

次のコマンドを使用して、サポートされているデバイス(モード別)と関連モジュールを表示できます。

less /lib/modules/`uname -r`/modules.alias

USBストレージデバイスドライバを検索すると、ベンダーとデバイスIDでサポートされている特定のデバイスがあることがわかり、ベンダー/デバイスに関係なく、正しい(保存)クラスを持つすべてのデバイスをサポートしようとします。

オペレーティングシステム(Debianおよび他のバージョン)のユーザースペースメカニズムを使用して/etc/modprobe.d/これに影響を与えることができます。ファイルと同様に、modules.alias(同じ構文を使用して)モジュールをブラックリストに追加したり、モダリアにロードするモジュールを指定したりできます。depmod -aこれにより、モジュールローダのスキーマが再生成されます。

しかし、馬を水辺に連れて行くことはできますが、水を飲ませることはできません。ドライバがデバイスをサポートしていない場合は、無視する必要があります。

これが一般的な理論です。

実際、USB側では、お使いのデバイスには2つのUSBポートがあるようです。相互作用、そのうちのストレージは一つです。コアはリポジトリに取り付けられます。相互作用デバイス全体の。他のインターフェイスに正しいクラスがある場合、usbnetドライバはできるそれに付いています。はい、複数のドライバを同じドライバに接続できます物理USBデバイスは複数のデバイスをエクスポートするため相互作用(たとえば、私のLogitech G15キーボードは、それぞれ別々のドライバとして扱われるキーボードデバイスとLCD画面があるため、2つをエクスポートします。)

USBデバイスの2番目のインターフェイスが検出されないという事実は、カーネルでサポートが不足していることを示しています。どちらの場合も、リストデバイスインターフェイス/エンドポイント詳細を使用してlsusb -v | lessから特定のデバイスまで下にスクロールできます(必要に応じてデバイスごとに出力を制限できます。ベンダーIDまたはUSBパス)。

注:ここではUSBデバイスの論理構造を過度に単純化しています。 USBアライアンスを責める:)

関連情報