如何正确添加设备树节点

怎么做?

第 166 行指定了 of_match_table,它是用来跟设备树节点匹配的,如果设备树节点中有 compatile 属
性,并且其值等于第 157 行的“ 100as,leddrv”
,就会导致第 162 行的 probe 函数被调用。

156 static const struct of_device_id ask100_leds[] = {
157 { .compatible = "100as,leddrv" },
158 { },
159 };
160
161 static struct platform_driver chip_demo_gpio_driver = {
162 .probe = chip_demo_gpio_probe,
163 .remove = chip_demo_gpio_remove,
164 .driver = {
165 .name = "100ask_led",
166 .of_match_table = ask100_leds,
167 },
168 };
169
170 static int __init chip_demo_gpio_drv_init(void)
171 {
172 int err;
173
174 err = platform_driver_register(&chip_demo_gpio_driver);
175 register_led_operations(&board_demo_led_opr);
176
177 return 0;
178 }
179

为什么这么做?

1.要知道内核对设备树的处理流程

从源代码文件 dts 文件开始,设备树的处理过程为:
在这里插入图片描述

① dts 在 PC 机上被编译为 dtb 文件;
② u-boot 把 dtb 文件传给内核;
③ 内核解析 dtb 文件,把每一个节点都转换为 device_node 结构体;
④ 对于某些 device_node 结构体,会被转换为 platform_device 结构体。
⑤platform_device 和platform_driver 配对

这里的第⑤怎么实现的呢,有5个比较方式

在这里插入图片描述

第一个是最先比较:是否强制选择某个driver

比较 platform_device. driver_override 和 platform_driver.driver.name
可以设置 platform_device 的 driver_override,强制选择某个 platform_driver。

第二个比较:设备树信息

比较: platform_device. dev.of_node 和 platform_driver.driver.of_match_table。
由设备树节点转换得来的 platform_device 中,含有一个结构体: of_node。
它的类型如下:在这里插入图片描述
如果一个 platform_driver 支持设备树,它的 platform_driver.driver.of_match_table 是一个数组,
类型如下:在这里插入图片描述
使用设备树信息来判断 dev 和 drv 是否配对时,
首先,如果 of_match_table 中含有 compatible 值,就跟 dev 的 compatile 属性比较,若一致则成功,
否则返回失败;
其次,如果 of_match_table 中含有 type 值,就跟 dev 的 device_type 属性比较,若一致则成功,否则
返回失败;
最后,如果 of_match_table 中含有 name 值,就跟 dev 的 name 属性比较,若一致则成功,否则返回失败

而设备树中建议不再使用 devcie_type 和 name 属性,所以基本上只使用设备节点的 compatible 属性来寻找匹配的platform_driver。
到这里我们就知道怎么添加设备树节点了吧,我们接着往下看完剩下两个比较device和drevers 的方式吧
第三个比较:platform_device_id

比较 platform_device. name 和 platform_driver.id_table[i].name, id_table 中可能有多项。
platform_driver.id_table 是“ platform_device_id”指针,表示该 drv 支持若干个 device,它里面
列出了各个 device 的{.name, .driver_data},其中的“ name”表示该 drv 支持的设备的名字, driver_data
是些提供给该 device 的私有数据。

最后比较:platform_device.name 和 platform_driver.driver.name

platform_driver.id_table 可能为空,
这时可以根据 platform_driver.driver.name 来寻找同名的 platform_device。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值