瑞芯微Rockchip平台U-Boot初始化完整流程,board_init_f/r源码拆解

大家好,我们是触觉智能。很多粉丝朋友和客户在调RK板子时看不懂board init f/r,本文把U-Boot两阶段初始化拆开:先内存规划后设备初始化,重定位地址从DRAM顶端逐层向下算,希望对大家有帮助。

前言&问题场景

U‑Boot Proper的初始化分为两个阶段------board_init_f(在低地址执行的早期初始化)和board_init_r(重定位后在高地址执行的后期初始化)。

这两个阶段被重定位分隔,职责完全不同。本文通过完整时序图和每个initcall的解析,深入展示两个阶段的工作细节。

U‑Boot从低地址启动到最终停在命令行,中间经历了一个复杂的两阶段初始化过程。看到board_init_f和board_init_r这两个函数名,常常不清楚它们各自做了什么、为什么需要拆成两个阶段、以及重定位在中间扮演了什么角色。更关键的是,RK3576的重定位地址是如何通initcall序列从DRAM顶端逐步 "向下挖" 计算出来的?本文基于**触觉智能Purple Pi OH2(RK3576开发板)演示,**逐函数拆解initcall序列,用完整时序图还原从 DRAM 顶端"向下挖"的内存分配过程,直至U-Boot重定位完成、进入命令行。

两阶段总览

board_init_f阶段详解****

board_init_f的核心是一个initcall序列 ,定义在common/board_f.c。每个函数按顺序执行,主要是预留内存空间 和计算重定位地址 。

  • init_sequence_f 关键函数说明

|---------------------|-----------------------|-------------------------------------|
| 函数 | 职责 | 执行后 |
| setup_fdt | 检查 / 准备设备树 | 设置 gd->fdt_blob |
| setup_dest_addr | 计算 DRAM 大小,确定末端地址 | 设置 gd->ram_size, gd->relocaddr 初值 |
| reserve_round_4k | 4KB 对齐 | gd->relocaddr 向下对齐 |
| reserve_mmu | 为 MMU 页表预留空间 | gd->relocaddr 向下移动页表大小 |
| reserve_video | 为显示 framebuffer 预留 | gd->relocaddr 向下移动显存大小 |
| reserve_trace | 为 trace 缓冲区预留 | gd->relocaddr 向下移动 |
| reserve_uboot | ★ 为 U‑Boot 自身预留空间 | gd->relocaddr 减去 monitor 长度 |
| reserve_malloc | 为 malloc 堆预留 | gd->malloc_base 确定 |
| reserve_board | 为板级数据预留 | board_before /board_after 钩子 |
| reserve_global_data | 为 gd 结构预留 | gd->new_gd 确定 |
| reserve_fdt | 为设备树预留新位置 | gd->fdt_size, fdt_reloc |
| reserve_stacks | 栈空间预留 | gd->start_addr_sp |
| setup_reloc | ★ 最终确定 gd->relocaddr | relocation 就绪 |
| serial_init | 串口初始化 | print 信息可用 |
| console_init_f | 控制台早期初始化 | 标准输出 |

  • 初内存分配顺序(从DRAM末端向下分配)

    DRAM末端 ┌──────────────────────────┐ ← gd->ram_top │ MMU页表 │ reserve_mmu ├──────────────────────────┤ │ Video framebuffer │ reserve_video ├──────────────────────────┤ │ Trace buffer │ reserve_trace ├──────────────────────────┤ │ U‑Boot自身 (重定位后) │ ← reserve_uboot → gd->relocaddr ├──────────────────────────┤ │ malloc堆 (CFG_MALLOC_LEN)│ reserve_malloc → gd->malloc_base ├──────────────────────────┤ │ 板级数据 (board_info) │ reserve_board ├──────────────────────────┤ │ GD (global data) │ ← reserve_global_data → gd->new_gd ├──────────────────────────┤ │ 设备树 (FDT) │ reserve_fdt ├──────────────────────────┤ │ 栈 (向下增长) │ ← reserve_stacks → gd->start_addr_sp └──────────────────────────┘

重定位:分隔符

