提示:了解驱动设备树相关基础语法
文章目录
前言
- 我理解设备树就是一个配置文件,如上层应用或者服务器开发中的配置文件,太像了,只是语法不一样,描述的内容都是底层相关的,属性不一样。
- 基于属性、语法稍微不一样,刚接触时候确实很难理解。
多看看,多接触,多理解,这样才能为后续开发打好基础。
参考资料
dtc dts/dtsi dtb的关系
设备树中的dtc dts/dtsi dtb的关系梳理
设备树基本语法
Linux设备树(Device Tree)机制
一、设备树的编译
大家可以参考下上面参考资料,这里面涉及到TS、 DTSI、 DTB 和 DTC 四个名词。
这里直接用一个图来描述吧,如下:

简单讲:
- dts 就是设备树的源文件,dtsi 是dts 的头文件可以让所有的dts 文件引用。 dtc 是编译器,dtb 是编译后的文件。
- 从dts/dtsi 经过dtc 生成了 dtb ,当然 dtb 也可以通过dtc 反编译生成dtc 。
在理解dtc 之前,我么先写一个最简单的设备树吧
/dts-v1/;
/{
};
编译器dtc-dts和dtb 编译和反编译
dtc 模块在源码位置
不管什么平台产品,dtc 是补一个设备树编译器模块,位置如下:它本身就是一个模块,里面有MakeFile 编译文件和dtc 可执行文件
kernel/scripts/dtc

dts 通过 dtc 编译生成dtb
命令如下:
dtc -I dts -O dtb -o output.dtb input.dts
input.dts是输入的设备树源文件,output.dtb是编译后的二进制设备树文件。
编译器会验证设备树源文件的语法和语义, 生成与硬件描述相对应的设备树表示形式。
自己实际测试,如下:

dtb 通过 dtc 编译生成dts
指令如下: 发现和编译指令基本一致
dtc -I dtb -O dts -o output.dts input.dtb
- input.dtb 是输入的二进制设备树文件, output.dts 是反编译后的设备树源文件。
反编译器会将二进制设备树文件解析并还原为文本形式的设备树源文件, 使其可读性更
好
自己测试如下:

二、设备树语法
根节点
这里直接给出根节点代码 配置如下:
/dts-v1/; // 设备树版本信息 - 特别注意,这里有个 分好
/{
// 注意这里有个 / 下划线
// 根节点开始
/*
在这里可以添加注释, 描述根节点的属性和配置
*/
}; // 注意这里有个分号
根节点应该闭着眼睛就能写出来才对,但是初学者,一定要多练习,出个错太正常了。
子节点
子节点标准如下:
[label:] node-name@[unit-address] {
[properties definitions]
[child nodes]
};
-
节点标签(Label) (可选) : 节点标签是一个可选的标识符, 用于在设备树中引用
该节点。 标签允许其他节点直接引用此节点, 以便在设备树中建立引用关系。 -
节点名称(Node Name) : 节点名称是一个字符串, 用于唯一标识该节点在设备树
中的位置。 节点名称通常是硬件设备的名称, 但必须在设备树中是唯一的。 -
单元地址(Unit Address) ( 可选) : 单元地址用于标识设备的实例。 它可以是一个
整数、 一个十六进制值或一个字符串, 具体取决于设备的要求。 单元地址的目的是区分相同类
型的设备的不同实例, 例如在下图( 55-6) 中名为 cpu 的节点通过它们的单元地址值 0 和 1 来
区分, 名称为 ethernet 的节点通过其单元地址值 fe002000 和 fe003000 来区分 -
属性定义( Properties Definitions) : 属性定义是一组键值对, 用于描述设备的配置
和特性。 属性可以根据设备的需求进行定义, 例如寄存器地址、 中断号、 时钟频率等, 关于这
些属性会在后面的小节中进行讲解 -
子节点( Child Nodes) : 子节点是当前节点的子项, 用于进一步描述硬件设备的子
组件或配置。 子节点可以包含自己的属性定义和更深层次的子节点, 形成设备树的层次结构。
分析: 其实代码和对应的属性都解释的很清楚了,如果还是很难理解的话,下面分析下:
比如
- 比如 子设备是一个gpio 子节点:那么简单的子节点应这样定义了就可以了。
/dts-v1/;
/{
gpio{
// gpio 就是 node-name
};
};
问题:系统gpio 很多很多的,同一个级别有不能相同标签,那么可以加一个内存地址来区别,如下。
- 添加内存地址
/dts-v1/;
/{

最低0.47元/天 解锁文章
1605

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



