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

深入理解RK3399启动流程:手把手教你用TPL/SPL方式构建自定义uboot镜像

深入理解RK3399启动流程:手把手教你用TPL/SPL方式构建自定义uboot镜像

RK3399作为Rockchip旗下的高性能处理器,广泛应用于各类嵌入式设备与开发板中。对于希望深入掌握系统底层的中级开发者而言,理解其完整的启动流程并能够自定义uboot镜像是必备技能。本文将带你从原理到实践,系统性地探索RK3399从BootROM到uboot的完整启动链条,并动手构建符合自己需求的uboot镜像。

1. RK3399启动流程深度解析

RK3399的启动过程是一个精心设计的链条式机制,每个环节都有其独特职责。让我们先拆解这个流程的核心组成部分:

  • BootROM阶段:芯片上电后首先执行固化在ROM中的代码,负责初始化基本硬件并加载下一阶段引导程序。这个阶段开发者无法修改,但理解其行为对调试至关重要。
  • TPL (Trusted Primary Loader):作为BootROM加载的第一个用户可定制组件,TPL的核心任务是初始化DDR内存。由于DDR未初始化前无法运行复杂代码,TPL需要在极其受限的环境下工作。
  • SPL (Secondary Program Loader):在TPL完成DDR初始化后,SPL被加载到内存中执行。它负责设置更复杂的外设并加载最终的uboot镜像。
  • uboot阶段:完整的引导加载程序,提供丰富的功能和配置选项,为内核启动做准备。

关键点在于TPL和SPL的分工:TPL专注于DDR初始化这一单一关键任务,而SPL则承担更多系统初始化工作。这种分层设计既保证了可靠性,又提供了灵活性。

2. 构建开发环境与工具链准备

在开始实际操作前,需要搭建适合RK3399的开发环境。以下是经过验证的推荐配置:

# 安装基础编译工具 sudo apt-get install build-essential git swig python3-dev python3-pip # 安装交叉编译工具链 wget https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu.tar.xz sudo tar -xvf arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu.tar.xz -C /usr/local/

环境变量配置建议添加到~/.bashrc中:

export PATH=/usr/local/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH

验证工具链是否安装成功:

aarch64-none-linux-gnu-gcc --version

3. 获取与配置关键组件

RK3399的uboot构建需要几个关键组件协同工作:

组件作用获取方式
u-boot主引导程序官方仓库
ARM Trusted Firmware提供安全启动支持Rockchip提供或自行编译
rkbinRockchip专有二进制文件Rockchip官方仓库

实际操作步骤:

# 获取u-boot源码 git clone https://github.com/u-boot/u-boot.git cd u-boot # 获取Rockchip专有组件 git clone https://github.com/rockchip-linux/rkbin.git cp rkbin/bin/rk33/rk3399_bl31_v1.36.elf ./ mv rk3399_bl31_v1.36.elf bl31.elf

配置u-boot时,有几个关键选项需要特别注意:

  1. FIT (Flattened Image Tree)支持:现代uboot使用FIT格式打包多个镜像
  2. 串口配置:确保调试输出可用
  3. 存储设备支持:根据实际硬件选择正确的MMC/SD配置

配置命令示例:

make firefly-rk3399_defconfig make menuconfig

在menuconfig中,需要确保以下选项被正确设置:

Boot options → [*] Support Flattened Image Tree Boot options → (arch/arm/mach-rockchip/make_fit_atf.py) .its file generator script

4. 编译与镜像生成实战

完成配置后,编译过程需要分步骤进行:

  1. 编译uboot主程序

    make CROSS_COMPILE=aarch64-none-linux-gnu- BL31=bl31.elf
  2. 处理常见编译问题

    • 缺少Python模块:pip install pyelftools
    • 工具链问题:确保PATH设置正确
    • 权限问题:避免在root下编译,使用正确权限
  3. 生成关键镜像文件

    • idbloader.img:包含TPL和SPL的初始引导镜像
    • u-boot.itb:包含完整uboot的FIT镜像

生成idbloader.img的具体命令:

# 生成初始镜像 tools/mkimage -n rk3399 -T rksd -d tpl/u-boot-tpl.bin idbloader.img # 合并SPL cat spl/u-boot-spl.bin >> idbloader.img

生成u-boot.itb文件:

make u-boot.itb CROSS_COMPILE=aarch64-none-linux-gnu-

5. 烧录与验证

烧录过程因硬件不同而有所差异,以下是两种常见方法:

方法一:使用Rockchip官方工具

  1. 让设备进入Loader模式(通常通过按住特定按键上电)
  2. 使用AndroidTool或rkdeveloptool工具烧录
  3. 烧录地址:
    • idbloader.img → 0x40扇区
    • u-boot.itb → 0x4000扇区

方法二:在Linux系统中直接写入

sudo dd if=idbloader.img of=/dev/mmcblk0 seek=64 sudo dd if=u-boot.itb of=/dev/mmcblk0 seek=16384 sync

验证烧录是否成功的最直接方式是通过串口查看启动日志。成功的启动日志应该显示从TPL到SPL再到uboot的完整链条:

TPL 2023.07 DDR Version 1.16 SPL 2023.07 U-Boot 2023.07 (Nov 01 2023 - 15:23:45 +0800)

6. 高级技巧与问题排查

在实际项目中,可能会遇到各种特殊情况。以下是一些实用技巧:

性能优化

  • 调整TPL中的DDR参数以获得更好的内存性能
  • 优化SPL的初始化顺序缩短启动时间

调试方法

  • 在关键阶段添加串口输出
  • 使用JTAG工具进行底层调试
  • 分析Rockchip提供的技术参考手册

常见问题解决方案

问题现象可能原因解决方案
卡在TPL阶段DDR初始化失败检查DDR参数配置
SPL无法加载镜像损坏或位置错误验证烧录地址和镜像完整性
uboot不启动FIT配置错误检查.its文件生成过程

7. 扩展应用与自定义开发

掌握了基础流程后,可以进一步探索RK3399启动流程的深度定制:

  1. 安全启动:集成ARM Trusted Firmware实现安全验证
  2. 多系统引导:通过uboot实现双系统切换
  3. 快速启动优化:精简初始化流程加速启动
  4. 自定义硬件支持:适配新型存储设备或外设

一个实用的自定义案例是修改默认环境变量:

# 在include/configs/firefly-rk3399.h中添加 #define CONFIG_EXTRA_ENV_SETTINGS \ "bootdelay=3\0" \ "baudrate=1500000\0"

然后重新编译即可应用这些修改。

http://www.jsqmd.com/news/731498/

相关文章:

  • 3分钟免费转换B站缓存视频:m4s转MP4终极指南
  • 罗兰艺境GEO技术架构深度解析:通用分层、DSS权威准则与企业级工程实践 - 罗兰艺境GEO
  • 20万字AI专著写作指南:AI工具助力,轻松完成专著撰写!
  • XXMI启动器:一站式二次元游戏模组管理平台终极指南
  • 告别安卓广告:给AM40电视盒子刷入Firefly Linux 5.10内核,打造家庭轻量服务器
  • iOS微信抢红包插件:告别手动抢红包的智能解决方案
  • 别再问为什么了!手机4G/5G网络下,你的‘公网IP’Ping不通的底层真相(附NAT图解)
  • 从社交推荐到风控:社区检测算法在真实业务场景中的落地指南
  • 开发者在多模型间进行A B测试时Taotoken提供的便利
  • 手把手教你复现SonarQube未授权访问漏洞(CVE-2020-27986),附Python检测脚本
  • 如何解决游戏按键冲突?Hitboxer SOCD工具实战指南
  • AI专著生成大揭秘:实用AI工具推荐,快速产出20万字专业专著!
  • XGP存档提取完整指南:3分钟实现游戏进度跨平台迁移
  • 告别代码焦虑!HiOmics零代码平台,一键解锁单细胞转录组全流程分析
  • 如何快速搭建个人游戏串流服务器:Sunshine完整实战指南
  • 3步让老旧电视重生:MyTV-Android原生电视直播实战指南
  • 2026年亲测必备:5个免费高效技巧,3分钟降低AI率,论文降AI至10% - 降AI实验室
  • 3分钟零基础搭建微信智能助手:WechatBot终极免费方案
  • 深入理解Linux FrameBuffer:从`fb_var_screeninfo`的字段看屏幕时序与色彩格式
  • Degrees of Lewdity中文汉化终极指南:从零开始轻松畅玩中文版
  • Laravel Sanctum × AI身份联邦认证(2025新范式):实现用户意图→AI操作权限→模型输出脱敏的端到端零信任链
  • 新墨西哥州要求整改,Meta 或撤 Facebook、Instagram 和 WhatsApp
  • 3步搞定Linux笔记本风扇控制:NBFC-Linux终极指南
  • 手把手教你免费获取12.5米精度全球DEM数据(附SRTM数据下载与ArcGIS加载教程)
  • 别再让程序‘跑飞’了!手把手教你用STM32的IWDG和WWDG看门狗(附CubeMX配置)
  • 别再傻傻分不清了!程序员必须搞懂的UTC、GMT、CST和北京时间(附Linux/SparkSQL实战命令)
  • SoC FPGA在汽车雷达信号处理中的优势与实现
  • 天赐范式第28天:文心痴迷我们的技术已经到达什么程度了,已经多次把代码打到代码框外面来了,我不禁唏嘘感叹~至于吗,啊?至于吗~
  • 无人机飞手必看:如何用开源WebGIS工具避开禁飞区,规划更安全的巡检航线?
  • 探寻2026运动医学优质厂家,解锁行业新机遇,做得好的运动医学直销厂家推荐精选优质厂家 - 品牌推荐师