news 2026/4/21 6:31:28

[Linux外设驱动详解]RK3588 U-Boot 启动流程详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[Linux外设驱动详解]RK3588 U-Boot 启动流程详解

RK3588 U-Boot 启动流程详解

目录

  1. 概述
  2. 硬件架构
  3. 启动阶段划分
  4. SPL 阶段详解
  5. U-Boot 阶段详解
  6. 关键数据结构
  7. 时序图
  8. 源码路径参考

概述

RK3588 是瑞芯微(Rockchip)推出的旗舰级 ARM64 SoC,采用 4xCortex-A76 + 4xCortex-A55 大小核架构。本文档详细分析 RK3588 平台上 U-Boot 的完整启动流程。

启动镜像组成

┌─────────────────────────────────────────────────────────┐ │ RK3588 启动镜像 │ ├─────────────────────────────────────────────────────────┤ │ BootROM (芯片内部固件) │ │ ├─ 检测启动设备 │ │ └─ 加载 SPL(TPL) │ ├─────────────────────────────────────────────────────────┤ │ SPL (Secondary Program Loader) │ │ ├─ 初始化 DDR │ │ ├─ 初始化串口 │ │ ├─ 加载 ATF/OPTEE │ │ └─ 加载 U-Boot │ ├─────────────────────────────────────────────────────────┤ │ ATF (ARM Trusted Firmware) │ │ ├─ EL3 安全监控 │ │ └─ PSCI 电源管理 │ ├─────────────────────────────────────────────────────────┤ │ OPTEE (可选的安全OS) │ │ └─ Secure World 服务 │ ├─────────────────────────────────────────────────────────┤ │ U-Boot (主程序) │ │ └─ 最终引导操作系统 │ └─────────────────────────────────────────────────────────┘

硬件架构

RK3588 核心规格

项目规格
CPU4x Cortex-A76 @ 2.4GHz + 4x Cortex-A55 @ 1.8GHz
GPUMali-G610 MP4
NPU6TOPS RKNN
VPU8K VP9 + 8K H265 + 4K AV1 解码
内存支持 LPDDR4/LPDDR4X/LPDDR5
启动设备eMMC 5.1、SD卡 3.01、SPI NAND、SPI NOR

内存映射

// 源码: arch/arm/mach-rockchip/rk3588/rk3588.c:108-142staticstructmm_regionrk3588_mem_map[]={{.virt=0x0UL,// 0GB.phys=0x0UL,.size=0xf0000000UL,// ~3.75GB (普通内存).attrs=PTE_BLOCK_MEMTYPE(MT_NORMAL)|PTE_BLOCK_INNER_SHARE},{.virt=0xf0000000UL,// ~3.75GB.phys=0xf0000000UL,.size=0x10000000UL,// 256MB (设备寄存器).attrs=PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE)|PTE_BLOCK_NON_SHARE},{.virt=0x100000000UL,// 4GB.phys=0x100000000UL,.size=0x700000000UL,// ~28GB (高地址内存).attrs=PTE_BLOCK_MEMTYPE(MT_NORMAL)|PTE_BLOCK_INNER_SHARE},{.virt=0x900000000,// ~36GB.phys=0x900000000,.size=0x150000000,// ~5.25GB (PCIe设备).attrs=PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE)|PTE_BLOCK_NON_SHARE}};

启动阶段划分

