【问题标题】:Where in the Linux source does recognition of specific USB devices happen?在 Linux 源代码中,特定 USB 设备的识别发生在哪里?
【发布时间】:2012-07-24 14:09:31
【问题描述】:

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

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

【问题讨论】:

  • 并不是说 SO 是正确的地方,但是如果您将其发布在内核新手邮件列表中,您可以获得准确的答案。 kernelnewbies.org/ML

标签: linux usb kernel driver


【解决方案1】:

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

usb:v15A9p0004d0001dc00dsc00dp00icFFiscFFipFF

然后将该字符串传递给 modprobe,modprobe 将其与模块本身中的字符串(带有通配符)进行匹配。您可以通过在其上运行 modinfo 来查看特定模块的匹配规则列表。对应于这些规则的源代码构造是MODULE_DEVICE_TABLE。设备表中的各个条目通常使用 USB_DEVICE 宏构建,因此使用 grepping USB_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和产品ID都是从drivers/net/wireless/rtl818x/rtl8187/dev.c注册的。

【讨论】:

  • @Alan Curry 你知道我会去哪里找到更多关于匹配的内核字符串的字符串格式的信息吗?我猜组件是按照您指定的顺序(版本号、设备类、子类、协议...等),尽管我有兴趣查找更多信息,例如每个字段的长度以及它们在lsusb -v 的输出中对应的内容。我正在写一篇关于这个主题的文章,所以我想确保我完全理解在一般情况下驱动匹配的确定性路径,而不仅仅是我的特定设备
猜你喜欢
  • 1970-01-01
  • 2010-10-19
  • 2023-01-19
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 2011-02-05
相关资源
最近更新 更多