设备树的作用是代替device.c来描述硬件。paltform的匹配方式不变,而且使用设备树,对硬件的改动就不需要去改动device.c重新编译到内核中,而是可以直接通过bootloader传递给内核,所以设备树也是platform平台设备驱动的一部分,是platform平台设备驱动框架的一种优化编写形式。
1. dts ,dtsi ,dtc , dtb
dts:设备树文件;
dtsi:通用设备树文件;
dtc:设备树编译器
dtb:设备树编译器编译设备树文件最终生成二进制文件
2.新增dts设备树文件
在设备树目录下新建xxx.dts设备树文件,然后在dtb编译文件Makefile中添加:
dtb-$(CONFIG_ARCH_ROCKCHIP)+=xxx.dtb
这样在编译设备树的时候就会将对应的xxx.dts 编译为二进制的xxx.dtb 文件;
【/kernel/arch/arm64/boot/dts/rockchip/】设备树参考路径
3.设备树文件语法
3.1可以像c文件一样添加头文件包含,设备树文件的头文件一般为dtsi文件
dtsi文件一般包含了SOC内部外设信息,在SOC整体移植的过程中,dtsi文件是通用部分,可以直接使用
3.2设备树-节点
设备树的起始:根节点,所有的设备节点都包含在根节点下,根节点的表示方法:
/{
}
以反斜杠+大括号的方式表示根节点,且整个系统只有一个根节点,包含在根节点内部的节点都为子节点,同时子节点内部也可以包含节点进行延伸表现形式如下:
/ { //根节点
node1 { //子节点
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 { //子节点中的子节点
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 { //子节点
an-empty-property;
a-cell-property = <1 2 3 4>;
child-node1 { //子节点中的子节点
};
};
}
3.3节点内包含的内容
节点的命名规则:<名称>@设备地址
名称不可以随意命名,要体现设备类型
设备地址是访问该设备的基地址,主要用于区分节点
节点别名:
举例:uart8: serial@02288000
其中,uart8 就是这个节点名称的别名,serial@02288000 就是节点名称。
后期添加或修改节点信息的时候可以通过别名直接操作
&uart8{
pinctrl_names = “uart8”;
status = “okay”;
};
后期对节点信息的修改,对于原先节点中已有的属性会进行重写操作,对于原先节点中没有的属性则会添加到原有的节点中。直接引用节点可以避免在设备树文件中去找修改,直接在同级节点路径末尾修改即可,当然也可以在原有的节点中直接进行属性的修改。
3.4标准属性
不同平台,不同总线,地址位长度可能不同,有 32 位地址,有 64 位地址,为了适应规范,规定一个 32 位的长度为一个 cell。
3.4.1#address_cells:表示子总线地址(子节点设备地址)所需要的cell个数,u32类型数据
3.4.2#size_cells:表示子总线地址空间长度所需要的cell个数,u32类型数据
如果没有设置,内核默认认为”#address-cells”为 2,”#size-cells”为 1。
(用于父节点配置来设置子节点的reg属性)
3.4.3reg :”reg”属性用来表示节点地址资源的,比如常见的就是寄存器的起始地址及大小。要想表示一块连续地
址,必须包含起始地址和空间大小两个参数,如果有多块地址,那么就需要多组这样的值表示。对于’reg’
属性,每个元素是一个二元组,包含起始地址和大小。还有另外一个问题,地址和大小用几个 u32 表示呢?
这个就由父节点的”#address-cells”,”#size-cells”属性确定
3.4.4compatible:设备树中的每个表示一个设备的节点都需要一个 compatible 属性, compatible 属性是操作系统用来决定设备和驱动绑定的关键因素。compatible 属性也叫做兼容性属性,属性的值是一个字符串列表,用于表示是何种设备,可以在代码中进行匹配。
3.4.5status:属性用来表示节点的状态,其实就是硬件的状态,用字符串表示。
“okay”表示硬件正常工作
“disable”表示当前硬件不可用 “fail”表示因为出错不可用
“fail-sss”表示某种原因出错不可用,sss 表示具体出错的原因。
实际中,基本只用“okay”和“disable”