当前位置: 首页 > article >正文

Rockchip U-Boot启动流程详解:从BootRom到main_loop,代码级剖析(以RK3399为例)

Rockchip U-Boot启动流程深度解析从BootRom到main_loop的完整代码路径当我们谈论嵌入式系统开发时U-Boot作为最广泛使用的开源引导加载程序之一其重要性不言而喻。特别是在Rockchip平台上理解U-Boot的完整启动流程对于系统定制、性能优化和故障排查至关重要。本文将深入剖析RK3399平台上U-Boot从BootRom到main_loop的完整执行路径为开发者提供一份详尽的代码级指南。1. Rockchip启动架构概述Rockchip平台采用分阶段启动的设计理念这种分层架构既保证了启动的安全性又提供了足够的灵活性。RK3399作为Rockchip的高端处理器代表其启动流程具有典型性BootRom阶段固化在芯片内部的不可修改代码负责最基本的硬件初始化和加载下一阶段程序TPL/SPL阶段Tiny Program Loader和Secondary Program Loader分别运行在SRAM和DDR中U-Boot Proper阶段完整的U-Boot环境提供丰富的功能和命令行接口Kernel加载阶段最终引导Linux内核启动// Rockchip典型的启动链示例 BOOTROM TPL SPL TRUST U-BOOT KERNEL这种分阶段设计的主要优势在于安全性每个阶段只拥有完成下一阶段加载所需的最小权限可靠性前级加载程序可以验证后级程序的完整性和合法性灵活性开发者可以在不同阶段介入实现定制需求2. BootRom阶段芯片启动的第一行代码RK3399的BootRom是启动流程的起点它固化在芯片内部无法被修改。当芯片上电或复位时Cortex-A53的Core0会从0xFFFF0000地址开始执行BootRom代码。BootRom的主要职责包括时钟初始化设置CPU、总线和外设的基本时钟存储介质检测识别启动设备eMMC、SPI Flash、SD卡等安全验证检查下一阶段代码的签名如果启用安全启动加载TPL将Tiny Program Loader加载到SRAM中执行// BootRom启动后的典型执行流程 _start: nop b reset // 跳转到reset处理程序 reset: // 检查加载器标签 ldr x0, __loader_tag ldr w1, [x0] ldr x0, LoaderTagCheck ldr w2, [x0] cmp w1, w2 b.eq checkok ret // 返回到maskrom或miniloader checkok: // 设置异常向量表 adr x0, vectors switch_el x1, 3f, 2f, 1fBootRom阶段的一个重要概念是重映射控制由SGRF_PMU_CON0[15]寄存器位控制。当remap设置为0时0xFFFF0000地址被映射到BootRom设置为1时则映射到INTMEM0。3. TPL/SPL阶段关键的低级初始化3.1 TPL (Tiny Program Loader)TPL是运行在SRAM中的最小加载程序其主要任务包括DDR控制器初始化为下一阶段准备内存环境时钟树配置设置PLL和分频器提供系统所需的各种时钟基本外设初始化如串口调试输出加载SPL从存储设备读取SPL到DDR中// TPL中的典型DDR初始化流程 void ddr_init(void) { // 1. 复位DDR控制器 writel(0x1, DDRC_CTRL_REG); udelay(100); // 2. 配置PHY参数 configure_ddr_phy(); // 3. 设置时序参数 set_timing_parameters(); // 4. 校准阻抗 calibrate_impedance(); // 5. 启动DDR控制器 writel(0x2, DDRC_CTRL_REG); }3.2 SPL (Secondary Program Loader)SPL运行在已初始化的DDR内存中具有更大的代码空间和更丰富的功能更完整的外设初始化包括存储设备、USB、网络等加载U-Boot Proper和Trust固件从存储设备读取完整U-Boot安全验证检查加载镜像的签名和完整性环境变量初始化建立基本的运行环境SPL阶段的一个重要文件是lowlevel_init.S它处理从BootRom到SPL的过渡ENTRY(lowlevel_init) mov x29, lr // 保存返回地址 ldr x0, secondary_boot_func bl secondary_switch_to_el2 #ifdef CONFIG_ARMV8_SWITCH_TO_EL1 bl secondary_switch_to_el1 #endif4. U-Boot Proper阶段完整的引导环境当SPL完成其工作后会将控制权转交给U-Boot Proper。这是开发者最常接触的阶段也是功能最丰富的部分。4.1 执行入口与初始化流程U-Boot Proper的执行从_start符号开始最终会调用两个关键函数board_init_f完成基本的硬件初始化和内存配置board_init_r初始化设备驱动和高级功能// U-Boot Proper的典型初始化序列 void board_init_f(ulong boot_flags) { gd-flags boot_flags; gd-have_console 0; if (initcall_run_list(init_sequence_f)) hang(); } void board_init_r(gd_t *new_gd, ulong dest_addr) { if (initcall_run_list(init_sequence_r)) hang(); }4.2 关键初始化步骤U-Boot Proper的初始化过程非常复杂涉及数百个函数调用。以下是一些关键步骤初始化阶段主要功能相关文件板级早期初始化GPIO、时钟、电源等基本配置board/rockchip/*.c设备模型初始化创建设备树、绑定驱动common/board_f.c内存初始化DDR配置、内存区域划分arch/arm/mach-rockchip/*.c设备驱动初始化存储、网络、显示等外设drivers/*环境变量初始化加载和解析环境变量common/env_*.c命令行初始化准备命令行接口common/cli.c4.3 内存重定位U-Boot在启动过程中会执行一次重要的内存重定位操作这主要涉及计算重定位地址确定U-Boot在内存中的最终位置复制代码和数据将自身复制到新的内存区域修复地址引用更新所有与位置相关的指针和引用跳转到新位置继续执行重定位后的代码// 内存重定位的关键代码片段 void relocate_code(ulong addr_sp, gd_t *new_gd, ulong addr) { // 计算重定位偏移量 ulong reloc_off addr - CONFIG_SYS_TEXT_BASE; // 复制.text段 memcpy((void *)addr, (void *)CONFIG_SYS_TEXT_BASE, __bss_start - __text_start); // 复制.data段 memcpy((void *)(addr (__data_start - __text_start)), (void *)__data_start, __data_end - __data_start); // 修复GD指针 new_gd (gd_t *)((ulong)new_gd reloc_off); // 跳转到重定位后的代码 asm volatile(mov sp, %0\n mov x0, %1\n mov x1, %2\n b relocate_vectors : : r(addr_sp), r(new_gd), r(addr)); }5. ARMv8异常等级切换RK3399基于ARMv8架构使用异常等级(EL)来管理不同特权级别的代码执行。U-Boot在启动过程中会经历多次异常等级切换EL3安全监控模式由BootRom运行EL2虚拟化模式通常由SPL使用EL1操作系统模式U-Boot Proper主要运行在此等级EL0用户模式U-Boot不使用// 异常等级切换示例代码 switch_el x1, 3f, 2f, 1f 3: // EL3处理 msr vbar_el3, x0 orr x0, x0, #0xf // SCR_EL3.NS|IRQ|FIQ|EA msr scr_el3, x0 b 0f 2: // EL2处理 msr vbar_el2, x0 mov x0, #0x33ff msr cptr_el2, x0 // 启用FP/SIMD b 0f 1: // EL1处理 msr vbar_el1, x0 mov x0, #3 20 msr cpacr_el1, x0 // 启用FP/SIMD 0: bl lowlevel_init6. main_loopU-Boot的交互核心当所有初始化完成后U-Boot会进入main_loop函数这是U-Boot的交互核心void main_loop(void) { bootstage_mark_name(BOOTSTAGE_ID_MAIN_LOOP, main_loop); // 初始化调制解调器 modem_init(); // 设置版本变量 #ifdef CONFIG_VERSION_VARIABLE setenv(ver, version_string); #endif // 初始化命令行接口 cli_init(); // 执行预启动命令 run_preboot_environment_command(); // 处理TFTP更新 #if defined(CONFIG_UPDATE_TFTP) update_tftp(0UL); #endif // 处理启动延迟 s bootdelay_process(); // 安全启动处理 if (cli_process_fdt(s)) cli_secure_boot_cmd(s); // 自动启动或进入命令行 autoboot_command(s); cli_loop(); }main_loop的主要功能包括环境变量处理加载和解析启动参数自动启动流程根据配置自动加载内核命令行接口提供交互式命令环境超时处理实现启动延迟和中断功能7. Rockchip特有的功能扩展Rockchip在标准U-Boot基础上添加了许多平台特有功能这些功能通常位于board/rockchip/common/目录下Fastboot支持实现快速刷机功能Rockusb协议专有的USB下载模式显示初始化处理Rockchip的显示子系统电源管理包括充电和低电量处理存储设备检测特殊的启动模式判断// Rockchip特有的重启类型判断 enum fbt_reboot_type board_fbt_get_reboot_type(void) { enum fbt_reboot_type frt FASTBOOT_REBOOT_UNKNOWN; uint32_t loader_flag IReadLoaderFlag(); int reboot_mode loader_flag ? (loader_flag 0xFF) : BOOT_NORMAL; // 反馈重启模式到内核 ISetLoaderFlag(SYS_KERNRL_REBOOT_FLAG | reboot_mode); if ((loader_flag 0xFFFFFF00) SYS_LOADER_REBOOT_FLAG) { switch (reboot_mode) { case BOOT_NORMAL: frt FASTBOOT_REBOOT_NORMAL; break; case BOOT_LOADER: do_rockusb(NULL, 0, 0, NULL); break; case BOOT_FASTBOOT: frt FASTBOOT_REBOOT_FASTBOOT; break; // 其他模式处理... } } return frt; }8. 调试与问题排查理解U-Boot启动流程对于调试系统启动问题至关重要。以下是一些常用的调试技巧串口输出确保串口初始化尽早完成并保持输出日志LED指示灯在关键阶段切换LED状态可视化执行流程内存检测在DDR初始化后立即进行内存测试启动暂停在关键点插入while(1);暂停执行版本信息检查各组件版本是否匹配// 在代码中添加调试信息的示例 #define DEBUG #ifdef DEBUG printf([DEBUG] %s: Reached checkpoint %d\n, __func__, checkpoint_id); led_toggle(LED_DEBUG); #endif对于RK3399平台还需要特别注意DDR初始化参数不同板型可能需要不同的DDR配置电源管理确保所有电源域正确上电时钟配置验证各模块时钟频率是否符合预期启动设备识别确认系统从正确的设备启动通过深入理解Rockchip U-Boot的完整启动流程开发者可以更有效地定制引导加载程序解决启动问题并优化系统启动时间。无论是添加新的硬件支持、实现安全启动功能还是调试复杂的启动故障这份代码级的流程分析都将成为宝贵的参考资料。