┌────────────────────────────────────────────────────────────────────┐ │ RK3588 完整启动流程 │ └────────────────────────────────────────────────────────────────────┘ 上电/复位 │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段1: BootROM (芯片内部ROM) │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 1. 从 BootROM 启动 │ │ │ │ 2. 检测启动设备 (eMMC/SD卡/SPI Flash) │ │ │ │ 3. 加载 IDBlock (SPL/TPL) 到 SRAM │ │ │ │ 4. 验证签名 (如果启用安全启动) │ │ │ │ 5. 跳转到 SPL 入口地址 │ │ │ └─────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段2: SPL (Secondary Program Loader) │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 2.1 start.S (armv8/start.S) │ │ │ │ └─ CPU 初始化、异常向量表设置 │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 2.2 lowlevel_init() │ │ │ │ ├─ 使能 I-Cache │ │ │ │ └─ 初始化 GIC (中断控制器) │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 2.3 _main() → board_init_f() │ │ │ │ ├─ rockchip_stimer_init() // 系统计器初始化 │ │ │ │ ├─ debug_uart_init() // 串口初始化 │ │ │ │ ├─ spl_early_init() // DM框架、设备树 │ │ │ │ ├─ dram_init() // DDR初始化 │ │ │ │ ├─ arch_cpu_init() // CPU架构初始化 │ │ │ │ └─ preloader_console_init() // 控制台初始化 │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 2.4 board_init_r() │ │ │ │ ├─ spl_board_init() // 板级初始化 │ │ │ │ ├─ 确定启动设备 (board_boot_order) │ │ │ │ ├─ 加载 FIT 镜像 │ │ │ │ ├─ 解析 ATF/OPTEE/U-Boot │ │ │ │ └─ 准备跳转 │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 2.5 jump_to_image_no_args() │ │ │ │ └─ 跳转到 ATF (BL31) │ │ │ └─────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段3: ATF (ARM Trusted Firmware - BL31) │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 1. EL3 初始化 │ │ │ │ 2. 初始化安全监控器 (Secure Monitor) │ │ │ │ 3. 加载 OPTEE (BL32) - 可选 │ │ │ │ 4. 设置 PSCI 接口 │ │ │ │ 5. 降级到 EL2 并跳转到 U-Boot (BL33) │ │ │ └─────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ ┌──────────────────────────────────────────────────────────────────┐ │ 阶段4: U-Boot Proper │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 4.1 start.S (armv8/start.S) │ │ │ │ └─ 同 SPL 启动流程 │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 4.2 board_init_f() │ │ │ │ ├─ 硬件初始化 │ │ │ │ ├─ 设备模型初始化 │ │ │ │ └─ 环境变量设置 │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 4.3 board_init_r() │ │ │ │ ├─ 网络初始化 │ │ │ │ ├─ 存储设备初始化 │ │ │ │ ├─ 显示初始化 │ │ │ │ └─ 进入主循环 │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 4.4 main_loop() │ │ │ │ ├─ 启动延迟 │ │ │ │ ├─ 命令处理 │ │ │ │ └─ 执行 bootcmd │ │ │ └─────────────────────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────────────────┘ │ ▼ 操作系统内核 (Kernel)

SPL 阶段详解

1. 入口: start.S

文件位置: arch/arm/cpu/armv8/start.S:20-238

// reset 向量 - 上电后首先执行 reset: b save_boot_params // 保存启动参数 // 根据当前异常级别(EL)设置异常向量表 switch_el x1, 3f, 2f, 1f 3: msr vbar_el3, x0 // EL3: 设置异常向量 orr x0, x0, #0xf // SCR_EL3.NS|IRQ|FIQ|EA msr scr_el3, x0 b 0f 2: msr vbar_el2, x0 // EL2 b 0f 1: msr vbar_el1, x0 // EL1 0: // 使能 I-Cache mov x1, #CR_I switch_el x2, 3f, 2f, 1f 3: mrs x0, sctlr_el3 orr x0, x0, x1 msr sctlr_el3, x0 // 调用底层初始化 bl lowlevel_init // 跳转到 C 代码 master_cpu: bl _main

关键点:

  • _start是链接脚本定义的入口点
  • 支持 EL1/EL2/EL3 不同的异常级别
  • 设置异常向量表vbar_elx
  • 使能指令缓存

2. lowlevel_init

文件位置: arch/arm/cpu/armv8/start.S:336-390

