第十七节、设备树基本语法
本节用于介绍设备树基本语法
一、设备树基本框架
- 设备树从根节点开始,每个设备都是一个节点。
- 节点和节点之间可以互相嵌套,形成父子关子。
- 设备的属性用key-value对(键值对)来描述,每个属性用分号结束
二、设备树语法
节点
什么是节点呢?节点就好比一颗大树,从树的主干开始,然后有一节一节的树枝,这个就叫节点。在代码中的节点是什么样子的呢。我们把上面模板中的根节点摘出来,如下图所示,这个就是根节点。相当于大树的树干。
/ {//根节点
};//分号
而树枝就相当于设备树的子节点,同样我们把子节点摘出来就是根节点里面的node1和node2,如下图所示:
/ {//根节点
node1//子节点node1
{
};
node2//子节点node2
{
};
};//分号
一个树枝是不是也可以继续分成好几个树枝呢,也就是说子节点里面可以包含子子节点。所以child-node1和child-node2是node1和node2的子节点,如下图所示:
/ {//根节点
node1//子节点node1
{
child-node1//子子节点
{
};
};
node2//子节点node2
{
child-node2//子子节点
{
};
};
};//分号
节点名称
节点的命名有一个固定的格式。
格式:<名称>[@<设备地址>]
<名称>节点的名称也不是任意起的,一般要体现设备的类型而不是特点的型号,比如网口,应该命名为ethernet,而不是随意起一个,比如111。
<设备地址>就是用来访问该设备的基地址。但并不是说在操作过程中来描述一个地址,他主要用来区分用。
注意事项:
<1>同一级的节点只要地址不一样,名字是可以不唯一的。
<2>设备地址是一个可选选项,可以不写。但为了容易区分和理解,一般是都写的。
节点别名
当我们找一个节点的时候,我们必须书写完整的节点路径,如果我们的节点名很长,那么我们在引用的时候就十分不方便,所以,设备树允许我们用下面的形式为节点标注引用(起别名)。比如一个动漫人物的名字是蒙其D-路飞,他的小名是路飞,那是不是小名要比我们的全名更容易记忆了。这个就是别名。
举例:
duart0: serial@21c0500
节点的引用
一般我往一个节点里面添加内容的时候,不会直接把添加的内容写到节点里面,而是通过节点的引用来添加。
&duart0 {
status = "okay";
};
&duart0表示引用节点别名为duart0的节点,并往这个节点里面添加或者覆盖以下内容:
status = "okay";
注意事项:
编译设备树的时候,相同的节点的不同属性信息都会被合并,相同节点的相同的属性会被重写,使用引用可以避免移植者四处找节点。如dts和dtsi里面都有根节点,但最终会合并成一个根节点。
属性
reg属性
reg 属性用来描述一个设备的地址范围。
格式:
reg = <add1 length1 [add2 length2]……>
举例:
esdhc: esdhc@1560000 {
reg = <0x0 0x1560000 0x0 0x10000>;
};
其中,0x0是起始地址,0x1560000就是长度
#address-cells 和#size-cells 属性
#address-cells 用来设置子节点中reg地址的数量
#size-cells用来设置子节点中reg 地址长度的数量。
举例:
soc: soc {
#address-cells = <2>;
#size-cells = <2>;
esdhc: esdhc@1560000 {
reg = <0x0 0x1560000 0x0 0x10000>;
};
};
其中#address-cells和#size-cell均为2,也就是说我们子节点里面的reg 属性里这个寄存器组的起始地址有两个,长度也只有两个。所以0x0是起始地址,0x1560000是长度;0x0是起始地址,0x10000是长度,
compatible 属性
compatible是一个字符串列表,可以在代码中进行匹配。
举例:
compatible = "simple-bus";
status 属性
status 属性的值类型是字符串,这里我们只要记住俩个常用的即可,一个是okay,表示设备可以正常使用,一个是disable,表示设备不能正常使用。