一. 简介
上一篇文章对设备树文件进行了简单的介绍,文章地址如下:
本文继续 学习 设备树文件,具体学习设备树文件的语法与设备树文件的调用关系。
接下来的几篇文章,我们就以
imx6ull-alientek-emmc.dts
这个文件为例来讲解一下
DTS
语法。
关于设备树 详 细 的 语 法 规 则 请 参 考 《 Devicetree SpecificationV0.2.pdf 》 和
《Power_ePAPR_APPROVED_v1.12.pdf》这两份文档。此两份文档已经放到了开发板光盘中,
路 径 为 :
【正点原子】阿尔法Linux开发板(A盘)-基础资料-2022 /【正点原子】阿尔法Linux开发板(A盘)-基础资料 / 参考资料
1. .dts设备树文件与 .dtsi 设备树头文件
和 C 语言一样,设备树也支持头文件,设备树的头文件扩展名为 .dtsi。
在
imx6ull-alientek-emmc.dts
中有如下所示内容:
#include <dt-bindings/input/input.h>
#include "imx6ull.dtsi"
看到这里,大家可能会疑惑,不是说设备树的扩展名是
.dtsi
吗?为什么也可以直接引用
C
语言中的
.h
头文件呢?这里并没有错,.dts
文件引用
C
语言中的
.h
文件,甚至也可以引用
.dts
文
件。
打开
imx6ull-14x14-evk-gpmi-weim.dts
这个文件,此文件中有如下内容:
#include "imx6ull-14x14-evk.dts"
可以看出,.dts 设备树文件
直接引用了
.dts
文件,因此在
.dts
设备树文件中,可以通过
“
#include
”来引用
.h
、
.dtsi
和
.dts
文件。只是,我们在编写设备树头文件的时候最好选择
以 .dtsi 为
后
缀。
2. .dtsi 设备树头文件的内容
一般.dtsi 文件用于描述 SOC(即imx6ull芯片) 的内部外设信息,例如, CPU
架构、主频、外设寄存器地址范围,比如
UART
、
IIC
等等。
例如,
imx6ull.dtsi
就是描述
I.MX6ULL
这颗
SOC
内部外设情况信息
的,内容如下:
#include <dt-bindings/clock/imx6ul-clock.h>
#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
#include "imx6ull-pinfunc.h"
#include "imx6ull-pinfunc-snvs.h"
#include "skeleton.dtsi"
/ {
aliases {
can0 = &flexcan1;
.........................................
};
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
.........................................
};
intc: interrupt-controller@00a01000 {
compatible = "arm,cortex-a7-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x00a01000 0x1000>,
<0x00a02000 0x100>;
};
clocks {
#address-cells = <1>;
#size-cells = <0>;
ckil: clock@0 {
compatible = "fixed-clock";
reg = <0>;
#clock-cells = <0>;
clock-frequency = <32768>;
clock-output-names = "ckil";
};
.........................................
};
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
interrupt-parent = <&gpc>;
ranges;
busfreq {
compatible = "fsl,imx_busfreq";
..........................................
};
gpmi: gpmi-nand@01806000{
compatible = "fsl,imx6ull-gpmi-nand", "fsl, imx6ul-gpminand";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x01806000 0x2000>, <0x01808000 0x4000>;
..........................................
};
......
};
};
可以看出,
在
imx6ull.dtsi
文件中不仅仅描述了
cpu0
这一个节点信息,
I.MX6ULL
这颗
SOC
所有的外设都描述的清清楚楚,比如
ecspi1~4
、
uart1~8
、
usbphy1~2
、
i2c1~4
等等,关于这些设备节点信息的具体内容我们稍后在详细的讲解。