目录
- 01-Linux的内核对设备树书写的说明文档
- 01-根节点和子节点的概念
- 02-带标签的节点与节点名的区别
- 03-以`&`开头的引用结构
- 04-设备树文件的层次结构
- 05-如果系统中的设备树描述文件包含了另一个设备树描述文件,那么岂不是出现了两个根节点?
- 06-双引号中的内容表示字符串,`<>`中的内容表示数值
- 07-设备树的节点格式是很灵活的,其最终目标是与驱动程序的解析逻辑无缝对接
- 08-如何禁止一个节点的使用
- 09-设备树文件(dts文件)和编译生成的dtb文件在哪里?
- 10-Linux系统运行时命令行中的相关基本操作
- 11-大家惯用的属性名字积累
- 12-为什么会出现一个节点下有子节点的情况?
- 13-注意:节点取名字的时候名字不要太短,否则容易冲突
- 14-如何查看一个dtb文件是否有某个节点?
- 15-如何查看内核中有没有某个节点?
- 16-如何在内核中查看某个节点的各属性值?
- 167-一些有设备树文件书写的具体例子
01-Linux的内核对设备树书写的说明文档
文档位置在哪里?
路径为:E:\Source_Insight_project\P005_driver01\Linux-4.9.88\Documentation\devicetree
具体的各设备和总线的设备树编写说明在上面截图的bindings
目录中:
举例说明
比如对SPI总线的设备树描述说明就在下面的文件中:
再比如对I2C总线的描述说明可参考下面这个文件:
从Linux-4.9.88
内核源码中抽取出的设备树文档打包下载地址
https://pan.baidu.com/s/1Phtc1nZ0IoLo7DiwZXFEeg?pwd=amba
01-根节点和子节点的概念
问:对下面的设备树语句哪些是根节点?哪些是子节点?
/ {
model = "Freescale i.MX6 ULL 14x14 EVK Board";
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
chosen {
stdout-path = &uart1;
};
memory {
reg = <0x80000000 0x20000000>;
};
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
linux,cma {
compatible = "shared-dma-pool";
reusable;
size = <0x14000000>;
linux,cma-default;
};
};
backlight {
compatible = "pwm-backlight";
pwms = <&pwm1 0 1000>;
brightness-levels = <0 1 2 3 4 5 6 8 10>;
default-brightness-level = <8>;
status = "okay";
};
}
在提供的设备树片段中,根节点是以下部分:
/ {
model = "Freescale i.MX6 ULL 14x14 EVK Board";
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
...
}
解释如下:
-
根节点标识:
- 根节点使用
/
来标识,它没有名字,它没有名字,它没有名字, 它是整个设备树的顶级节点。 - 根节点包含所有其他节点(例如例子中
chosen
、memory
、reserved-memory
、backlight
等),这些都是根节点的子节点。
- 根节点使用
-
根节点属性:
model
和compatible
是根节点的属性,描述了硬件平台的信息:model
:硬件平台的名称(这里是Freescale i.MX6 ULL 14x14 EVK Board
)。compatible
:表示设备与哪些驱动或硬件配置兼容。
-
子节点:
- 上面代码中的根节点中的子节点包括:
chosen
:指定启动时的配置信息,例如控制台输出路径(stdout-path
)。memory
:描述系统内存区域。reserved-memory
:定义保留内存区域,通常用于特殊用途(如 DMA 或 CMA)。backlight
:定义背光设备的信息(如 PWM 配置)。
- 上面代码中的根节点中的子节点包括:
注意:根节点是唯一的:设备树中只有一个根节点,且位于文件的最顶层,它用符号/
进行表示,它也没有具体的名字。上述代码中,/
节点是根节点,而 chosen
、memory
、reserved-memory
和 backlight
都是它的子节点。
02-带标签的节点与节点名的区别
每个节点都可以通过一个标签来标识。标签紧跟在节点名的前面,使用冒号 : 分隔。
例如:
uart1: serial@2020000 {
// 定义一个名为 uart1 的标签
compatible = "fsl,imx6ull-uart";
reg = <0x2020000 0x1000>;
};
在这段语句中,为名称为serial@2020000
的节点定义了标签,其标签名为uart1
,标签名的主要作用是方便节点被引用。关于引用的详细情况,请往下看。
03-以&
开头的引用结构
以&
开头的引用结构的详细概述
问:我看到在根节点所在的{}
之外还有很多别的节点,比如下面这几个:
&flexcan1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_flexcan1>;
xceiver-supply = <®_can_3v3>;
status = "okay";
};
&gpc {
fsl,cpu_pupscr_sw2iso = <0x1>;
fsl,cpu_pupscr_sw = <0x0>;
fsl,cpu_pdnscr_iso2sw = <0x1>;
fsl,cpu_pdnscr_iso = <0x1>;
fsl,ldo-bypass