WEAK(lowlevel_init)mov x29,lr/* 保存返回地址 */#ifCONFIG_IS_ENABLED(IRQ)branch_if_slave x0,1fldr x0,=GICD_BASE bl gic_init_secure// 初始化 GIC 分发器1:#ifdefined(CONFIG_GICV3)ldr x0,=GICR_BASE bl gic_init_secure_percpu// 初始化 GIC CPU 接口#endif#endifmov lr,x29/* 恢复返回地址 */retENDPROC(lowlevel_init)

3. board_init_f - SPL初始化核心

文件位置: arch/arm/mach-rockchip/spl.c:189-251

voidboard_init_f(ulong dummy){gd->flags=dummy;// 1. 系统计器初始化rockchip_stimer_init();// 2. 调试串口初始化if(!gd->serial.using_pre_serial&&!(gd->flags&GD_FLG_DISABLE_CONSOLE))debug_uart_init();printascii("U-Boot SPL board init");gd->sys_start_tick=get_ticks();// 记录启动时间// 3. DM 框架早期初始化ret=spl_early_init();if(ret){printf("spl_early_init() failed: %d\n",ret);hang();}// 4. DDR 初始化 (关键!)debug("\nspl:init dram\n");ret=uclass_get_device(UCLASS_RAM,0,&dev);if(ret){printf("DRAM init failed: %d\n",ret);return;}// 5. 控制台初始化preloader_console_init();// 6. 热键检测 (如 Ctrl+B 触发下载模式)spl_hotkey_init();// 7. 架构相关初始化
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 12:44:45

ImageGlass图片查看器:免费轻量级工具让Windows看图体验焕然一新

ImageGlass图片查看器:免费轻量级工具让Windows看图体验焕然一新 【免费下载链接】ImageGlass 🏞 A lightweight, versatile image viewer 项目地址: https://gitcode.com/gh_mirrors/im/ImageGlass 还在为Windows自带照片应用的缓慢启动和功能局…

作者头像 李华
网站建设 2026/4/20 21:14:44

PaddlePaddle图神经网络GNN支持情况盘点

PaddlePaddle图神经网络GNN支持情况盘点 在推荐系统、知识图谱和社交网络分析日益复杂的今天,如何有效建模实体之间的复杂关系成为AI落地的关键挑战。传统深度学习方法如CNN或RNN擅长处理图像和序列这类规则结构数据,但面对用户-商品交互、蛋白质相互作用…

作者头像 李华
网站建设 2026/4/18 3:40:30

百度ERNIE 4.5重磅发布:300B参数大模型来了!

百度ERNIE 4.5重磅发布:300B参数大模型来了! 【免费下载链接】ERNIE-4.5-300B-A47B-W4A8C8-TP4-Paddle 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/ERNIE-4.5-300B-A47B-W4A8C8-TP4-Paddle 百度ERNIE 4.5大模型正式发布,带来…

作者头像 李华
网站建设 2026/4/18 12:53:25

图解说明fastbootd启动流程及其在OTA更新中的作用

fastbootd:现代Android系统更新的“空中救援通道”你有没有遇到过这样的情况?手机OTA升级到一半突然断电,重启后卡在启动画面动弹不得。以前这种状况基本等于“变砖”,只能返厂用夹具救机。但现在越来越多设备能自动进入一个黑白界…

作者头像 李华
网站建设 2026/4/19 1:46:48

LCD1602背光正常但无字符?实战案例分析

LCD1602背光亮却无字符?一次说清所有“黑屏”真相你有没有遇到过这种情况:给LCD1602通上电,背光照常亮起,万用表测电压也正常,可屏幕就是一片空白——既没有乱码,也没有闪烁光标,仿佛这块屏压根…

作者头像 李华
网站建设 2026/4/19 1:49:27

Kimi-Audio开源!70亿参数全能音频AI模型震撼发布

Kimi-Audio开源!70亿参数全能音频AI模型震撼发布 【免费下载链接】Kimi-Audio-7B-Instruct 我们推出 Kimi-Audio——一个在音频理解、生成与对话方面表现卓越的开源音频基础模型。本仓库提供 Kimi-Audio-7B-Instruct 的模型检查点。 项目地址: https://ai.gitcode…

作者头像 李华