【Linux设备树】设备树基础 DTS,DTSI,DTC及DTB之间的关系

设备树基础 DTS,DTSI,DTC及DTB之间的关系

设备树是一种描述硬件的数据结构,它起源于OpenFirmware(OF)。在Linux 2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxxarch/arm/mach-xxx中,采用设备树后,许多硬件的细节可以直接通过它传递给Linux,而不再需要在内核中进行大量的冗余编码。

设备树由一系列被命名的节点(Node)和属性(Property)组成,而节点本身可包含子节点。所谓属性,其实就是成对出现的名称和值。在设备树中,可描述的信息包括(原先这些信息大多被硬编码在内核中):

  • CPU的数量和类别。
  • 内存基地址和大小。
  • 总线和桥。
  • 外设连接。
  • 中断控制器和中断使用情况。
  • GPIO控制器和GPIO使用情况。
  • 时钟控制器和时钟使用情况。

它基本上就是画一棵电路板上CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出Linux内核中的platform_devicei2c_clientspi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。

DTS和DTSI

*.dts文件是一种ASCII文本对Device Tree的描述,放置在内核的/arch/arm/boot/dts目录。一般而言,一个*.dts文件对应一个ARM的machine。

*.dtsi文件作用:由于一个SOC可能有多个不同的电路板,而每个电路板拥有一个 *.dts。这些dts势必会存在许多共同部分,为了减少代码的冗余,设备树将这些共同部分提炼保存在*.dtsi文件中,供不同的dts共同使用。*.dtsi的使用方法,类似于C语言的头文件,在dts文件中需要进行include *.dtsi文件。当然,dtsi本身也支持include 另一个dtsi文件。

DTC

DTC为编译工具,它可以将.dts文件编译成.dtb文件。DTC的源码位于内核的scripts/dtc目录,内核选中CONFIG_OF,编译内核的时候,主机可执行程序DTC就会被编译出来。 即scripts/dtc/Makefile中

hostprogs-y := dtc
always := $(hostprogs-y) 

在内核的arch/arm/boot/dts/Makefile中,若选中某种SOC,则与其对应相关的所有dtb文件都将编译出来。在linux下,make dtbs可单独编译dtb

DTB

DTC编译*.dts生成的二进制文件(*.dtb),bootloader在引导内核时,会预先读取*.dtb到内存,进而由内核解析。

Bootloader

Bootloader需要将设备树在内存中的地址传给内核。在ARM中通过bootmbootz命令来进行传递。

bootm [kernel_addr] [initrd_address] [dtb_address]

其中kernel_addr为内核镜像的地址,initrd_address为initrd的地址,dtb_address为dtb所在的地址。若initrd_address为空,则用“-”来代替。

/dts-v1/;     //表示这个dts文件的版本
[memory reservations]    // 格式为:/memreserve/ <address> <length>;
/{
    [property definitions]
    [child nodes]
};
//表示的是保存的内存区域:如果你的板子的内存有1G大小,想留一块区域留做它用(比如拿来用作共享内存区域空间)而不想全部都给内核使用的话,就可以使用该定义。如果你想让内核使用全部的内存的花,可以省略该选项。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Van.Ghylivan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值