RK平台U-Boot开发系列:SoC核心详解

电子说

1.4w人已加入

描述

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

一、目录概览

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

对于新 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定义了所有参数(内存加载地址、大小限制)

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分