Dtb文件组成

https://blog.youkuaiyun.com/gaojy19881225/article/details/82053376

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为例进行对照分析。
在这里插入图片描述


作者:一墨一飞花
来源:优快云
原文:https://blog.youkuaiyun.com/gaojy19881225/article/details/82053376
版权声明:本文为博主原创文章,转载请附上博文链接!

### 嵌入式系统中文件组成结构及内容 嵌入式系统的文件通常由多个层次化的组件构成,这些组件共同定义了硬件和软件之间的交互方式以及操作系统的运行环境。以下是嵌入式系统中常见的文件组成及其相关内容: #### 1. 设备树 (Device Tree) 设备树是一种描述硬件的数据结构,广泛用于现代嵌入式系统中。它通过 `.dts` 或 `.dtb` 文件的形式存在,主要用于向操作系统提供关于硬件的信息。 - **compatible 属性**: 定义了特定硬件模块的身份标识符,例如 `compatible = "rockchip,rk3308-uart", "snps,dw-apb-uart"` 表明该设备兼容 Rockchip 的 RK3308 UART 和 Synopsys DW APB UART 控制器[^2]。 - **reg 属性**: 描述寄存器地址范围,指定设备在内存映射中的位置。 - **中断配置**: 提供与中断控制器相关的设置,帮助操作系统管理硬件事件。 #### 2. 启动加载程序 (Bootloader) 启动加载程序负责初始化硬件并引导操作系统内核运行。典型的嵌入式 Bootloader 如 U-Boot 包含以下几个阶段: - **Stage 1**: 初始化基本硬件资源(如时钟、电源管理和 RAM),并将控制权传递给下一阶段。 - **Stage 2**: 加载内核镜像到内存,并准备必要的参数传递给操作系统。 ```c // 示例:U-Boot 配置代码片段 #include <common.h> void board_init_f(ulong bootflag) { // 初始化硬件 } ``` #### 3. 操作系统内核 (Kernel) 嵌入式系统的内核通常是经过裁剪优化后的 Linux 内核或其他实时操作系统(RTOS)。其核心功能包括进程调度、内存管理、驱动支持等。 - **配置选项**: 使用 Kconfig 工具定制内核特性以满足具体需求。 - **驱动程序**: 实现对底层硬件的支持,例如 GPIO、I2C、SPI 接口等。 ```bash # 编译内核命令示例 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- ``` #### 4. 应用程序 (Application Software) 应用程序构成了嵌入式系统的最终功能性部分,直接面向用户或与其他系统交互。 - **库依赖**: 动态链接库或静态编译的方式减少空间占用。 - **脚本配置**: Shell 脚本简化复杂任务自动化处理过程。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值