目录
一、什么是设备树
1、uboot启动内核用到zImage、imx6ull-alientek-emmc.dtb
bootz 80800000 - 83000000
2、描述设备树的文件叫做DTS,这个DTS文件采用树形结构描述板级设备,也就是开发板上的设备信息,例如CPU数量、内存基地址、I2C接口上接了哪些设备
3、在单片机驱动里面比如W25QXX,SPI,速度都是在.c文件里面写死的。板级信息都写在.c里,导致Linux内核冗余、臃肿。因此,将板子信息做成独立的格式。文件扩展名为.dts。一个机器对应一个.dts
二、DTS、DTB、DTC的关系
.dts相当于.c ==> DTS源码文件
DTC工具相当于gcc编译器,将.dts编译成.dtb
.dtb相当于bin文件,可执行文件
使用方法: ①、make all
②、make dtbs
如果要编译指定的.dts :make xxxxxx.dtb
三、DTS基本语法
1、设备树也有头文件,扩展名为.dtsi,可以将一款SOC他的其他所有设备/平台的共有信息提出来,作为一个通用的.dtsi文件
.dtsl描述CPU内部的一些共有的外设的信息
#include <dt-bindings/input/input.h>
#include "imx6ull.dtsi"
设备树抽象例子
DPU:教务处
==>信息与科学学院
==>通信工程
==> 二班
ALPHA:soc \* 描述6ull芯片内部内存映射,内部外设信息 *\
==>I2C
==>bus
==>aips1
==>gpt2
==>aips2
==>i2c1
cpu
clocks
2、DTS也是 / 开始
3、从根节点开始描述设备信息
4、在根节点外有一些&cpu0这样的语句是追加信息,追加到.dtsi文件
/dts-v1/;
#include <xxx.h>
#include "xxxx.dtsi"
/ { /* 根节点 */
model = "";
compatible = ""; /* 属性 */
chosn { /* 一级子节点 */
};
memory { /* 一级子节点 */
};
reserved-memory {
};
backlight {
};
pxp_v412 {
};
regulatros {
};
sound {
};
spi4 {
};
};
5、节点名字:完整名字的要求
一般都是外设寄存器的起始地址,或者其他含义,具体节点具体分析
intc:interrupt-controllen@00a01000
冒号前面是标签(label):后面才是名字
intc是标签,interrupt-controllen@00a01000是完整名字
四、设备树在系统中的体现
系统启动以后可以在根文件系统中看到设备树的节点信息。
cd /proc/device-tree/ 在这个目录下存放着设备树信息。
目录中的文件都是.dts文件的一级子节点
内核启动的时候,会解析设备树,然后在/proc/device-tree/目录下呈现出来
五、设备树特殊节点
chosn { /* 特殊节点 */ };
aliases{ /* 特殊节点 */ };
aliases子节点:在Linux内核启动的时候会扫描这个节点。例如soc上有很多个i2c控制器,alias的相当于给每个i2c控制器分配一个唯一的编号
chosen子节点:主要是为了uboot向Linux内核传递数据,重点是bootargs参数。作为命令行参数
linux内核cmdline的值为
uboot是如何向内核传递bootargs。
经过查看发现chosen节点中包含bootargs属性,属性值和uboot的bootargs一致。
uboot接触过dtb,最终通过bootz 80800000 - 83000000来启动内核。经过分析判断uboot拥有bootargs环境变量和dtb,因此最有可能“作案”。
在uboot的fdt_chosen函数中会查找chosen节点,并且添加bootargs环境变量