ベンダー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のみが一般的に使用されている場合、適切なドライバーをロードするための手動のユーザー介入のみが機能し、混乱を招くためにベンダーで動揺すること以外にすべきことは他にないと思います。
デバイスドライバーを選択するために使用できるいくつかの他の情報があります。バージョン番号、デバイスクラス、サブクラスとプロトコル、およびインターフェイスクラス、サブクラスとプロトコルです。 (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デバイスドライバーではありません)。
(両方のタイプの動作については後で詳しく説明します。)