Linux 設備樹的解釋 - DTB文件格式【轉】
阿新 • • 發佈:2018-03-31
mpat tails map 64位 res int 技術分享 定義 gpo
https://blog.csdn.net/cc289123557/article/details/51782449
1、dtb文件格式
dtb文件的格式如下圖 :
NOTE:不同部分順序可能不一樣
2、文件頭boot_param_header
1 struct boot_param_header { 2 u32 magic;----------------用於標dtb文件頭,等於OF_DT_HEADER=“0xd00dfeed” 3 u32 totalsize;------------dtb文件大小4 u32 off_dt_struct;--------DT structure偏移 5 u32 off_dt_strings;-------DT strings偏移 6 u32 off_mem_rsvmap;-------memory reserve map偏移 7 u32 version;--------------版本號 8 u32 last_comp_version;----兼容最早版本號 9 10 /* version 2 fields below*/ 11 u32 boot_cpuid_phys;------physical CPU id 12 13 /* version 3 fields below */ 14 u32 size_dt_strings;------size of the strings block 15 16 /* version 17 fields below */ 17 u32 size_dt_struct;-----------size of the DT structure block 18 };
3、保留內存memory reserve map
這段保存的是一個保留內存映射列表,每個表由一對64位的物理地址和大小組成
4、device-tree structure&strings
由於某些屬性(比如compatible)在大多數節點下都會存在,為了減少dtb文件大小,就需要把這些屬性字符串只指定一個存儲位置即可,這樣每個節點的屬性只需要按照位置找到屬性字符串的位置就可以得到是哪個屬性,所以dtb把device-tree strings單獨列出來存儲,下圖是device-tree structure的格式,節點嵌套節點
上面的宏定義如下
1 #define FDT_MAGIC 0xd00dfeed /* 4: version, 4: total size */ 2 #define FDT_TAGSIZE sizeof(uint32_t) 3 4 #define FDT_BEGIN_NODE 0x1 /* Start node: full name */ 5 #define FDT_END_NODE 0x2 /* End node */ 6 #define FDT_PROP 0x3 /* Property: name off, 7 size, content */ 8 #define FDT_NOP 0x4 /* nop */ 9 #define FDT_END 0x9 10 11 #define FDT_V1_SIZE (7*sizeof(uint32_t)) 12 #define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t)) 13 #define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t)) 14 #define FDT_V16_SIZE FDT_V3_SIZE 15 #define FDT_V17_SIZE (FDT_V16_SIZE + sizeof(uint32_t))
總圖
Linux 設備樹的解釋 - DTB文件格式【轉】