web-dev-qa-db-ja.com

ベンダーIDと製品IDだけで、USBデバイスに使用されるドライバーが決まりますか?

ベンダーID(VID)が0123で、製品ID(PID)がabcdのUSBデバイスがあるとします。

0123:abcd

SB.org によると、製品IDの割り当ては完全にメーカーに任されています。

製品ID(PID)は、適切と思われる各ベンダーによって割り当てられます。

したがって、見当違いのベンダーが幅広いUSBデバイスを販売し、すべてが異なるドライバーを必要とし、すべて同じベンダーと製品IDを使用することを妨げるものは何もありません。

USB Device A (needs driver X) -> 0123:abcd
USB Device B (needs driver Y) -> 0123:abcd
USB Device C (needs driver Z) -> 0123:abcd

USB.orgは、この潜在的なベンダーの行動が問題になる可能性があることを認めています。

番号が重複するとドライバーエラーが発生する可能性があります

異なるドライバーを必要とするカードにIDが再利用される場合、OSが適切なドライバーを決定するためにできることはありますか?

適切なドライバーを推論するために使用できる(または通常使用される)USBデバイスによって提示される他のフィールドはありますか?私は仮定ベンダーIDと製品IDだけがその決定に使用されています。

または、典型的な* nixシステムは、使用する必要がある0123:abcdとドライバの間に1つの<-> 1つの関係があると想定します。そのため、できることは1を選択することだけです。 ドライバーは適切だと思いますか?

ベンダーIDと製品IDのみが一般的に使用されている場合、適切なドライバーをロードするための手動のユーザー介入のみが機能し、混乱を招くためにベンダーで動揺すること以外にすべきことは他にないと思います。

5
Will Haley

デバイスドライバーを選択するために使用できるいくつかの他の情報があります。バージョン番号、デバイスクラス、サブクラスとプロトコル、およびインターフェイスクラス、サブクラスとプロトコルです。 (Linuxのドライバー側については、 the USB_DEVICE macros を参照してください。lsusb -vの出力を調べると、利用可能な情報のアイデアを得ることができます。)

それでもまだ十分ではないので、ドライバーがデバイスに実際に登録される前に、カーネルがドライバーのプローブ関数を呼び出します。その関数は、デバイスが実際にドライバーによってサポートされているかどうかを判断します。ただし一般的に言えば、Linuxでは、IDが同じで実装が異なるデバイスは同じドライバーによって処理されるため、複数のドライバーを1つのデバイスにマップする必要がありません。このルールの例外を表示するには、次を実行できます

find /lib/modules/$(uname -r) -name \*.ko | xargs /sbin/modinfo | awk '/^filename:/ { filename = $2 } /^alias:/ { printf "%s %s\n", filename,$2 }' | sort | uniq -D -f 1 | uniq -u | less

競合するIDに一致するいくつかのドライバーがリストされます(どれもUSBデバイスドライバーではありません)。

(両方のタイプの動作については後で詳しく説明します。)

2
Stephen Kitt