乐于分享
好东西不私藏

干货分享|SoC上电四大阶段,软件分别对DDR做了什么?

干货分享|SoC上电四大阶段,软件分别对DDR做了什么?
专栏说明:DDR是嵌入式SOC开发高频基础知识点,涵盖控制器、PHY、时序、启动调试等海量内容,一篇无法讲透。本系列采用分点总结、分批分享模式,不做大而全堆砌,本篇为DDR系列第一篇,总结【SoC上电全流程DDR操作差异】。

前言:

很多嵌入式工程师默认:SoC上电后,DDR全程由软件统一配置、统一管控。
但真实开发、Uboot调试、内核适配、平台移植过程中会发现:
✅ BootROM不能读写DDR
✅ SPL是唯一初始化DDR的阶段
✅ 主Uboot、Linux内核绝不会重复做全套DDR初始化
总结前置:SoC冷启动分为四大固定阶段,每个阶段软件对DDR的操作、权限完全不同,混淆逻辑极易出现DDR训练失败、开机黑屏、内核内存异常等问题。

一、上电瞬间DDR是什么状态?

芯片刚上电、不掉电复位初期:
DDR颗粒 + DDR控制器 + DDR PHY 全部处于硬件复位冻结态
👉 无法读写、无法存储数据、时序未配置、时钟未锁定
👉 上电初期所有启动代码,只能运行在芯片内置小容量片上SRAM(TCM/OCM/IRAM),DDR全程不可用,必须软件分层唤醒、初始化。
SoC内存分区简易示意图

二、拆解SoC四大启动阶段|DDR软件操作全对比

标准嵌入式Linux/Android SoC启动链路固定:BootROM → SPL一级引导 → 主Uboot → Linux内核,下文逐阶段拆解DDR动作,区分「做什么、不做什么、核心目的」。

阶段1:BootROM 芯片内置固化阶段

(最底层)

代码运行位置:芯片内置Mask ROM,只读不可修改
软件对DDR全部操作
仅释放DDR控制器、PHY、DDR颗粒硬件复位信号,解除硬冻结
使能DDR基础时钟,唤醒硬件模块
绝不执行:MRS寄存器配置、ZQ阻抗校准、读写Leveling训练、时序配置、开启刷新

阶段核心总结:

只唤醒、不初始化、不读写、不配置。
ROM本身不使用DDR,仅做好硬件预备工作,只负责把SPL固件加载到片内SRAM即可。
四大启动阶段DDR/LPDDR操作对比总图

阶段2:SPL次级引导阶段

(DDR生命周期最重要阶段)

代码运行位置:片内SRAM
核心定位:全启动流程唯一可以完整初始化DDR的阶段,没有之一。
软件会执行DDR全套底层初始化流程,也是DDR移植调试的核心工作:
联动PMIC配置DDR供电电压(VDD/VDDIO),匹配DDR4/DDR5规格
配置PLL锁相环,锁定DDR目标工作主频
PHY基础配置:驱动强度、差分时钟、ODT阻抗参数
执行ZQ硬件阻抗校准
下发MRS模式寄存器配置CL/CWL/BL8/自刷新等颗粒参数
写入全套时序参数:tRCD、tRP、tREFI等控制器时序
执行读写Leveling训练,对齐DQ/DQS采样窗口(高速DDR必做)
开启自动刷新,DDR正式解锁读写能力
阶段收尾动作:将主Uboot从Flash搬运至DDR,跳转至DDR运行代码。

阶段核心总结:

从零初始化、校准、配置,把DDR从不可用变为可用。后续所有启动阶段,都不会再重做全套初始化。

阶段3:主Uboot阶段

(代码已跑在DDR内)

代码运行位置:外部DDR
关键原则:复用SPL初始化好的DDR硬件配置,跳过PLL、MRS、PHY训练、ZQ校准全套底层操作。
软件仅做上层运维类操作:
可选memtest内存压力检测,校验DDR颗粒稳定性
划分DDR物理地址空间:预留设备树、内核、帧缓存、CMA专用内存区
简易DDR调频、低功耗模式配置(自刷新参数微调)
搬运Linux内核、设备树、根文件系统至DDR指定地址

阶段核心总结:

硬件不动,只管分区、检测、搬运镜像。

阶段4:Linux/Android内核运行阶段

(系统常驻阶段)

代码运行位置:外部DDR
关键原则:底层硬件配置永久沿用SPL参数,完全不触碰PHY、时序、MRS寄存器。
软件只做系统级动态调度管理:
内存页管理、虚实地址映射、CPU缓存一致性维护
分配CMA连续物理内存,供给GPU/NPU/ISP多媒体外设使用
DDR DVFS动态调频调压:高负载升频、待机降频降耗
系统休眠:下发指令让DDR进入自刷新保数据;唤醒直接退出自刷新,无需重初始化
控制器QoS优先级调度,保障视频、AI业务内存带宽优先
捕获DDR校验报错、硬件异常,上报系统中断

阶段核心总结:

只管调度、功耗、资源管理,零底层硬件初始化。

三、极简汇总表|四大阶段DDR行为

【四大阶段DDR行为汇总表格】

启动阶段

是否初始化DDR

核心DDR操作

代码运行位置

BootROM

硬件复位、基础时钟使能

片内ROM

SPL一级引导

是(唯一全套初始化)

供电/时钟/MRS/训练/时序全配置

片内SRAM

主Uboot

内存分区、镜像加载、稳定性测试

外部DDR

Linux内核

内存管理、DVFS调频、休眠唤醒调度

外部DDR


四、开发常见疑问|日常调试汇总

Q1:系统休眠唤醒后,需要重新初始化DDR吗?

不需要。内核仅退出/切换DDR至自刷新模式,PHY、时序、MRS全部保留,唤醒秒恢复读写,不走SPL初始化流程。

Q2:软件热重启(reboot不掉电),会重跑DDR全套初始化吗?

不会。DDR颗粒不掉电留存状态,SPL会自动跳过耗时的PHY读写训练,仅校验硬件状态,大幅缩短重启时间;仅冷上电必须完整初始化。

Q3:SPL阶段DDR初始化代码,默认运行在M核吗?

1、主流ARM架构SoC:绝大多数厂商SPL DDR初始化,固定跑在 M核(Cortex-M)
✅ 原因:M核极简、上电唤醒最快、功耗极低、上电默认自动启动,无需开启A核集群、无需开启MMU,适配底层硬件初始化,几乎所有车载、工控、手机SoC(瑞芯微、全志、高通、NXP),DDR初始化代码均托管M核执行。
2、特殊小众场景:极简MCU类SoC无独立M核,会复用A核小核运行SPL代码,属于特例。
3、补充关键点:
M核只负责跑完DDR硬件初始化、PHY训练、跳转Uboot;DDR可用后,直接把运行权限移交高性能A核,后续Uboot、内核全部由A核接管,M核休眠待机/做其他事情。

系列后续分享预告

DDR知识点零散且关联性强,后续持续整理干货总结,按需更新专题:
✅ 第二篇:DDR控制器基础架构、核心工作模块总结
✅ 第三篇:DDR PHY读写训练作用通俗总结
✅ 专项篇:对比DDR与LPDDR架构、初始化、功耗、控制器差异
纯嵌入式干货复盘、知识点总结分享,循序渐进补齐DDR相关基础知识。