Linux

供應商 ID 和產品 ID 是否單獨決定了用於 USB 設備的驅動程序?

  • October 2, 2017

假設我有一個供應商 ID (VID)0123和產品 ID (PID) 的USB 設備abcd

0123:abcd

根據USB.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 的情況下,作業系統可以做些什麼來確定合適的驅動程序嗎?

USB 設備提供的任何其他欄位可用於(或通常用於)推斷適當的驅動程序嗎?我假設只有供應商 ID 和產品 ID 用於做出該決定。

或者一個典型的 *nix 系統會假設應該使用的驅動程序之間存在一個 <-> 一個關係0123:abcd,所以它所能做的就是選擇它認為合適的1 個驅動程序?

我猜,如果通常只使用供應商 ID 和產品 ID,那麼只有手動使用者干預載入正確的驅動程序才會起作用,除了讓供應商讓事情變得混亂之外,沒有什麼可做的。

還有一些其他資訊可用於選擇設備驅動程序:版本號、設備類、子類和協議,以及介面類、子類和協議。(對於 Linux 上的USB_DEVICE驅動程序方面,請查看。您可以通過查看 的輸出來了解可用資訊lsusb -v。)

正如您所料,這還不夠,所以在為設備實際註冊驅動程序之前,核心會在驅動程序中呼叫一個探測函式。該函式可以決定驅動程序是否實際支持該設備。一般來說,在 Linux 上,具有相同 id 但實現不同的設備由同一個驅動程序處理,這避免了必須將多個驅動程序映射到一個設備。要查看此規則的例外情況,您可以執行

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 設備驅動程序)。

(稍後我將擴展這兩種行為。)

引用自:https://unix.stackexchange.com/questions/391919