DTC工具的作用:
将dts中的宏定义展开,检查dts中的语法错误等,最终编译成唯一的一个dtb文件。
DTB文件布局(大端字节序):
大小端字节序只对存储数值有影响,对于字符串的存储是一样的,比如“abc”,永远是低:a,中:b,高:c。
struct ftd_header |
(free space) |
memory reservation block |
(free space) |
structure block |
(free space) |
strings block |
(free space) |
ftd_header:基地址、便宜地址、大小等信息。
memory reservation block:内存保留区,由自己指定,不指定则没有。
structure block:节点的结构和信息。
strings block:属性的名字,顺序存放,0字符结尾。
struct fdt_header{
uint32_t magic; //必须是0xd00dfeed
uint32_t totalsize;//文件大小
uint32_t off_dt_struct;//struct的偏移地址
uint32_t off_dt_strings;//string的偏移地址
uint32_t off_mem_rsvmap;//保留内存块的偏移地址
uint32_t version;
uint32_t last_comp_version;
uint32_t boot_cpuid_phys;
uint32_t size_dt_strings;
uint32_t size_dt_struct;
};
struct fdt_reserve_entry{
uint64_t address;
uint64_t size;
};
structure block
固定值0x00000001表示一个节点开始+节点名字
固定值0x00000003表示属性开始+结构体+val
struct{
uint32_t len; //属性val长度
uint32_t nameoff; //名字在string block中的偏移地址
};
固定值0x00000002表示一个节点结束
例如
/{
led{
compatible = "jz2440_led";
pin = <S3C2440_GPF(5)>
};
};
在dtb中的存储就是这样的
固定值0x00000001, //根节点的开始
固定值0x00000001+led //led节点开始
固定值0x00000003+struct+val //led节点相关属性
固定值0x00000002 //node节点结束
固定值0x00000002 //根节点结束
固定值0x00000009 //整个structure block结束