一、创建基础设备树框架
首先,我们新建一个名为 myfirst.dts的文件,内容非常简单,只包含根节点 /,根节点里定义设备与硬件平台的兼容性属性。
{compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";};
这个基础框架就是所有设备树的起点,后面的内容都在此框架内添加。
二、添加CPU节点(cpus节点)
I.MX6ULL是ARM Cortex-A7架构的单核CPU,因此设备树中添加CPU节点时,只需一个cpu0节点。
完整写法如下:
{
compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
cpus {
#address-cells = <0>;#size-cells = <0>;
cpu0: cpu@0 {compatible = "arm,cortex-a7";
device_type = "cpu";reg = <0>;};};
三、添加SOC总控节点(soc节点)
SOC节点是所有片上外设控制器的总父节点,方便统一管理。我们在根节点下新增soc节点:
soc {#address-cells = <0>;#size-cells =<0> ;compatible = "simple-bus";ranges;};
#address-cells和#size-cells都为1,表示地址和长度各占1个字长。
ranges为空,说明子节点的地址空间与父节点一一映射,不需额外转换。
四、添加片内RAM节点(ocram)
ocram是芯片内置的RAM,地址从0x00900000开始,大小为128KB(0x20000)。它是soc节点的子节点:
ocram: sram@00900000 {compatible = "fsl,imx-ocram";reg = <0>;};
五、添加AIPS总线域节点
i.MX6ULL片内共划分3个总线域:aips1、aips2、aips3,负责不同外设控制器,我们将它们作为soc的子节点添加:
aips1:aips-bus@02000000 {compatible = "fsl,aips-bus", "simple-bus";#address-cells = <0>;#size-cells = <0>;reg =<0x02000000 0x100000> ;ranges;};
aips2:aips-bus@02100000 {compatible = "fsl,aips-bus", "simple-bus";#address-cells = <0>;#size-cells =<0> ;reg =<0x02100000 0x100000> ;ranges;};
aips3:aips-bus@02200000 {compatible = "fsl,aips-bus", "simple-bus";#address-cells = <0>;#size-cells =<0> ;reg = <0x02200000 0x100000>;ranges;}
其中,aips1地址范围为0x02000000 ~ 0x020fffff,aips2地址范围为0x02100000 ~ 0x021fffff,aips3地址范围为0x02200000 ~ 0x022fffff。
六、添加外设控制器节点
最后,我们分别为三个AIPS总线域下加入具体的外设控制器节点:
ecspi1控制器位于aips1域,起始地址0x02008000,大小0x4000
usbotg1控制器位于aips2域,起始地址0x02184000,大小0x4000
rngb(随机数生成器)位于aips3域,起始地址0x02284000,大小0x4000
具体添加内容如下:
/* ecspi1控制器节点,挂在aips1域下 */
ecspi1: ecspi@02008000 {#address-cells = ;#size-cells = ;compatible = "fsl,imx6ul-ecspi", "fsl,imx51-ecspi";reg = <0x02008000 0x4000>;status = "disabled";};
/* usbotg1控制器节点,挂在aips2域下 */
usbotg1: usb@02184000 {compatible = "fsl,imx6ul-usb", "fsl,imx27-usb";reg =<0x02184000 0x4000>; ;status = "disabled";};
/* rngb控制器节点,挂在aips3域下 */
rngb: rngb@02284000 {compatible = "fsl,imx6sl-rng", "fsl,imx-rng", "imx-rng";reg =<0x02284000 0x4000>; ;};
注意:其中外设的status属性默认设为"disabled",表示默认关闭状态,实际使用需手动启用。
注意事项
此模板仅用于学习理解设备树语法,实际产品开发应直接使用SOC厂商提供的成熟设备树文件进行修改,不要自己从头创建。
实际开发过程中,具体外设的详细配置、中断和GPIO连接等信息会在此基础上补充完善。
如果需要编译此.dts,可以使用命令:
dtc -I dts -O dtb -o myfirst.dtb myfirst.dts前提是系统已安装设备树编译工具(device tree compiler)。
通过这样一步步实践,能清晰地掌握设备树的结构及编写方法,为后续更复杂的开发打下良好基础。