嵌入式Linux--设备树(二)设备树模板

 在上面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)
AIPS10x020000000x100000
AIPS20x021000000x100000
AIPS30x022000000x100000

 我们先在设备树中添加这三个域对应的子节点。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 接口下所连接的具体设备我们并没有写,因为具体的设备其设备树属性内容不同,这个等到具体的实验在详细讲解。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页