设备树语法
- 1 Devicetree格式
- 1.1 DTS文件格式
- 1.2 node格式
- 1.3 properties格式
- 2 dts文件包好desi文件
- 3 常用的 属性 properties
- 3.1 #address-cells、#size-cells
- 3.2 compatible
- 3.3 model
- 3.4 status
- 3.5 reg(设备不同reg属性的含义就不同)
- 3.6 name、device_type(都过时了建议不用)
- 4 常用的 节点 node
- 4.1 根节点
- 4.2 cpu节点
- 4.2 memory节点
- 4.3 chosen节点
1 Devicetree格式
1.1 DTS文件格式
/dts-v1/; //表示版本
[memory reservations]; //格式为:/memreserve/ <address> <length>
/{
[property definitions]
[child nodes]
};
举例:
1.2 node格式
[lable:] node-name[@unit-address] {
[properties definitions];
[child nodes] ;
};
举例:
【注】:lable是标号可以省略,但一个有label的node可以被方便的引用,例如,有下面一个节点:
/dts-v1/;
/ {
uart0: uart@fe001000 {
compatible="ns16550";
reg=<0xfe001000 0x100>;
};
};
两种引用方式分别为:
①用lable引用node
&uart0 {
status = "disable";
};
②用全路径引用node
&{/uart@fe001000} {
status = "disable";
};
1.3 properties格式
In simple terms:“name = value”,其中value可能没有,如果有value,则有多种取值方式。
- arrays of cells(1 个或多个 32 位数据, 64 位数据使用 2 个 32 位数据表示),
- string(字符串)
- bytestring(1个或多个字节)
举例:
a. Arrays of cells :cell就是一个32位的数,用尖括号<>围起来
b. 64bit 数据使用 2 个 cell来表示
clock-frequency = <0x00000001 0x00000000>;
c. A bytestring(字节序列) ,用中括号包围起来,中括号括起来的为16进制单字节
local-mac-address = [00 00 12 34 56 78]; // 每个 byte 使用 2 个 16 进制数来表示
d. 也可是各种值的组合,用逗号隔开
compatible = "ns16550", "ns8250";
example = <0xf00f0000 19>, "a strange property format";
2 dts文件包好desi文件
dts文件不需要从头开始写,可以 通过include包含设备树模板,一般命名为XXX.dtsi文件,还可以包含一些.h文件,在.h文件中定义一些宏。(因为需要涉及到预处理过程,所以需要编译&&&编译,而不能直接用spr****编译)
3 常用的 属性 properties
3.1 #address-cells、#size-cells
其中cell指的是一个32位的数值。
address-cells:指address需要多少个32位数表示
size-cells:指size需要多少个32位数表示
【注】他们影响的是子节点中的reg属性;
此处的reg用于表示这是第几个CPU,设备不同reg属性的含义就不同。
3.2 compatible
表示兼容,如果对于某个LED驱动,内核中A、B、C三个驱动都支持它,可以写成:
led {
compatible = "A", "B", "C";
};
内核启动时,就会为这个LED按这样的有限顺序为它找到驱动程序。
compatible 的值,建议取这样的形式:“manufacturer,model”,即“厂家名,模块名”。
3.3 model
compatible属性可以知道兼容哪些板子,而module属性可以明确的告诉你到底是什么板。举例,根节点中可以这样写:
/{
compatible = "samsung,smdk2440", "samsung,mini2440";
model = "jz2440_v3";
};
3.4 status
可以决定是否启用板子上的某些驱动,比如板子上没有uart1:
&uart1 {
status = "disabled";
};
注:反过来写 "okay"
3.5 reg(设备不同reg属性的含义就不同)
register虽然本意是寄存器,但是ARM系统中寄存器和内存是统一编址的,他们在访问上没有任何区别,所以reg用于描述一段空间,reg属性的值是一系列的address和size。用多少个32位的数来表示address和size是由其父节点中#address-cells、#size-cells的属性决定的,举例:
/ {
#address-cell = <1>;
#size-cell = <1>;
memory {
reg = <0x80000000 0x20000000>;
};
};
上例中表示寄存器的起始地址和大小,设备不同reg属性的含义就不同。
3.6 name、device_type(都过时了建议不用)
用于表示节点名字,在platform_driver匹配时优先级最低,device_type优先级为中。而compatible属性在匹配过程中优先级最高。
4 常用的 节点 node
4.1 根节点
4.2 cpu节点
芯片厂家提供的dtsi文件都定义好了。
4.2 memory节点
一般需要制作电路板的公司根据自己选用的内存芯片大小来设置。
4.3 chosen节点
这个是虚拟节点,不对应具体的设备,可以通过设备树文件给内核传入一些参数,比如可在chosen节点中设置bootargs:
chosen {
bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";
};
参考:韦东山《嵌入式Linux应用完全开发手册》