在Linux源代码中,对特定USB设备的识别发生了什么?

Bry*_*mas 2 linux usb kernel driver

我有一个特定的USB设备,其Linux驱动程序源代码我想检查.我的理解是USB驱动程序采取的第一步是注册自己能够处理具有特定供应商ID和产品ID的设备.就我而言,供应商ID是0BDA,产品ID是8187.鉴于此信息,有没有一种方法可以找到将自身注册为能够处理此设备的源文件,以便找出实际执行驱动程序详细信息的其他源文件?

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

Ala*_*rry 5

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

usb:v15A9p0004d0001dc00dsc00dp00icFFiscFFipFF
Run Code Online (Sandbox Code Playgroud)

然后将该字符串传递给modprobe,它将模块与模块本身中的字符串(带通配符)进行匹配.您可以通过modinfo在其上运行来查看特定模块的匹配规则列表.与这些规则对应的源代码构造是MODULE_DEVICE_TABLE.设备表中的各个条目通常都是使用USB_DEVICE宏构建的,因此grepping USB_DEVICE.*8187而不是仅仅8187缩小它.

如果您有插入并正常工作的设备,您可以通过查看其sysfs条目找出与之关联的驱动程序:

ls -l /sys/bus/usb/devices/*/driver
Run Code Online (Sandbox Code Playgroud)

如果您可以构建其中一个设备描述符字符串,您可以要求modprobe为您查找驱动程序而不实际加载它(再次以我的设备为例):

modprobe -v -n 'usb:v15A9p0004d0001dc00dsc00dp00icFFiscFFipFF'
Run Code Online (Sandbox Code Playgroud)

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

如果所有其他方法都失败了,那么低技术方法是从中获取人类可读的设备名称lsusb,并将其加上"Linux"一词.

使用上述某些方法,我发现您的设备驱动程序名为rtl8187,其中注册了供应商和产品ID drivers/net/wireless/rtl818x/rtl8187/dev.c.