相关文章:

Rockchip U-Boot启动流程详解:从BootRom到main_loop,代码级剖析(以RK3399为例)

Rockchip U-Boot启动流程深度解析:从BootRom到main_loop的完整代码路径 当我们谈论嵌入式系统开发时,U-Boot作为最广泛使用的开源引导加载程序之一,其重要性不言而喻。特别是在Rockchip平台上,理解U-Boot的完整启动流程对于系统定…...

【SLAM技术解析】欧拉角万向锁现象:从理论到实践的深度剖析

1. 欧拉角:三维旋转的直观表达 第一次接触SLAM技术时,我被欧拉角这个概念深深吸引。它就像是用三个简单的数字来描述物体在三维空间中的任意旋转,这种直观性让我这个刚入门的新手也能快速理解。欧拉角通过将复杂的三维旋转分解为绕三个坐标轴…...

基于改进型PNGV的锂电池等效电路模型【MATLAB】

你有没有想过,工程师是怎么在电脑里"模拟"一块电池的?本文带你从零认识电池等效电路模型,理解 PNGV 与改进型 PNGV 模型的原理与区别。一、为什么需要给电池"建模"? 电动汽车的核心是电池。但电池是一个复杂的…...

空间数据分析:热点区域识别与分布模式分析

空间数据分析:热点区域识别与分布模式分析 在当今大数据时代,空间数据分析已成为城市规划、环境监测、公共卫生等领域的重要工具。通过识别热点区域和分析分布模式,我们可以揭示隐藏的空间规律,为决策提供科学依据。无论是城市犯…...