relocate_code() 在arch/arm/lib/relocate.S(ARM 架构)中实现:

复制代码
ENTRY(relocate_code)    // r0 = sp (新栈地址)    // r1 = new_gd (新全局数据地址)    // r2 = relocaddr (目标地址)    // 1. 复制自身    ldr r1, =__image_copy_start    ldr r2, =__image_copy_end    memcpy(r0, r1, r2 - r1)    // 2. 修复.rel.dyn重定位表    ldr r2, =__rel_dyn_start    ldr r3, =__rel_dyn_end    fix_relocations:    // 3. 跳转到新地址    ldr r0, =board_init_r    // 已经过relocation fix    bx  r0ENDPROC(relocate_code)

board_init_r阶段详解****

重定位后,board_init_r在common/board_r.c中执行,initcall序列的核心是初始化所有设备和服务 。

  • init_sequence_r关键函数

两阶段职责对比

|-------------|------------------|--------------------|
| 维度 | board_init_f | board_init_r |
| 执行地址 | 低地址 (0x40200000) | 高地址 (DRAM 末端) |
| 核心任务 | 内存规划 + 重定位准备 | 完整设备初始化 + 命令行 |
| DRAM 信息 | 使用中 | 完全就绪 |
| 驱动模型 | 未初始化 | 完整初始化 |
| 设备树 | 检查 / 预留空间 | 扫描所有节点并绑定驱动 |
| 环境变量 | 无 | 加载并可用 |
| 网络 | 无 | 完整 TCP/IP |
| 文件系统 | 无 | ext4/FAT 就绪 |
| 命令行 | 无 | 交互式 shell |
| 结束状态 | 调用 relocate_code | 永不返回(进入 main_loop) |

Purple Pi OH2开发板,是触觉智能RK3576核心板SOM7609系列配套的评估开发板,搭载4核A72+4核A53+M0多核异构处理器,主频2.2GHz,集成6Tops算力 NPU,轻松应对AI推理、边缘计算与轻量级AI端侧学习。配套完善SDK、丰富资料与Demo,有助于项目前期快速开发验证。

相关推荐
ChaseVLSI8 小时前
FPGA与ASIC的区别详解:内部结构、开发成本与适用场景,项目选型到底该选哪个
嵌入式硬件·fpga开发·硬件架构·硬件工程
ACP广源盛139246256732 天前
选型笔记:Type‑C 扩展坞方案评估|DP1.2 转 HDMI2.0 桥接芯片 GSV2201D@ACP
笔记·硬件架构·硬件工程·视频·国产芯片
粟米茶2 天前
LTspice 导入第三方 Spice 模型实操
硬件工程·硬件电路·运放
暴走约伯2 天前
【VFX工具链源码拆解 04】拯救丢失的绑定:Timeline 一键克隆与层级相对路径重映射算法
unity·c#·游戏引擎·硬件工程
ACP广源盛139246256732 天前
选型笔记:HDMI2.1 四进一出切换中继方案 GSV6705@ACP 评估
笔记·硬件架构·硬件工程·视频·国产芯片
爱聊灵光的维C3 天前
从看见世界到重构认知:在视觉与硬件的交汇处,寻找我们这代人的北极星
c语言·物联网·计算机视觉·重构·硬件工程·射频工程
mk0153 天前
单片机同步降压稳压器输出最低1V,关断时损耗3uA
单片机·嵌入式硬件·硬件工程·智能硬件·pcb工艺
ACP广源盛139246256733 天前
Type‑C 扩展坞选型笔记:USB3.0 双通道信号切换方案 LH3412@ACP 评估
笔记·硬件架构·硬件工程·国产芯片·开关
HQB20265 天前
屹晶微电子 EG1130|2‑24V 输入 / 最高 28V 输出 内置 MOS 异步升压 DC‑DC|SOT23‑6|摄像头 / 车充 / 电池充电电源
嵌入式硬件·硬件工程
HQB20265 天前
屹晶微电子 EG1195|10‑120V/10A+ 外置 MOS 异步降压控制器|ESOP‑8|电动车转换器 / 快充 / 工业电源
嵌入式硬件·硬件工程