在Linux源代码中,对特定USB设备的识别是在哪里进行的?

我有一个特定的USB设备的Linux驱动程序源代码,我想检查。 我的理解是,USB驱动程序的第一步是注册自己,能够处理具有特定供应商ID和产品ID的设备。 在我的情况下,供应商ID是0BDA ,产品ID是8187 。 鉴于这些信息,有没有一种方法可以find注册自己能够处理该设备的源文件,然后查看其他源文件实际执行的驱动程序详细信息?

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

Solutions Collecting From Web of "在Linux源代码中,对特定USB设备的识别是在哪里进行的?"

除了供应商和产品ID之外,还有很多其他参数可以影响选择哪个驱动程序。 有一个版本号,设备类,子类和协议,以及接口类,子类和协议。 内核从设备读取所有这些信息,并生成一个包含所有这些字符串的字符串(例如,我的设备之一,而不是你的设备):

 usb:v15A9p0004d0001dc00dsc00dp00icFFiscFFipFF 

然后该字符串被传递给modprobe,modprobe将其与模块自身中的字符串(通配符)进行匹配。 您可以通过运行modinfo来查看特定模块的匹配规则列表。 与这些规则对应的源代码构造是MODULE_DEVICE_TABLE 。 器件表中的各个条目通常使用USB_DEVICE宏来构建,所以使用USB_DEVICE.*8187而不是8187应该将其缩小。

如果您有一个设备插入并工作,您可以通过查看它的sysfs条目来找出与哪个驱动程序相关联的驱动程序:

 ls -l /sys/bus/usb/devices/*/driver 

如果你可以建立其中一个设备描述符字符串,你可以让modprobe为你查找驱动程序,而不用通过这个实际加载它(我的设备再次作为例子):

 modprobe -v -n 'usb:v15A9p0004d0001dc00dsc00dp00icFFiscFFipFF' 

如果可以的话,所有的数字都可以在lsusb -v的输出中找到。 如果没有,请尝试零,也许你会得到一个通配符匹配。 请确保您使用大写字母作为十六进制数字,小写字母表示其他所有内容。 这只有在驱动程序存在于/lib/modules时才有效,所以找不到内核编译的驱动程序是不好的。

如果一切都失败了,那么低技术的方法就是从lsusb取出人类可读的设备名称,并将它加上“Linux”这个词。

使用上面的一些方法,我发现你的设备的驱动程序叫做rtl8187,在drivers/net/wireless/rtl818x/rtl8187/dev.c注册了供应商和产品ID。