[uboot] (番外篇)uboot之fdt介绍

本文详细介绍了uboot中的fdt(flatted device tree)概念,包括dtb结构、dtb在uboot中的位置、如何支持fdt、获取dtb的方法以及解析dtb的常用接口。通过实例分析了s5pv210平台的dtb处理流程,指导读者深入理解uboot与设备树的关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例

[uboot] uboot流程系列
[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)
[project X] tiny210(s5pv210)从存储设备加载代码到DDR
[uboot] (第一章)uboot流程——概述
[uboot] (第二章)uboot流程——uboot-spl编译流程
[uboot] (第三章)uboot流程——uboot-spl代码流程
[uboot] (第四章)uboot流程——uboot编译流程
[uboot] (第五章)uboot流程——uboot启动流程
[uboot] (番外篇)global_data介绍
[uboot] (番外篇)uboot relocation介绍

建议先看《[[uboot] (番外篇)uboot relocation介绍》和《[uboot] (第四章)uboot流程——uboot编译流程》

=================================================================================

因为在学习uboot的driver module,发现有必要先把uboot的fdt整明白点。所以这里就先学习一下fdt咯。

一、介绍

FDT,flatted device tree,扁平设备树。熟悉linux的人对这个概念应该不陌生。
简单理解为将部分设备信息结构存放到device tree文件中。
uboot最终将其device tree编译成dtb文件,使用过程中通过解析该dtb来获取板级设备信息。
uboot的dtb和kernel中的dtb是一致的。这部分建议直接参考wowo的dtb的文章
Device Tree(一):背景介绍
Device Tree(二):基本概念
Device Tree(三):代码分析

关于uboot的fdt,可以参考doc/README.fdt-control。

二、dtb介绍

1、dtb结构介绍

结构体如下
DTB header
alignment gap
memory reserve map
alignment gap
device-tree structure
alignment gap
device-tree string

dtb header结构如下:

结构体如下
magic
totalsize
off_dt_struct
off_dt_strings
off_mem_rsvmap
version
……

其中,magic是一个固定的值,0xd00dfeed(大端)或者0xedfe0dd0(小端)。
以s5pv210-tiny210.dtb为例:
执行”hexdump -C s5pv210-tiny210.dtb | more”命令

@:dts$ hexdump -C s5pv210-tiny210.dtb | more
00000000  d0 0d fe ed 00 00 5a 
### U-BootFDT 的用途与实现 #### 什么是 Flattened Device Tree (FDT)? Flattened Device Tree 是一种描述硬件结构的数据格式,通常用于嵌入式 Linux 系统中。它通过设备树源文件(Device Tree Source, DTS)定义硬件配置,并编译成二进制形式的设备树 Blob (Device Tree Blob, DTB)[^2]。 在 U-Boot 中,FDT 被用来传递硬件信息给操作系统内核。这种机制允许内核动态适配不同的硬件平台而无需重新编译内核代码。 --- #### U-BootFDT 的主要功能 1. **硬件抽象**: 设备树提供了一种标准化的方式描述硬件资源,如内存映射、中断控制器、GPIO 和串口等。 2. **灵活性**: 使用 FDT 可以减少对特定板级支持包 (Board Support Package, BSP) 的依赖,使得单个内核镜像可以运行在多个平台上。 3. **动态修改**: 在启动过程中,U-Boot 可以加载并修改设备树 blob 文件的内容,以便适应实际硬件环境的需求[^1]。 --- #### 如何构建和使用设备树? 以下是创建和使用设备树的一般流程: 1. 编写 `.dts` 文件:这是设备树的源码表示形式,包含了关于目标硬件的所有必要信息。 ```c / { model = "My Custom Board"; compatible = "mycompany,custom-board"; memory@80000000 { device_type = "memory"; reg = <0x80000000 0x4000000>; }; }; ``` 2. 将 `.dts` 文件转换为 `.dtb` 文件: ```bash dtc -I dts -O dtb -o myboard.dtb myboard.dts ``` 3. 加载设备树到 RAM 并将其地址传送给内核: ```python load mmc 0:1 ${fdt_addr_r} myboard.dtb bootz ${loadaddr} - ${fdt_addr_r} ``` 4. 修改设备树节点(如果需要): ```bash fdt addr ${fdt_addr_r} fdt set /chosen stdout-path "/serial@7e800000" ``` 上述命令展示了如何设置标准输出路径指向某个 UART 控制器实例。 --- #### 工具 `mkimage` 的作用 工具 `mkimage` 主要用于打包引导镜像文件,例如将内核和设备树组合在一起形成单一的可引导镜像文件。具体操作如下所示: ```bash tools/mkimage -f kernel.its kernel.itb ``` 此命令会依据指定的 Image Configuration Script (`kernel.its`) 创建一个名为 `kernel.itb` 的多合一镜像文件,其中可能包含内核、初始化 ramdisk 和设备树等内容。 --- #### 常见问题解决方法 当遇到与 FDT 相关的问题时,可以从以下几个方面入手排查: 1. 验证设备树语法是否正确——利用 `dtc` 进行验证; 2. 检查是否有遗漏的关键属性或节点; 3. 确认 U-Boot 版本兼容性以及相关补丁应用情况。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值