QT记事本进阶——巧用QMap构建编码映射,实现ComboBox与QTextStream的无缝对接

1. 为什么需要编码映射? 在开发一个支持多编码的文本编辑器时,最头疼的问题之一就是如何让用户选择的编码名称(比如"UTF-8"、"GBK")能够正确转换为Qt内部的编码枚举值。这个问题在Qt 6.9之后变得更加突出&…...

M2LOrder模型开源镜像深度解析:从模型架构到部署文件结构

M2LOrder模型开源镜像深度解析:从模型架构到部署文件结构 如果你在星图GPU平台上部署过M2LOrder模型,可能会好奇这个一键部署的镜像里面到底装了些什么。它为什么能跑起来?里面的文件都是干什么用的?今天,我们就来当一…...

Cursor AI免费VIP破解工具:3步绕过试用限制的完整指南

Cursor AI免费VIP破解工具:3步绕过试用限制的完整指南 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your tri…...

别再只靠投票了!手把手教你用Python实现更靠谱的众包结果汇聚算法

别再只靠投票了!手把手教你用Python实现更靠谱的众包结果汇聚算法 当你在众包平台上收集了数百条标注数据,却发现不同标注者给出的答案五花八门时,简单粗暴的"少数服从多数"投票法往往会让你的数据分析陷入困境。本文将带你用Pytho…...

