Dtb文件由4部分组成:fdt_header、memory reserve map、device-tree structure、device-tree strings。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVPVpWT5VERPRzaU1UNwJjYoRmMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMycTN1EjM3ETNygDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
前三部分都是4字节对齐,最后一部分——“device-tree strings”不要求4字节对齐。
struct fdt_header定义
struct fdt_header { fdt32_t magic; fdt32_t totalsize; fdt32_t off_dt_struct; fdt32_t off_dt_strings; fdt32_t off_mem_rsvmap; fdt32_t version; fdt32_t last_comp_version; fdt32_t boot_cpuid_phys; fdt32_t size_dt_strings; fdt32_t size_dt_struct; }; |
保留内存(memory reserve map)
这段保存的是一个保留内存映射列表,每个表由一对64位的物理地址和大小组成。其数据结构如下:
struct fdt_reserve_entry { fdt64_t address; fdt64_t size; }; |
device-tree structure&strings
由于某些属性(比如compatible)在大多数节点下都会存在,为了减少dtb文件大小,就需要把这些属性字符串只指定一个存储位置即可,这样每个节点的属性只需要按照位置找到属性字符串的位置就可以得到是哪个属性,所以dtb把device-tree strings单独列出来存储,下图是device-tree structure的格式,节点嵌套节点。
图中宏定义如下:
#define FDT_MAGIC 0xd00dfeed #define FDT_TAGSIZE sizeof(fdt32_t) #define FDT_BEGIN_NODE 0x1 #define FDT_END_NODE 0x2 #define FDT_PROP 0x3 #define FDT_NOP 0x4 #define FDT_END 0x9 #define FDT_V1_SIZE (7*sizeof(fdt32_t)) #define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(fdt32_t)) #define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(fdt32_t)) #define FDT_V16_SIZE FDT_V3_SIZE #define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(fdt32_t)) |
可以看出,device-tree structure的组成单元为节点。节点又由node header和property组成,如下:
struct fdt_node_header { fdt32_t tag; char name[0]; }; struct fdt_property { fdt32_t tag; fdt32_t len; fdt32_t nameoff; char data[0]; }; |
实例分析
下面以zcu102_phy.dtb及zcu102_phy.dts为例进行对照分析。