gpt4 book ai didi

linux-kernel - 使用驱动程序中没有兼容字符串的设备树进行驱动程序绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 04:42:14 25 4
gpt4 key购买 nike

我看到了一种情况,其中未在驱动程序中定义“struct of_device_id”,而是在为同一设备条目添加的设备树(dts)文件兼容字符串中。

以下是芯片的示例设备树条目。

&i2c1 {

...

adv7ex: adv7ex@4a {
compatible = "adv7ex";
reg = <0x4a>;
};

...

};

以下是注册为 I2C 驱动程序的芯片驱动程序的示例代码片段。
static struct i2c_device_id adv7ex_id[] = {
{ "adv7ex", ADV7EX },
{ }
};
MODULE_DEVICE_TABLE(i2c, adv7ex_id);

static struct i2c_driver adv7ex_driver = {
.driver = {
.owner = THIS_MODULE,
.name = "adv7ex",
},
.probe = adv7ex_probe,
.remove = adv7ex_remove,
.id_table = adv7ex_id,
};

module_i2c_driver(adv7ex_driver);

您能否帮助我了解在这种情况下设备与驱动程序的绑定(bind)是如何发生的,因为驱动程序中没有“of_device_id”结构定义。

最佳答案

我有一个类似的案例,终于找到了解释:
设备树 i2c 设备绑定(bind)中似乎存在未记录的转折。

让我们看看 i2c_device_match() (i2c-core-base.c):

/* Attempt an OF style match */
if (i2c_of_match_device(drv->of_match_table, client))
return 1;

在 i2c_of_match_device() (i2c-core-of.c) 中实际发生了什么?:
*i2c_of_match_device(const struct of_device_id *matches,
struct i2c_client *client){
const struct of_device_id *match;

if (!(client && matches))
return NULL;

match = of_match_device(matches, &client->dev);
if (match)
return match;

return i2c_of_match_device_sysfs(matches, client); }

嗯,我们首先尝试使用兼容字段的 Open Firmware 样式匹配,但如果失败,我们仍然调用 i2c_of_match_device_sysfs()。
它有什么作用?
i2c_of_match_device_sysfs(const struct of_device_id *matches,
struct i2c_client *client) {
const char *name;

for (; matches->compatible[0]; matches++) {
/*
* Adding devices through the i2c sysfs interface provides us
* a string to match which may be compatible with the device
* tree compatible strings, however with no actual of_node the
* of_match_device() will not match
*/
if (sysfs_streq(client->name, matches->compatible))
return matches;

name = strchr(matches->compatible, ',');
if (!name)
name = matches->compatible;
else
name++;

if (sysfs_streq(client->name, name))
return matches;
}

return NULL; }

答对了!
正如您在代码中看到的,i2c_of_match_device_sysfs() 比较 兼容从设备树到 的字符串姓名 司机领域 i2c_device_id .
另外,如果 中有逗号兼容字段,将匹配逗号后面的部分。

所以在你的情况下,设备树数据
compatible = "adv7ex"

与“adv7ex”匹配
static struct i2c_device_id adv7ex_id[] = {
{ "adv7ex", ADV7EX },
{ } };
MODULE_DEVICE_TABLE(i2c, adv7ex_id);

即使您的 兼容将是“acme-inc,adv7ex”,就像设备树的推荐符号一样,它仍然会匹配。

关于linux-kernel - 使用驱动程序中没有兼容字符串的设备树进行驱动程序绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28406776/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com