DTS文件布局(layout):
/dts-v1/;
[ memory reservations ]
/ {
[ property definetions ]
[ child nodes ]
};
/dts-v1/; 注:dts的版本信息
[ memory reservations ] 注:保留的内存区域,假如一块区域不想给内核使用,而是自己使用,如果让内核使用全部的空 间,此选项就省略。格式为:/memreserve/ <address> <length>
/ { 注:/表示根,设备树真正的起点。
[ property definetions ] 注:属性用来描述硬件信息。
property格式1:[ label: ] property-name = value;
property格式2:[ label: ] property-name;
value格式1:< ... > 括号内是一个或者多个32位数据,例如interrupt = < 1 0x03 0x123 >
value格式2:" ... "引号内是字符串,例如compatible = "arm,arm926ej-s"
value格式3:[ ... ]括号内是16进制表示的一个或者多个字节,例如local-mac-address = [ 00 11 22 34 56 78 ]
value格式4:也可以3种组合使用,中间用,分开。example = <0xf00f0000 19>, " a strang property format"
compatible = "ns16550","ns8250";
[ child nodes ] 注:节点名字和属性
devicetree node格式: [ label: ] node-name[ @unit-address ] {
[ properties definitions ]
[ child nodes ]
};
其中@unit-address是为了区别节点名字不重复,假如有两个memory节点,一个memory{};
另一个memory@0x30000000{};
默认属性:
/dts-v1/;
/{
model = "SMDK2440";
compatible = "samsung,smdk2440";
#address-cells = <1>;
#size-cells = <1>;
};
- model :这个板子是什么板子,假如有两款板子的配置基本一致,它们的compatible是一样的,那么就通过model来分辨这两款板子。
- compatible :定义一系列的字符串,用来指定内核中哪个machine_desc可以支持本设备,也就是这个板子兼容哪些平台。
- address-cells:在它的子节点的reg属性中,使用多少个u32整数来描述地址(address)。
- size-cells:在它的子节点的reg属性中,使用多少个u32整数来描述大小(size)。
引用其他节点:
- phandle:节点中的phandle属性,它的取值必须是唯一的(不能跟其他的phandle值一样)
pic@10000000{
phandle = <1>; //使用phandle来标明自己
interrupt-controller;
};
another-device-node{
interrupt-parent = <1>; //使用phandle的值为1来引用上述节点
};
- label:使用label来引用上述节点,使用label时实际上也是使用phandle来引用,在编译dts文件为dtb文件时,编译器dtc会在dtb中插入phandle属性。
PIC:pic@10000000{
interrupt-controller;
};
another-device-node{
interrupt-parent = < &PIC >;
};
example:
dts文件中会把公用的部分写为dtsi文件,在dts中#include dtsi。
//假如dtsi中已经定义的引脚需要修改,可以直接在dts文件中重写,就会覆盖
例如覆盖之前dtsi文件中已经定义过的led节点
dts
#include"xxxx.dtsi"
/{
led{
pin = <S3C2440_GPF(6)>;
};
};
//如果之前的节点定义了label为LED,则可以简写
&LED{
pin = <S3C2440_GPF(6)>;
};
怎么查看已经编译好的dtb文件:
./scripts/dtc/dtc -I dtb -O dts -o tmp.dts arch/arm/boot/dts/jz2440.dtb