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