3

我有一个特定的 USB 设备,我想检查其 Linux 驱动程序源代码。我的理解是,USB 驱动程序采取的第一步是注册自己能够处理具有特定供应商 ID 和产品 ID 的设备。在我的例子中,供应商 ID 是0BDA,产品 ID 是8187. 鉴于此信息,我是否可以找到将自身注册为能够处理此设备的源文件,以便找出哪些其他源文件实际实现了驱动程序详细信息?

作为参考,我在 kernel 上3.2.0-26。我试过了grep -rl 8187 /usr/src,但这列出了一大堆文件,我不知道从哪里开始。

4

1 回答 1

5

除了供应商和产品 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.

于 2012-07-26T03:42:48.493 回答