当前位置: 代码迷 >> 综合 >> [RK3399][Android7.1] 学习笔记 --- Linux内核的设备树DTS详解
  详细解决方案

[RK3399][Android7.1] 学习笔记 --- Linux内核的设备树DTS详解

热度:31   发布时间:2023-10-09 13:19:46.0

设备树的简介

Linux 内核3.X之后,arch/arm/plat-xxx和arch/arm/mach-xxx中,描述板级细节的代码(比如platform_device、i2c_board_info等)被大量取消,取而代之的是设备树,其目录位于arch/arm/boot/dts或者是arch/arm64/boot/dts;

设备树的组成

设备树由1个dts + 多个dtsi组成,他们经过编译而成的dtb文件就是真正的设备树;

dts:一般情况下,一个dts代表公司的具体某一个产品,适用于同一套源码内适配不同的公司产品,而每次编译的时候只编译与该dts有关的信息。

dtsi: dtsi则是应用于在一套源码中包含有多个dts(产品)的情况下,把这些共性的信息存放在dtsi,dts可以去inclue这些dtsi;

dtb: dtb(Device Tree Blob),dts经过dtc编译之后会得到dtb文件,dtb通过Bootloader引导程序加载到内核。所以Bootloader需要支持设备树才行;Kernel也需要加入设备树的支持;

设备树的使用方法

接下来,我们将源码的kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dts为例,进行学习;

第一部分:dts文件的版本以及include插入头文件

/dts-v1/;#include "rk3399-excavator-sapphire.dtsi"
#include "rk3399-android.dtsi"
#include "rk3399-vop-clk-set.dtsi"

1、/dts-v1/;

dts的版本信息

2、#include

插入头文件,也就是前文说的dtsi

第二部分:“/” root节点(节选)

/ {model = "Rockchip RK3399 Excavator Board edp (Android)";compatible = "rockchip,android", "rockchip,rk3399-excavator-edp", "rockchip,rk3399";vcc_lcd: vcc-lcd {compatible = "regulator-fixed";regulator-name = "vcc_lcd";gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>;startup-delay-us = <20000>;enable-active-high;regulator-min-microvolt = <3300000>;regulator-max-microvolt = <3300000>;regulator-boot-on;vin-supply = <&vcc5v0_sys>;};panel: panel {compatible = "simple-panel";backlight = <&backlight>;power-supply = <&vcc_lcd>;enable-gpios = <&gpio1 13 GPIO_ACTIVE_HIGH>;prepare-delay-ms = <20>;enable-delay-ms = <20>;display-timings {native-mode = <&timing0>;timing0: timing0 {clock-frequency = <200000000>;hactive = <1536>;vactive = <2048>;hfront-porch = <12>;hsync-len = <16>;hback-porch = <48>;vfront-porch = <8>;vsync-len = <4>;vback-porch = <8>;hsync-active = <0>;vsync-active = <0>;de-active = <0>;pixelclk-active = <0>;};};ports {panel_in: endpoint {remote-endpoint = <&edp_out>;};};};
};

1、“/” root节点代表根节点

2、model = 一般为字符串类型,描述了产商以及板子的名称;

3、compatible 兼容,也为字符串类型,跟节点下的compatible属性,用于内核查找,用于匹配model的开发板对应的代码。如果compatible配置得不对,会导致卡在starting kernel中,无法启动内核。

4、vcc_lcd: vcc-lcd 称为子节点,我们好根节点内的几个节点(包含子节点的子节点)拿出来一起分析,分别是vcc_lcd: vcc-lcd、panel: panel、display-timings、timing0: timing0、ports和panel_in: endpoint;

子节点的语法规则

[label:] node-name[@unit-address]

1)label 标签、别名,可选项,由一个单词或者多个单词组成,多个单词中间_连接。引入label 的目的就是为了方便访问节点,可以直接通过&label 来访问这个节点;例如节选的&timing0;

2)node-name 节点名称,由一个单词或者多个单词组成,多个单词中间-连接。节点名字,为 ASCII 字符串,节点名字应该能够清晰的描述出节点的功能(label同样如此)。

3)@unit-address 一般表示设备的地址或寄存器首地址,如果某个节点没有地址或者寄存器的话“unit-address”可以不要;

5、compatible 兼容,,与前面根节点下的兼容一样,也为字符串类型。而这个兼容代表在内核启动时,就会为这个vcc-lcd找到驱动程序,如果添加了多种兼容,会按照从左到右的优先级依次寻找驱动程序。

6、regulator-name 稳定器名称,Regulator(稳定器):指可以自动维持恒定电压(voltage)或电流(current)的装置,一般指电源芯片。在嵌入式设备中,基本上每一种电压,都是经过regulator输出的;具体要联系驱动的代码进行分析。

7、gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>; 代表GPIO4 PC6默认高电平 ;30 = 24+6;

8、startup-delay-us = <20000>; 20000us的延时,常用于调整时序;

9、enable-active-high;   同样的默认为高电平,在driver中使用of函数读取此属性,如果有此字段,可以使能某些操作;如果没有就失能某些操作。

第三部分:引用节选

&backlight {status = "okay";enable-gpios = <&gpio4 29 GPIO_ACTIVE_HIGH>;
};

这是一个背光节点,通过&label(也可以直接&节点的路径),访问/引用/复写backlight,status为状态属性,enable-gpio为使能背光on/off脚配置;我们通过dtsi一级一级查看backlight的节点,rk3399-sapphire-excavator-edp.dts插入了rk3399-excavator-sapphire.dtsi,rk3399-excavator-sapphire.dtsi插入了rk3399-sapphire.dtsi,而改dtsi中包含一个backlight节点,节点如下;

	backlight: backlight {status = "disabled";compatible = "pwm-backlight";pwms = <&pwm0 0 25000 0>;brightness-levels = <0   1   2   3   4   5   6   78   9  10  11  12  13  14  1516  17  18  19  20  21  22  2324  25  26  27  28  29  30  3132  33  34  35  36  37  38  3940  41  42  43  44  45  46  4748  49  50  51  52  53  54  5556  57  58  59  60  61  62  6364  65  66  67  68  69  70  7172  73  74  75  76  77  78  7980  81  82  83  84  85  86  8788  89  90  91  92  93  94  9596  97  98  99 100 101 102 103104 105 106 107 108 109 110 111112 113 114 115 116 117 118 119120 121 122 123 124 125 126 127128 129 130 131 132 133 134 135136 137 138 139 140 141 142 143144 145 146 147 148 149 150 151152 153 154 155 156 157 158 159160 161 162 163 164 165 166 167168 169 170 171 172 173 174 175176 177 178 179 180 181 182 183184 185 186 187 188 189 190 191192 193 194 195 196 197 198 199200 201 202 203 204 205 206 207208 209 210 211 212 213 214 215216 217 218 219 220 221 222 223224 225 226 227 228 229 230 231232 233 234 235 236 237 238 239240 241 242 243 244 245 246 247248 249 250 251 252 253 254 255>;default-brightness-level = <200>;};

可以看到这里的状态是disabled,开启的方法是在dts中通过&backlight引用后再开启。其他的属性介绍可参考文档《RockChip_DSS Development Guide v1.2.pdf

驱动中如何获取 dts 信息

1、通过compatible 兼容建立联系

2、通过of api 获取属性的数值

参考:

RK平台linux-3.10相关介绍.pdf

ARM Linux 3.x的设备树(Device Tree)