瑞芯微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,有助于项目前期快速开发验证。

相关推荐
HQB20262 小时前
EG11731|屹晶微电子 100V 内置功率管大电流同步降压 DC‑DC
嵌入式硬件·硬件工程
2501_922639582 小时前
率能半导体 SS6209L半桥MOSFET驱动器:28V/4A集成方案,覆盖电子烟、无线充电、半桥应用三大场景
单片机·嵌入式硬件·硬件工程
HQB20262 小时前
EG1192S|屹晶微电子 100V 内置 MOS 异步降压 DC‑DC(零功耗使能)
嵌入式硬件·硬件工程
2501_922639586 小时前
率能半导体 SS6208L半桥MOSFET驱动器:12V/4A集成方案,覆盖电子烟、无线充电、半桥应用三大场景
单片机·嵌入式硬件·硬件工程
ACP广源盛1392462567319 小时前
项目评估记录:4K 视频墙方案调研,GSV9001E @ACP参数与工程问题记录
硬件架构·音视频·硬件工程·视频·国产芯片
Steelenwang1 天前
基于XT960的泵站监控方案
嵌入式硬件·物联网·硬件工程·智慧城市·智能硬件
Industio_触觉智能1 天前
瑞芯微AI算力NPU路线图与协处理器|触觉智能瑞芯微RK方案商出品
人工智能·嵌入式硬件·硬件架构·智能硬件·npu·瑞芯微·端侧ai
女神下凡1 天前
芯参谋(55):LED 驱动 · 系统设计指南
arm开发·单片机·嵌入式硬件·硬件工程·设计规范
深圳市恒锐丰科技杨生1 天前
LR010N04SD10 N 沟道 SGT‑MOSFET|Long‑Tek 龙夏电子
嵌入式硬件·硬件工程