从一个地狱笑话看大模型的推理机制

一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...

别再死记硬背了!一张图帮你理清OSPF四种特殊区域(Stub/NSSA)的区别与配置要点

OSPF特殊区域实战指南:从原理到配置的深度解析 在备考网络认证或实际工作中,OSPF特殊区域的概念常常让工程师们感到困惑。Stub、Totally Stub、NSSA、Totally NSSA这四种区域类型看似相似,实则各有特点。本文将带您深入理解它们的区别&#x…...

如何用3行代码获取股票基金数据?efinance终极指南助你快速入门量化交易

如何用3行代码获取股票基金数据?efinance终极指南助你快速入门量化交易 【免费下载链接】efinance efinance 是一个可以快速获取基金、股票、债券、期货数据的 Python 库,回测以及量化交易的好帮手!🚀🚀🚀 …...

告别手动复制:USBCopyer让你在Windows上实现U盘文件自动备份

告别手动复制:USBCopyer让你在Windows上实现U盘文件自动备份 【免费下载链接】USBCopyer 😉 用于在插上U盘后自动按需复制该U盘的文件。”备份&偷U盘文件的神器”(写作USBCopyer,读作USBCopier) 项目地址: https…...

Recaf插件系统终极指南:打造你的专属Java逆向工程工具箱

Recaf插件系统终极指南:打造你的专属Java逆向工程工具箱 【免费下载链接】Recaf The modern Java bytecode editor 项目地址: https://gitcode.com/gh_mirrors/re/Recaf Java逆向工程开发者和安全研究人员常常面临这样的困境:现有的工具要么功能单…...

从VXLAN到MPLS:数据中心网络为什么需要调大MTU值?9000字节配置实战

数据中心网络MTU优化实战:从1500到9000字节的跨越 在云计算和虚拟化技术蓬勃发展的今天,数据中心网络架构正经历着前所未有的变革。传统以太网1500字节的MTU(最大传输单元)标准,在面对VXLAN、MPLS等现代网络技术时显得…...

GitHub访问速度提升10倍的终极方案:Fast-GitHub加速插件完整指南

GitHub访问速度提升10倍的终极方案:Fast-GitHub加速插件完整指南 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 你是否…...

【多模态大模型缓存优化白皮书】:20年架构师亲授3类缓存失效陷阱与5层分级缓存落地实践

第一章:多模态大模型缓存策略优化 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在处理图像、文本、音频等异构输入时,面临显著的缓存效率瓶颈:不同模态特征向量维度差异大、访问局部性弱、中间激活内存占用高,导致…...

WaveTools终极指南:三招提升《鸣潮》游戏体验的完整解决方案

WaveTools终极指南:三招提升《鸣潮》游戏体验的完整解决方案 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否在《鸣潮》中因帧率限制无法流畅体验战斗快感?或者每次切换账号都…...

苍穹外卖debug篇

一、找不到符号1、jdk版本匹配:该版本需使用jdk17和language level17,一开始用了jdk 25就出现“找不到符号”的报错一:更改这里二:改完之后每个文件夹都要改language level应用->确定三:maven的设置里要改到此可以解…...

Axure RP中文语言包完全指南:5分钟实现专业界面本地化

