除了供应商和产品 ID 之外,还有很多其他参数可以影响选择哪个驱动程序。有版本号、设备类、子类和协议,以及接口类、子类和协议。内核从设备中读取所有这些,并构建一个包含所有这些的字符串,如下所示(示例是我的设备之一,不是你的):
usb:v15A9p0004d0001dc00dsc00dp00icFFiscFFipFF
然后将该字符串传递给 modprobe,modprobe 将其与模块本身中的字符串(带有通配符)进行匹配。您可以通过在特定模块上运行来查看特定模块的匹配规则列表modinfo
。与这些规则对应的源代码构造是MODULE_DEVICE_TABLE
. 设备表中的各个条目通常是使用USB_DEVICE
宏构建的,因此 greppingUSB_DEVICE.*8187
而不是8187
应该缩小范围。
如果您有一个设备插入并工作,您可以通过查看它的 sysfs 条目来找出与之关联的驱动程序:
ls -l /sys/bus/usb/devices/*/driver
如果您可以构建其中一个设备描述符字符串,则可以要求 modprobe 为您查找驱动程序,而无需通过执行此操作实际加载它(再次以我的设备为例):
modprobe -v -n 'usb:v15A9p0004d0001dc00dsc00dp00icFFiscFFipFF'
lsusb -v
如果你能得到它,所有的数字都在输出中可用。如果没有,请尝试零,也许您会得到通配符匹配。确保对十六进制数字使用大写字母,对其他所有内容使用小写字母。这仅在驱动程序存在时才有效,/lib/modules
因此对于查找内核编译中遗漏的驱动程序没有好处。
如果所有其他方法都失败了,低技术的方法是从 中获取人类可读的设备名称lsusb
,然后在谷歌上搜索它加上单词“Linux”。
Using some of the above methods, I found that your device's driver is called rtl8187, with the vendor and product IDs registered from drivers/net/wireless/rtl818x/rtl8187/dev.c
.