一、DTS文件综述
最新的UBOOT代码支持OF(Open Firmware)结构的扁平设备树(flattened device-tree),目前还没有对OF结构的用户接口API进行支持。因此,在U-boot向Linux内核跳转的时候需要向内核传递一张描述整个硬件系统扁平设备树的的表,来描述设备、总线以及中断的信息等等。这个表被称为设备树块(device-tree block),也就是我们提供的二进制dtb文件。我们一般不对该二进制文件进行直接编辑,而是通过一定硬件描述语法创建一个dts(device-tree source)文件,再用特定的工具dtc将dts转成目标dtb文件。
1.U-BOOT传递给Linux PowerPC的参数
Linux PowerPC有且仅有一个单一的入口点,该入口点支持下面两种调用习俗,而其中第一种正是目前UBOOT启动Linux内核采用的方法,因为UBOOT只支持OF结构的扁平设备树。(参见下表)
a) 启动方式一:BOOT支持OF扁平设备树
b) 启动方式二:BOOT全面支持OF结构(包括用户接口API和OF扁平设备树)
表-1 两种BOOT启动Linux内核的方式
Linux内核中的参数 |
BOOT支持OF扁平设备树 |
BOOT全面支持OF结构(包括用户接口API和OF扁平设备树) |
通用寄存器r3 |
指向内存中设备树块 |
指向OF用户接口API的地址 |
通用寄存器r4 |
指向Linux内核所在的物理地址 |
Initrd的起始地址 |
通用寄存器r5 |
空 |
Initrd的长度 |
通用寄存器r6 |
空 |
命令行参数起始地址 |
通用寄存器r7 |
空 |
命令行参数结束地址 |
2.设备树(Device Tree)块格式
注意:设备树块必需位于主内存中。它可以通过内存的“实模式”和“虚模式”获取到。
1)报头
进入内核时,r3指向由include/asm-powerpc/prom.h中boot_param_header结构简要描述的内存区。
struct boot_param_header {
u32 magic; /* magic word OF_DT_HEADER */
u32 totalsize; /* total size of DT block */
u32 off_dt_struct; /*offset to structure */