RK平台U-Boot开发系列:SoC核心详解 电子说
arch/arm/mach-rockchip/ 是 Rockchip U-Boot 中最核心的目录,没有之一。它包含了 22 个 SoC 系列的芯片级代码。本文带你逐个详解每个文件的作用。
一、目录概览

二、核心文件详解
2.1 Kconfig — SoC 配置的大本营
这是文件最大的一个(~1280 行),定义了所有 SoC 的选择菜单和参数。
# SoC选择:ARCH_ROCKCHIP下每个SoC为一个configconfig ROCKCHIP_RK3576 bool "Support Rockchip RK3576" select ARM64 # ARMv8 64位 select GICV2 # GICv2中断控制器 select ARM_SMCCC # SMCCC调用 select SUPPORT_SPL # 支持SPL select SUPPORT_TPL # 支持TPL imply TPL_SERIAL_SUPPORT # TPL串口支持 help The Rockchip RK3576 is a ARM-based SoC with a quad-core Cortex-A53 and a quad-core Cortex-A72.# 每个SoC后面的参数块if ROCKCHIP_RK3576config TPL_TEXT_BASE default 0x3FF81000 # TPL加载地址(IRAM中)config TPL_MAX_SIZE default 61440 # TPL最大60KBendif
各 SoC 的 Kconfig 配置对比,最关键的三个参数:
| SoC | 架构 | TPL_TEXT_BASE | TPL_MAX_SIZE |
| RK3576 | ARM64 | 0x3FF81000 | 60KB |
| RK3588 | ARM64 | 0xFF001000 | 60KB |
| RK3568 | ARM64 | 0xFDCC1000 | 60KB |
| RK3399 | ARM64 | 0xFF8C2000 | 184KB |
| RK3288 | ARM32 | 0xFF704000 | 32KB |
| RV1106 | ARM32 | 0xFF701000 | 32KB |
| TPL_TEXT_BASE 的差异反映了不同 SoC 的内部 SRAM 布局不同,移植时这个参数最容易错。 |
2.2 spl.c — SPL 入口
void board_init_f(ulong dummy) // SPL从这里开始 ├── rockchip_stimer_init() // 安全定时器 ├── debug_uart_init() // 调试串口 ├── spl_early_init() // DM框架初始化 ├── spl_hotkey_init() // 热键检测 ├── arch_cpu_init() // ★ SoC硬件初始化(虚函数) └── back_to_bootrom() / 加载FIT
具体流程在专题二中有详细拆解,这里只需记住:spl.c 定义了 SPL 的执行骨架,而具体行为由各 SoC 的弱函数覆盖实现。
2.3 tpl.c — TPL 入口
比 SPL 更精简,只做 DRAM 初始化:
void board_init_f(ulong dummy){ rockchip_stimer_init(); arch_cpu_init(); debug_uart_init(); spl_early_init(); timer_init(); uclass_get_device(UCLASS_RAM, 0, &dev); // DDR初始化 back_to_bootrom(BROM_BOOT_NEXTSTAGE); // 返回BROM}
2.4 bootrom.c — BROM 通信
void back_to_bootrom(enum bootrom_stage stage){ // setjmp/longjmp 跳回BROM // stage决定BROM下一步动作: // NEXTSTAGE → 加载下一阶段 // ENTER_DNL → 进入USB下载模式}
三、每个 SoC 目录的标准三件套
以 rk3576 为例,每个 SoC 子目录通常包含 3 个文件:

| 对于新 SoC 的移植,这 3 个文件是必须实现的 "最小三件套"。 |
四、SoC 目录间的差异
不同 SoC 的目录内容并非完全一致:
| SoC | 文件数 | 额外文件 | 特点 |
| rk3576 | 3 | 标准 | ARM64 big.LITTLE |
| rk3588 | 4+ | rkcrc.c, secure.c | 有安全启动扩展 |
| rk3399 | 5+ | make_fit_optee.sh | 有 FIT 脚本生成器 |
| rk3288 | 3 | 标准 | 32 位经典 SoC |
| rk3308 | 3 | 标准 | 纯 Cortex-A35 |
五、公共文件与 SoC 文件的协作
公共文件(spl.c、tpl.c 等)与 SoC 文件(rk3576.c 等)通过弱函数协作:
公共文件定义了"骨架" SoC文件提供"血肉"──────────────────── ────────────────spl.c: board_init_f() rk3576.c: arch_cpu_init() → arch_cpu_init() rk3576.c: rockchip_stimer_init()spl.c: __weak stimer_init() rk3576.c: board_set_iomux()spl.c: spl_boot_device() → boot_devices[] rk3576.c: boot_devices[]
六、小结
arch/arm/mach-rockchip/ 目录是 RK 平台 U-Boot 开发的重中之重:
1.22 个 SoC 子目录,每个至少 3 个文件
2.公共文件提供执行骨架(spl.c/tpl.c/bootrom.c)
3.SoC 文件提供具体实现(rk3576.c/clk_rk3576.c)
4.Kconfig定义了所有参数(内存加载地址、大小限制)
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !