1. 程式人生 > >Linux 設備樹的解釋 - DTB文件格式【轉】

Linux 設備樹的解釋 - DTB文件格式【轉】

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文件格式【轉】