首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >spi_driver.id_table与spi_driver.driver.of_match_table的区别

spi_driver.id_table与spi_driver.driver.of_match_table的区别
EN

Stack Overflow用户
提问于 2014-10-27 08:54:24
回答 1查看 2.7K关注 0票数 4

目前,我正试图了解linux驱动程序是如何工作的。据我所知,当内核在设备树中解析相应的.compatible字符串时,会调用驱动程序的探测/init函数。但是,在亚利桑那-spi驱动程序中,似乎在不同成员中引用了多个兼容字符串:

代码语言:javascript
代码运行次数:0
运行
复制
static const struct spi_device_id arizona_spi_ids[] = {
{ "wm5102", WM5102 },
{ "wm5110", WM5110 },
{ },
};
MODULE_DEVICE_TABLE(spi, arizona_spi_ids);

static struct spi_driver arizona_spi_driver = {
.driver = {
    .name   = "arizona",
    .owner  = THIS_MODULE,
    .pm = &arizona_pm_ops,

    // Contains e.g. "wlf,wm5102"
    .of_match_table = of_match_ptr(arizona_of_match),

},
.probe      = arizona_spi_probe,
.remove     = arizona_spi_remove,
.id_table   = arizona_spi_ids,                  // Contains "wm5102" and "wm5110"
};

这是这里的摘录。

那么,arizona_spi_driver.id_table和arizona_spi_driver.driver.of_match_table有什么区别呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-03 15:19:15

有几种驱动程序匹配机制。id_table用于从剥离的设备树条目(不包括供应商部分)中查找匹配项,而of_match_table用于从完整的设备树条目(有供应商部分的条目)中查找匹配项。

如果您检查,arizona_of_match被定义为:

代码语言:javascript
代码运行次数:0
运行
复制
const struct of_device_id arizona_of_match[] = {
    { .compatible = "wlf,wm5102", .data = (void *)WM5102 },
    { .compatible = "wlf,wm5110", .data = (void *)WM5110 },
    { .compatible = "wlf,wm8280", .data = (void *)WM8280 },
    { .compatible = "wlf,wm8997", .data = (void *)WM8997 },
    {},
};

wlf是本例中的供应商部分,而arizona_spi_ids不包含供应商部分。

因此,如果设备树中有类似的内容:

兼容= "myvendor,wm5102“

您的设备将与id_table匹配,但不会与of_match_table匹配,因为供应商是不同的。

内核将首先对of_match_table进行匹配,然后再检查id_table (参见这里中的id_table)。设备匹配优先级为: of_match_table > acpi_driver > id_table。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26583954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档