IMX8M学习--MYZR-i.MX8M-EVK设备树简介(五)
学习MYZR-i.MX8M-EVK开发板过程中,官方提供了资料在.dts中修改设备树参数进行硬件的配置。在嵌入式底层开发中移植驱动时,大多会遇到修改.dts文件,很多人都会按照模板修改,按照的是网上或者厂家例程做出修改,却不知道此为何物。
设备树的由来
设备树是linux内核在3.x版本开始引进的概念,像是在linux2.6的版本中充斥着大量的垃圾代码,存在于arch/arm/plat-xxx和arch/arm/mach-xxx中。而这些代码中有相当大的一部分是用来描述板级信息细节,那么这些细节对于内核来讲,都是垃圾(rubbish)。
我们伟大的林纳斯(Linus Torvalds )就不高兴了,相当于发火了,就在2011年的ARM Linux邮件列表中可看见,完全是公开场合下吐槽arm linux是垃圾,原话是:this whole ARM thing is a f**king pain in the ass。
之后过了段时间,Linux开发社区就开始整改ARM linux了,设备书最早其实是用在其他体系架构中,例如PowerPC,从3.0开始ARM架构开始使用设备树来描述设备信息。
设备树特性
那么设备树是什么呢?
1.Device tree可以描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、外设的连接、中断控制器和中断使用的情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况等等。。。
2.设备树信息保存在一个ASCII文本文件中供人类阅读用的,在ARM Linux,一个.dts文件对应一个ARM的machine放置在内核的arch/arm/boot/dts目录
3.设备树是一种数据结构,如同我们的结构体链表,用于描述设备信息,具体一点,就是用于操作系统中描述硬件,使得不需要对设备信息进行硬编码。
4…Device Tree由一系列被命名的节点(node)和属性(property)组成,而节点本身可包含子节点。所谓属性,其实就是成对出现的name和value,有点像我们的键值对。
5.设备树源文件dts被编译成dtb二进制文件,在bootloader运行时传递给操作系统,操作系统再会对其进行解析展开(Flattened),从而产生硬件的拓扑图,有了这个拓扑图,再变成过程中可以通过系统提供接口获取到设备树的节点和属性信息。
快速编译设备树DTC(Device Tree Compiler)
DTC是什么?
dtsi相当于include
.config即可设置编译成哪个平台
将.dts编译为.dtb的工具
我们在添加链接描述
第二篇文章中对于关于编译内核目标文件那一章中设备树的编译。
DTC的源代码位于内核的scripts/dtc目录,在Linux内核使能了Device Tree的情况下,编译内核的时候主机工具dtc会被编译出来
在Linux内核的arch/arm64/boot/dts/Makefile中,描述了当某种SoC被选中后,那些.dtb文件会被编译出来,IMX8MQ对应的.dtb包括以下:
那么条件编译$(CONFIG_ARCH_FSL_IMX8MQ)是怎么确定是IMX8M呢
可以查看各arch/arm/boot/Makefile
我们可以单独编译Device Tree文件。当我们在Linux内核下运行make dtbs时,若我们之前选择了ARCH_FSL_IMX8MQ,上述.dtb都会由对应的.dts编译出来
添加新文件需要修改Makefile才能编译
vim arch/arm/boot/dts/Makefiel
编译设备树文件
make myzr/myimx8mevk-8mq.dtb
拷贝内核和设备树文件到/tftpboot目录下
cp arch/arm/boot/dts/exynos4412-fs4412.dtb ./
设置启动参数
设置启动内存地址存放 uImage,存放dtb在uImage后的1M间,先启动uImage开启内核,再跳到dtb上运行,将.dtb文件加载到内核中展开。
本文参考网上大量网友资料理解。