嵌入式Linux--设备树(二)设备树模板
目录
- 1、添加cpus节点
- 2、添加soc节点
- 3、添加ocram节点
- 4、添加aips1,aips2和aips3这三个子节点
- 5、添加ecspi1,usbotg1和rngb这三个外设控制器节点
在上面DTS 的语法做了比较详细的讲解,这里就根据前面讲解的语法,从头到尾编写一个小型的设备树文件。当然了,这个小型设备树没有实际的意义,做这个的目的是为了掌握设备树的语法。在实际产品开发中,我们是不需要完完全全的重写一个.dts 设备树文件,一般都是使用 SOC 厂商提供好的.dts 文件,我们只需要在上面根据自己的实际情况做相应的修改即可。在编写设备树之前要先定义一个设备,我们就以 I.MX6ULL 这个 SOC 为例,我们需要在设备树里面描述的内容如下:
- ①、I.MX6ULL 这个 Cortex-A7 架构的 32 位 CPU。
- ②、I.MX6ULL 内部 ocram,起始地址 0x00900000,大小为128KB(0x20000)。
- ③、I.MX6ULL 内部 aips1 域下的 ecspi1 外设控制器,寄存器起始地址为 0x02008000,大小为 0x4000。
- ④、I.MX6ULL 内部 aips2 域下的 usbotg1 外设控制器,寄存器起始地址为 0x02184000,大小为 0x4000。
- ⑤、I.MX6ULL 内部 aips3 域下的 rngb 外设控制器,寄存器起始地址为 0x02284000,大小为 0x4000。
为了简单起见,我们就在设备树里面就实现这些内容即可,首先,搭建一个仅含有根节点“/”的基础的框架,新建一个名为 myfirst.dts 文件,在里面输入如下所示内容:
/ {
compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
}
设备树框架很简单,就一个根节点“/”,根节点里面只有一个 compatible 属性。我们就在这个基础框架上面将上面列出的内容一点点添加进来。
1、添加cpus节点
首先添加CPU节点,I.MX6ULL采用Cortex-A7架构,而且只有一个CPU,因此只有一个cpu0节点,完成以后如下:
/ {
compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
cpus {
#address-cells = <1>;
#size-cells = <0>;
//CPU0节点
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
};
};
}
cpus节点,次节点用于描述SOC内部的所有CPU,因为I.MX6ULL只有一个CPU,因此只有一个cpu0子节点。
2、添加soc节点
如uart,iic控制器等等这些都属于SOC内部外设,因此一般会创建一个叫做soc的父节点来管理这些SOC内部外设的子节点,添加soc节点以后的文件如:
/ {
compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
cpus {
#address-cells = <1>;
#size-cells = <0>;
//CPU0节点
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
};
};
// soc节点
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges;
};
}
- soc 节点,soc 节点设置
#address-cells = <1>,#size-cells = <1>
,这样 soc 子节点的 reg 属性中起始地占用一个字长,地址空间长度也占用一个字长。 - ranges 属性,ranges 属性为空,说明子空间和父空间地址范围相同。
3、添加ocram节点
添加 ocram 节点,ocram 是 I.MX6ULL 内部 RAM,因此 ocram 节点应该是 soc 节点的子节点。ocram 起始地址为 0x00900000
,大小为 128KB(0x20000)
,添加 ocram节点以后文件内容如下所示:
/ {
compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
cpus {
#address-cells = <1>;
#size-cells = <0>;
//CPU0节点
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
};
};
// soc节点
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges;
// ocram 节点
ocram: sram@00900000 {
compatible = "fsl,lpm-sram";
reg = <0x00900000 0x20000>;
};
};
}
- ocram 节点,第 24 行节点名字@后面的 0x00900000 就是 ocram 的起始地址。
- reg 属性也指明了 ocram 内存的起始地址为 0x00900000,大小为 0x20000。
4、添加aips1,aips2和aips3这三个子节点
I.MX6ULL 内部分为三个域:aips13,这三个域分管不同的外设控制器,aips13 这三个域对应的内存范围如下所示:
域 | 起始地址 | 大小(hex) |
---|---|---|
AIPS1 | 0x02000000 | 0x100000 |
AIPS2 | 0x02100000 | 0x100000 |
AIPS3 | 0x02200000 | 0x100000 |
我们先在设备树中添加这三个域对应的子节点。aips1~3这三个域都属于soc节点的子节点,完成以后的文件内容如下所示:
/ {
compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
cpus {
#address-cells = <1>;
#size-cells = <0>;
//CPU0节点
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
};
};
// soc节点
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges;
// ocram 节点
ocram: sram@00900000 {
compatible = "fsl,lpm-sram";
reg = <0x00900000 0x20000>;
};
// aips1 节点
aips1: aips-bus@02000000 {
compatible = "fsl,aips-bus","simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x2000000 0x100000>;
ranges;
};
// aips2 节点
aips2: aips-bus@02100000 {
compatible = "fsl,aips-bus","simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x2100000 0x100000>;
ranges;
};
// aips3 节点
aips3: aips-bus@02200000 {
compatible = "fsl,aips-bus","simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x2200000 0x100000>;
ranges;
};
};
}
5、添加ecspi1,usbotg1和rngb这三个外设控制器节点
最后我们在 myfirst.dts 文件中加入 ecspi1,usbotg1 和 rngb 这三个外设控制器对应的节点,其中 ecspi1 属于 aips1 的子节点,usbotg1 属于 aips2 的子节点,rngb 属于 aips3 的子节点。最终的文件内容如下:
/ {
compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
cpus {
#address-cells = <1>;
#size-cells = <0>;
//CPU0节点
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
device_type = "cpu";
reg = <0>;
};
};
// soc节点
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges;
// ocram 节点
ocram: sram@00900000 {
compatible = "fsl,lpm-sram";
reg = <0x00900000 0x20000>;
};
// aips1 节点
aips1: aips-bus@02000000 {
compatible = "fsl,aips-bus","simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x2000000 0x100000>;
ranges;
// ecspi1 节点
ecspi1: ecspi@02008000 {
#address-cells = <1>;
#size-cells = <1>;
compatible = "fsl,imx6ul-ecspi", "fsl,imx51-ecspi";
reg = <0x02008000 0x4000>;
status = "disabled";
};
};
// aips2 节点
aips2: aips-bus@02100000 {
compatible = "fsl,aips-bus","simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x2100000 0x100000>;
ranges;
// usbotg1 节点
usbotg1: usb@02184000 {
compatible = "fsl,imx6ul-usb","fsl,imx27-usb";
reg = <0x02184000 0x200>;
status = "disabled";
};
};
// aips3 节点
aips3: aips-bus@02200000 {
compatible = "fsl,aips-bus","simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x2200000 0x100000>;
ranges;
// rngb 节点
rngb: rngb@02284000 {
compatible = "fsl,imx6sl-rng","fsl,imx-rng","imx-rng";
reg = <0x02284000 0x4000>;
};
};
};
}
- ecspi1 外设控制器节点(SPI外设)。
- usbotg1 外设控制器节点(OTG外设)。
- rngb 外设控制器节点(RNGB屏外设)。
至此,这个小型的模板设备树就编写好了,基本和 imx6ull.dtsi 很像,可以看做是 imx6ull.dtsi 的缩小版。在上面我们仅仅是编写了 I.MX6ULL 的外设控制器节点,像 IIC 接口,SPI 接口下所连接的具体设备我们并没有写,因为具体的设备其设备树属性内容不同,这个等到具体的实验在详细讲解。
还没有评论,来说两句吧...