Axure RP中文语言包完全指南:5分钟实现专业界面本地化 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 如果您正在使用…...

告别十六进制恐惧:用d2s-editor轻松掌控暗黑破坏神2存档

告别十六进制恐惧:用d2s-editor轻松掌控暗黑破坏神2存档 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾经因为暗黑破坏神2存档损坏而痛失心爱的角色?或者想要尝试不同的角色build却不想从头练级…...

AI生成专著的秘密武器!实用工具推荐,开启高效写作之旅

研究人员撰写学术专著的困境与AI工具的助力 对很多研究人员来说,撰写学术专著面临的最大挑战,无疑是“有限的精力”与“无尽的需求”之间的矛盾。专著的创作通常需要三到五年,甚至更长的时间,而研究人员日常还得兼顾教学、科研项…...

AI专著生成新玩法!借助工具力量,短时间打造专属专著

学术专著的主要价值在于其内容的系统性和严谨的逻辑性,但这恰恰是写作过程中最难跨越的障碍。与专注于单一问题的期刊论文不同,专著需要构建一个完整的框架,包括绪论、理论基础、核心研究、应用拓展和结论,确保各个章节相互关联、…...

AI专著生成新方式:揭秘高效写作工具,开启创作快速通道

学术专著的写作不仅考验着学者的学术水平,也在心理上对他们提出了挑战。与依赖团队合作的论文写作不同,专著的撰写往往是一个人独自完成的过程。从选题、结构设计到具体内容的编写和修改,每一步都需要作者耗费大量时间和精力。长时间的独自创…...

低查重AI教材生成秘籍大公开!专业工具助力高效编写优质教材!

编写教材的变革:AI 时代的新选择 编写教材离不开丰富的资料支持,但传统的资料整合方式已经无法满足现今的需求。以前,我们需要从各类渠道,例如课标文件、学术研究和教学案例中收集信息,这些资料分散在知网、教研平台等…...

低查重AI教材编写攻略,掌握这些工具,轻松完成教材创作

教材的初步版本终于完成,但进入修改和优化阶段后,我才意识到这是一种“煎熬”!为了通读全文、查找逻辑上的漏洞和知识点的错误,我费了不少时间;重新调整一个章节的结构,往往会影响到后面的多个部分&#xf…...

pd.to_numeric()实战:从数据清洗到内存优化的类型转换全解析

1. 为什么需要类型转换?从销售数据乱象说起 刚接手一份销售数据时,我经常遇到这样的混乱场景:报表里的"销售额"列竟然显示为object类型,仔细一看发现里面混着"1,200"、"1500"这样的字符串&#xff…...

【音视频开发】 从传统到智能:3A算法(AE/AWB/AF)的演进与AI赋能实践

1. 3A算法的前世今生:从传统统计到AI革命 第一次调试相机模组时,我盯着屏幕上忽明忽暗的画面差点崩溃——阳光下的白色建筑在自动曝光下变成灰蒙蒙的积木,室内的人脸在自动白平衡下泛着诡异的蓝绿色。这就是传统3A算法的典型困境:…...

华为HCIP-Datacom备考全攻略:从零基础到高分通关的5个关键步骤

华为HCIP-Datacom零基础通关指南:5步构建高效备考体系 站在数据中心网络技术的职业分水岭上,华为HCIP-Datacom认证已成为众多网络工程师突破职业瓶颈的黄金通行证。不同于普通的技术认证,这套体系不仅考察理论知识记忆,更注重解决…...

STC8H_ADC函数实战:从寄存器配置到多通道电压采集

1. STC8H单片机ADC模块入门指南 第一次接触STC8H的ADC功能时,我也被那一堆寄存器搞得头晕眼花。但实际用起来你会发现,这个12位精度的模数转换器其实是个非常实用的外设,特别适合做电池电压监测、传感器信号采集这些常见任务。相比STM32的ADC…...

多模态大模型商业化落地失败的6个隐形陷阱(SITS2026圆桌闭门报告第12页首次流出),第4条90%技术负责人正在踩

第一章:多模态大模型商业化落地失败的6个隐形陷阱(SITS2026圆桌闭门报告第12页首次流出) 2026奇点智能技术大会(https://ml-summit.org) 数据飞轮未闭环,标注成本反噬ROI 多模态场景中,图像、语音、文本、视频需联合…...