如何正确添加设备树节点

转自:https://blog.csdn.net/weixin_43209963/article/details/108118088

怎么做?
第 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 配对

注意:并非所有的device_node都会转换为platform_device只有以下的device_node会转换:

  1. 该节点必须含有compatible属性
  2. 根节点的子节点(节点必须含有compatible属性)
  3. 含有特殊compatible属性的节点的子节点(子节点必须含有compatible属性)这些特殊的compatilbe属性为:
    “simple-bus”,“simple- mfd”,“isa”,"arm,amba-bus "
  4. 根节点是例外的,生成platfrom_device时,即使有compatible属性也不会处理

这里的第⑤怎么实现的呢,有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。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值