前言:设备树很简单,只需要学习语法。
一、DTC DTS DTB的关系
源码 :test.dts
可执行文件: test.dtb
编译工具:DTC
编译所有dts文件:make dtbs
编译指定的dts文件:make test.dtb
二、DTS 基本语法
头文件:
可以将芯片共有的信息提取出来作为一个通用的.dtsi文件
可以将芯片共有的信息提取出来作为一个通用的.dtsi文件
在其他文件中可以用#include 来引用这个公用的文件,例如#include "test.dtsi"
树根:
/为设备树的根
一棵树就用以下表示
/{
########
%%%%%
}
或者将一个根拆为两个
/{
########
}
/{
%%%%%
}
即两个根相当于一个根。在test.dts中的根和test.dtsi中的根可以合起来。
设备节点:
设备节点就相当于副树干,不同设备以设备节点的方式挂在主干上。
设备节点下是很多键值对,这些键值对称为属性,用来描述这个设备节点。
大致情况如图:
/{ /*根*/
根节点的属性一 = 1;
根节点的属性二 = 2;
节点一{
属性一 = 1;
属性二 = 2;
};
节点一{
属性一 = 1;
属性二 = 2;
};
}
节点命名格式:
label:node-name@usnit-addres
label:节点标签,相当于小朋友的外号
node-name:节点名字
usnit-addres:寄存器地址 可以不要
例子:
/{/*根节点*/
cpus{/*节点一*/
};
uart0:uart{/*节点2*/
};
led0:led@00a01000{/*节点3*/
};
}
label的作用
如果你在test.dtsi文件中使用了led节点
led0:led{
}
你想在test1.dts中修改led节点的属性就可以使用
&led0{
}
三、标准属性:
1 、compatible
兼容性
compatible 属性的值是一个字符串列表
例如:compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";
其中“fsl”表示厂商是飞思卡尔,“imx6ul-evk-wm8960”和“imx-audio-wm8960”表示驱动模块名字
2 、model
model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的
model = "wm8960-audio";
3 、status
- “okay” 表明设备是可操作的。
- “disabled”表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档。
- “fail”表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可操作。
- “fail-sss” 含义和“fail”相同,后面的 sss 部分是检测到的错误内容。
4 、#address-cells 和#size-cells
用于描述子节点的地址信息
#address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位),#size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。
一般 reg 属性都是和地址有关的内容,起始地址和地址长度。
reg 属性的格式一为:
reg = <address1 length1 address2 length2 address3 length3……>
例如:
aips3: aips-bus@02200000 {
compatible = "fsl,aips-bus", "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
dcp: dcp@02280000 {
compatible = "fsl,imx6sl-dcp";
reg = <0x02280000 0x4000>;
};
};
5 、reg
reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。
6 、ranges
ranges属性值可以为空或者按照<child-bus-address,parent-bus-address,length>格式编写的数字矩阵,ranges 是一个地址映射/转换表,ranges 属性每个项目由子地址、父地址和地址空间长度这三部分组成:
child-bus-address:子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。
parent-bus-address :父总线地址空间的物理地址,同样由父节点的#address-cells 确定此物理地址所占用的字长。
length :子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。
7 、name
name 属性值为字符串,name 属性用于记录节点名字。
8 、device_type
节点类型
四、设备树在系统中的体现:
系统启动以后可以在根文件系统里面看到设备树的节点信息
在 /proc/device-tree目录下存放着设备树信息
想要查看节点属性值可以使用 cat命令
如cd leds
使用cat name查看leds的name属性值
五、在设备树的根节点下添加一个自己的节点
在linux源码目录中执行 make dtbs
将生成的dtb文件拷贝到tftp目录
nfs方式启动开发板
cd /proc/deveice-tree
就可以看到自己的节点mytestnod