设备树加载及与驱动的匹配过程
一开时,uboot将dtb文件的地址传给内核,由内核去读取设备树的信息。
1.start_kernel() --> setup_arch(0 --> unflatten_device_tree() --> __unflatten_device_tree()函数中扫描dtb,并转换成节点是device_node的树状结构。(展开设备树)
2.of_platform_device_create_pdata() —> of_device_add() 注册设备并添加到对应的链表中。(注册设备树)
3.driver_register()->driver_match_device() 注册驱动调用match ,配对成功运行probe,配对所用的名字就是compatible属性的值。
传入probe参数的值是strcut device *dev,通过struct device_node *node=pdev->dev.of_node,由此可以获取到设备的节点信息
设备树源码
最近看了一下设备树知识,读个源码,加深一下理解
/dts-v1/;
#include <dt-bindings/pwm/pwm.h> //GPIO的宏定义
#include <dt-bindings/sound/samsung-i2s.h>
#include "exynos4412-itop-scp-core.dtsi"
//对于一些相同的dts配置可以抽象到dtsi文件中,include到dts文件中,对于同一个节点的设置情况,在在dts中对dtsi中的配置进行覆盖
/ {
model = "TOPEET iTop 4412 Elite board based on Exynos4412";
//compatible是类似于配对用的名字,用于区分节点,在进行匹配时,只要第二个字段匹配就可以
compatible = "topeet,itop4412-elite", "samsung,exynos44

本文介绍了Linux内核如何加载设备树(DTB),包括uboot传递DTB到内核、unflatten_device_tree展开设备树、驱动与设备的匹配过程。重点解析了设备树源码,探讨了#address-cells和#size-cells属性在设备描述中的作用,以及设备树数据的读取。通过实例解析设备树中reg属性和父节点规则,帮助深化对设备树的理解。
最低0.47元/天 解锁文章
2338

被折叠的 条评论
为什么被折叠?



