什么是设备树?
采用树形结构来描述板级文件。描述设备树的文件叫做DTS。
设备树因何而诞生?
由于开发板根据我们的不同性能要求,每个上面都配备着不同的硬件设施,成千上万的开发板意味着成千上万的描述板级信息的文件。如果我们将这些文件烧写到Linux内核之中,会非常臃肿。
所以使用一个专属的文件格式来描述,这就是设备树。将这些文件从内核中分离出来。但是实际上它还是放在Linux内核目录之中,不过它有一个独立的文件夹。
在Linux源码中的有一些dts文件示例(dtsi,也就是多个开发板包含了一些相同的硬件,为了避免重复描述,所以放在了dts include 设备树头文件中):
可以看出一个板子对应一个dts文件。
针对于w25q.c(一个设备的驱动文件),实现它的功能也就是通过SPI通信来操作指定的寄存器。
只要按照通用的模版,提供一个读写函数,相当于实现同样的功能,只改变它的硬件接口,这个.c文件无论是应用于stm32还是nxp提供的开发板都是可以通杀的。此所谓驱动的复用。
DTS、DTB、DTC的关系
dts ——> .c 文件 描述设备树的源代码
dtc ——> gcc工具 将dts编译生成为.dtb文件
dtb ——> .o文件 编译生成后的文件
一般操作是先编译Linux源码,生成dtc,然后make dtbs
。但是一般我们编译Linux源码的时候是make all
,也就是编译全部(内核,设备树等)。如果要编译某一个具体的dts。(注:make ..dtb)
但是就算使用make dtbs
也只会编译那些被修改过的dts文件。
一个题外话:为什么我们执行make以后会编译对应的dts呢?
在Linux源码中arch/arm/boot/dts/Makefile中会定义要编译的dtb文件。
所以我们编写好自己的dts文件后,需要在Makefile中添加,系统才会知道新的dts文件的存在,才会去编译它。
设备树结构
设备树结构总览
设备树也有头文件,扩展名为.dtsi。可以将一款SOC的所有设备/平台共有的部分提取出来(一般就是一些很基础,必须存在的硬件)放到头文件中。比如dtsi里面有
cpu:
中断控制器:
晶振:
内部ram起始地址和大小:
串口7的接口:
设备树是层层分级,类似于树干,树枝,树叶。比如说一块I.MX6ULL开发板,它的imx6ull.dtsi中的一级树枝有:cpus intc soc。在soc中有busfreq aips1 aips2 。在aips1中有gpio1 gpio2 ,在aips2中有IIC1 IIC2。
以IIC为例,dtsi里面只包括IIC的最基础的一些属性:
如果我们的开发板需要添加一个IIC设备wm8960@1a,这种自定义的部分就在dts中以追加的方式实现:&
可以理解为:DTS文件以 ’/’ 开头。从/根节点开始描述设备信息,在根节点外可通过&来进行追加。比如说.dts文件里有/根节点内容,它包含的头文件.dtsi也有/根节点内容。但不同/根节点指向的是同一块根节点空间。
以上就是设备树的一些框架和设备树构建信息的解析,接下来,我还会写一篇文章介绍有关设备节点(某一个硬件设备)的基本属性描述和使用。
参考文献:正点原子教程