Dtb文件组成

Dtb文件由4部分组成:fdt_header、memory reserve map、device-tree structure、device-tree strings。

前三部分都是4字节对齐,最后一部分——“device-tree strings”不要求4字节对齐。

struct fdt_header定义

struct fdt_header {

fdt32_t magic;      /*用于标dtb文件头,等于FDT_MAGIC=“0xd00dfeed”*/

fdt32_t totalsize;      /*dtb文件大小 */

fdt32_t off_dt_struct;  /* DT structure偏移 */

fdt32_t off_dt_strings;  /* DT strings偏移 */

fdt32_t off_mem_rsvmap;  /* memory reserve map偏移 */

fdt32_t version;      /*版本号 */

fdt32_t last_comp_version;  /*兼容最早版本号 */

 

/* version 2 fields below */

fdt32_t boot_cpuid_phys;  /* Which physical CPU id we're booting on */

/* version 3 fields below */

fdt32_t size_dt_strings;      /* size of the strings block */

 

/* version 17 fields below */

fdt32_t size_dt_struct;  /* size of the structure block */

};

保留内存(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 /* 4: version, 4: total size */

#define FDT_TAGSIZE sizeof(fdt32_t)

 

#define FDT_BEGIN_NODE 0x1 /* Start node: full name */

#define FDT_END_NODE 0x2 /* End node */

#define FDT_PROP 0x3 /* Property: name off,

   size, content */

#define FDT_NOP 0x4 /* nop */

#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;        /*节点头标识——FDT_BEGIN_NODE = 0x1*/

char name[0];      /*节点名字(v1-v3为全路径名,v16后只有节点名字)*/

};

 

struct fdt_property {

fdt32_t tag;       /*属性标识——FDT_PROP = 0x3*/

fdt32_t len;       /*属性字符串的长度*/

fdt32_t nameoff;   /*属性字符串在device-tree strings中的偏移*/

char data[0];      /*属性数据值*/

};

实例分析

下面以zcu102_phy.dtb及zcu102_phy.dts为例进行对照分析。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DTB是设备树二进制文件的缩写,它描述了硬件设备的属性和连接关系。如果你需要修改设备树,则需要进行以下步骤: 1. 获取设备树源文件:通常情况下,设备树源文件位于内核源代码的arch/arm/boot/dts/或者arch/arm64/boot/dts/目录下。你可以通过下载内核源代码或者从已编译的内核映像中提取设备树文件来获取源文件。 2. 安装设备树编译工具链:在Linux系统中,你可以使用Device Tree Compiler (DTC)工具链编译DTB文件。你可以使用以下命令来安装DTC: ``` sudo apt-get install device-tree-compiler ``` 3. 编辑设备树源文件:你可以使用任何文本编辑器来编辑设备树源文件。设备树源文件通常使用.dts或.dtsi扩展名。 4. 编译设备树:使用以下命令将设备树源文件编译为二进制DTB文件: ``` dtc -I dts -O dtb -o device_tree_blob.dtb device_tree_source.dts ``` 其中,device_tree_source.dts是设备树源文件的名称,device_tree_blob.dtb是编译后的二进制DTB文件的名称。 5. 将DTB文件加载到内核中:在启动时,内核会加载设备树文件。你可以使用以下方法将自己编译的DTB文件加载到内核中: - 将DTB文件复制到/boot目录下,并将其命名为dtb文件名。 - 在引导加载程序(如U-Boot)的启动脚本中,添加以下命令: ``` fatload mmc 0:1 ${fdt_addr_r} dtb文件名 ``` 其中,${fdt_addr_r}是设备树文件的加载地址,通常为0x1000000。 以上就是修改设备树的基本步骤,但需要注意的是,不正确的设备树可以导致系统不可用,因此在进行修改时请小心谨慎。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值