供应商 ID 和产品 ID 是否单独确定用于 USB 设备的驱动程序?

供应商 ID 和产品 ID 是否单独确定用于 USB 设备的驱动程序?

假设我有一个 USB 设备,其供应商 ID (VID) 为0123,产品 ID (PID) 为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 来做出该决定。

0123:abcd或者典型的 *nix 系统会假设 和应该使用的驱动程序之间存在一对一的关系,因此它所能做的就是选择1司机认为合适吗?

我猜想,如果通常只使用供应商 ID 和产品 ID,那么只有用户手动干预加载正确的驱动程序才能工作,除了对供应商让事情变得混乱感到不安之外,没有什么其他可做的。

答案1

还有一些其他信息可用于选择设备驱动程序:版本号、设备类、子类和协议以及接口类、子类和协议。 (对于 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 设备驱动程序)。

相关内容