U-Boot FDT命令完全指南

🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习

🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发

❄️作者主页:一个平凡而乐于分享的小比特的个人主页

✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结

欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

🔧 U-Boot FDT命令完全指南

📋 命令概述

命令 功能 类比理解 使用频率
fdt addr 设置/查看设备树地址 相当于"打开文件" ⭐⭐⭐ 必须
fdt resize 调整设备树大小 相当于"扩展画布" ⭐⭐ 按需
fdt apply 应用设备树覆盖 相当于"叠加图层" ⭐ 可选

1️⃣ fdt addr - 设置设备树工作地址

命令详解

bash 复制代码
# 基本语法
fdt addr [<address>] [-c]

# 常用示例
fdt addr 0x43000000    # 设置设备树地址
fdt addr               # 查看当前地址
fdt addr -c            # 清除当前设置

内存布局示意

复制代码
内存空间:
┌─────────────────────┐ 0x40000000
│    内核映像         │
│    (zImage)         │
├─────────────────────┤ 0x43000000 ← fdt addr设置点
│    设备树           │
│    (device tree)    │
├─────────────────────┤
│    其他数据         │
└─────────────────────┘

2️⃣ fdt resize - 调整设备树大小

为什么需要resize?

128KB
64KB
fdt resize
已用空间

60KB
剩余空间

4KB
原有数据

60KB
新增空闲

68KB

resize大小对比表

resize大小 适用场景 优点 缺点
默认(4KB) 简单修改 内存占用小 可能不够用
64KB 添加几个节点 适中大小 中等开销
1MB 大量覆盖 几乎不会溢出 内存浪费
不resize 只读操作 零开销 无法修改

3️⃣ fdt apply - 应用设备树覆盖

工作流程



成功
失败
开始
加载基础设备树
fdt addr 0x43000000
需要修改?
fdt resize
加载overlay文件
直接启动
fdt apply 0x44000000
验证成功?
启动内核
检查错误

📊 详细对比表格

命令功能对比

特性 fdt addr fdt resize fdt apply
操作对象 内存地址 设备树大小 设备树内容
执行前提 设备树已加载 已设置地址 已设置地址且resize
影响范围 全局 内存布局 节点/属性
错误类型 地址无效 内存不足 语法/兼容性
调试方法 fdt addr查看 fdt memory fdt list

参数选项对比

命令 参数 作用 返回值
fdt addr <addr> 设置地址 成功/失败
无参数 显示当前地址 地址值
-c 清除设置
fdt resize <size> 指定新大小 成功/失败
无参数 默认+4KB 成功/失败
fdt apply <addr> 应用overlay 成功/失败

🎯 实战场景

场景一:基础启动(无修改)

bash 复制代码
# 最小化命令集
load mmc 0:1 0x43000000 /boot/dtb
fdt addr 0x43000000    # 只需设置地址
bootz 0x42000000 - 0x43000000

场景二:添加自定义节点

bash 复制代码
# 完整命令集
load mmc 0:1 0x43000000 /boot/dtb
fdt addr 0x43000000
fdt resize 0x10000     # 预留64KB空间

# 创建自定义节点
fdt mknode / mydevice
fdt set /mydevice compatible "vendor,device"
fdt set /mydevice reg <0x1c28000 0x1000>
fdt set /mydevice interrupts <0 42 4>

bootz 0x42000000 - 0x43000000

场景三:使用设备树覆盖

bash 复制代码
# overlay应用流程
# 步骤1:加载基础设备树
load mmc 0:1 0x43000000 /boot/board.dtb
fdt addr 0x43000000

# 步骤2:预留足够空间
fdt resize 0x200000    # 预留2MB

# 步骤3:加载overlay
load mmc 0:1 0x44000000 /boot/overlays/spi.dtbo
fdt apply 0x44000000   # 应用SPI覆盖

load mmc 0:1 0x45000000 /boot/overlays/i2c.dtbo
fdt apply 0x45000000   # 应用I2C覆盖

# 步骤4:启动
bootz 0x42000000 - 0x43000000

⚠️ 常见错误及解决

错误处理流程
错误: No FDT address
执行fdt addr
错误: FDT requires more space
执行fdt resize
错误: FDT overlay apply failed
检查overlay兼容性
错误: libfdt fdt_check_header
重新加载设备树

错误代码对照表

错误信息 错误码 原因 解决方案
"No FDT memory address configured" -12 未设置地址 fdt addr <addr>
"FDT requires more space" -7 空间不足 fdt resize <size>
"FDT overlay apply failed: Invalid argument" -22 overlay不兼容 检查kernel版本
"libfdt fdt_check_header(): FDT_ERR_BADMAGIC" -1 设备树损坏 重新加载

💡 最佳实践建议

命令使用顺序

必须
如果需要修改
如果有overlay
加载DTB
fdt addr
fdt resize
fdt apply
启动内核

内存大小建议表

场景 建议resize大小 说明
只读启动 0(不resize) 节省内存
简单修改(1-5节点) 8KB-16KB 适度预留
复杂修改(5-20节点) 64KB-128KB 足够使用
多个overlay 256KB-1MB 防止溢出

📝 高级调试技巧

调试命令组合

bash 复制代码
# 完整的调试流程
# 1. 加载并检查
load mmc 0:1 0x43000000 /boot/dtb
fdt addr 0x43000000
fdt list                 # 查看结构

# 2. 修改并验证
fdt resize 0x20000
fdt set /chosen bootargs "console=tty0"
fdt print /chosen       # 验证修改

# 3. 保存修改(可选)
fdt save 0x43000000 0x50000000 0x20000

通过以上详细说明和图示,您应该能够熟练掌握U-Boot中的FDT命令。记住关键点:fdt addr是基础,需要修改时用fdt resize,有overlay时用fdt apply