🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习
🎬擅长领域:驱动开发,嵌入式软件开发,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。