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

保姆级教程:在Ubuntu 22.04上为Firefly RK3399编译带TPL/SPL的U-Boot 2023.07

深度实战:在Ubuntu 22.04上为Firefly RK3399构建定制化U-Boot全流程

当开发者拿到一块Firefly RK3399开发板时,官方预编译的U-Boot镜像虽然开箱即用,但往往无法满足深度定制需求。本文将完整演示从工具链配置到最终烧录的全过程,特别针对TPL/SPL启动方式这一RK3399的特色机制进行详细剖析。不同于常规教程只展示成功路径,我们会重点分析可能遇到的依赖问题和编译错误解决方案。

1. 环境准备与工具链配置

在开始编译之前,需要确保Ubuntu 22.04系统已安装基本开发工具。以下命令将安装编译所需的底层依赖:

sudo apt update && sudo apt install -y build-essential bison flex \ libssl-dev libncurses5-dev python3-dev swig python3-pip

Arm架构的交叉编译工具链选择直接影响最终生成的固件质量。推荐使用Arm官方维护的GNU Toolchain 13.2版本,其优势在于:

  • 对Cortex-A72/A53架构的优化支持
  • 包含最新的安全补丁
  • 提供完整的调试工具链

下载并配置工具链的具体步骤:

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 /opt

永久性添加环境变量到~/.bashrc文件末尾:

echo 'export PATH="/opt/arm-gnu-toolchain-13.2.rel1-x86_64-aarch64-none-linux-gnu/bin:$PATH"' >> ~/.bashrc source ~/.bashrc

验证安装是否成功:

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

预期应看到类似输出:

aarch64-none-linux-gnu-gcc (Arm GNU Toolchain 13.2.rel1) 13.2.0

2. U-Boot源码获取与基础配置

Rockchip平台的U-Boot有其特殊性,需要特别注意版本兼容性。2023.07版本对RK3399的支持较为完善:

wget https://ftp.denx.de/pub/u-boot/u-boot-2023.07.tar.bz2 tar -xjf u-boot-2023.07.tar.bz2 cd u-boot-2023.07

应用Firefly官方提供的默认配置:

make firefly-rk3399_defconfig

进入菜单配置界面进行关键参数调整:

make menuconfig

需要特别关注的配置项:

配置路径推荐值作用说明
Boot options → Autoboot options5秒设置自动启动延迟时间
Device Drivers → Serial → Default baudrate1500000匹配RK3399调试串口速率
Boot images → .its file generator scriptarch/arm/mach-rockchip/make_fit_atf.py指定FIT镜像生成脚本

提示:在menuconfig界面中,使用/键可以快速搜索配置项。保存配置时建议使用mv .config my_rk3399_defconfig备份配置文件。

3. 获取ARM可信固件(ATF)

RK3399采用TrustZone技术,需要ARM Trusted Firmware提供安全环境。虽然可以自行编译ATF获取bl31.elf,但更推荐使用Rockchip官方预编译版本:

git clone --depth 1 https://github.com/rockchip-linux/rkbin.git cp rkbin/bin/rk33/rk3399_bl31_v1.36.elf ./bl31.elf

自行编译ATF的备选方案(需额外工具链):

sudo apt install gcc-arm-none-eabi git clone --depth 1 https://github.com/ARM-software/arm-trusted-firmware.git cd arm-trusted-firmware make PLAT=rk3399

编译成功后可在build/rk3399/release目录找到bl31.elf。

4. 解决编译过程中的典型问题

U-Boot编译过程可能遇到多种环境问题,以下是常见错误及解决方案:

问题1:Python模块缺失

ModuleNotFoundError: No module named 'setuptools'

解决方案:

sudo apt install python3-setuptools python3-pip pip3 install pyelftools

问题2:SWIG工具缺失

unable to execute 'swig': No such file or directory

解决方案:

sudo apt install swig

问题3:头文件缺失

fatal error: Python.h: No such file or directory

解决方案:

sudo apt install python3-dev

问题4:文件权限问题

make: *** No rule to make target 'include/config/auto.conf'

解决方案:

chmod 755 scripts/* && chmod 755 include/config

完整编译命令:

make ARCH=arm CROSS_COMPILE=aarch64-none-linux-gnu- -j$(nproc)

成功编译后将生成以下关键文件:

  • tpl/u-boot-tpl.bin:初始引导加载程序
  • spl/u-boot-spl.bin:二级程序加载器
  • u-boot.bin:主U-Boot镜像

5. 构建启动镜像文件

RK3399采用独特的启动流程:BootROM → TPL → SPL → U-Boot。需要生成特殊的镜像组合:

生成idbloader.img

tools/mkimage -n rk3399 -T rksd -d tpl/u-boot-tpl.bin idbloader.img cat spl/u-boot-spl.bin >> idbloader.img

参数说明:

  • -n rk3399:指定芯片型号
  • -T rksd:设置Rockchip SD卡启动格式
  • -d:指定输入文件

生成FIT镜像

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

该命令将生成包含U-Boot和ATF的u-boot.itb文件。可以通过以下命令验证镜像完整性:

tools/mkimage -l u-boot.itb

6. 烧录到开发板

Firefly RK3399支持多种烧录方式,推荐使用Rockchip官方工具进行烧录:

  1. 进入Loader模式:

    • 断开开发板电源
    • 按住Recovery键不放
    • 连接USB OTG接口到PC
    • 保持按键按住状态通电
  2. 使用rkdeveloptool命令行工具烧录:

sudo apt install libusb-1.0-0-dev git clone https://github.com/rockchip-linux/rkdeveloptool.git cd rkdeveloptool && autoreconf -i && ./configure && make sudo ./rkdeveloptool db rkbin/rk33/rk3399_loader_v1.24.126.bin sudo ./rkdeveloptool wl 0x40 idbloader.img sudo ./rkdeveloptool wl 0x4000 u-boot.itb sudo ./rkdeveloptool rd

注意:扇区偏移量(0x40和0x4000)是RK3399的固定要求,不可更改。如果使用eMMC存储,建议先擦除原有内容:

sudo ./rkdeveloptool ef

作为质量检查,成功烧录后串口输出应该包含类似信息:

U-Boot TPL 2023.07 (Sep 01 2023 - 15:30:45) Channel 0: LPDDR4, 50MHz BW=32 Col=10 Bk=8 CS0 Row=16 CS1 Row=16 CS=2 Die BW=16 Size=2048MB

7. 高级调试技巧

当U-Boot无法正常启动时,可以尝试以下调试方法:

1. 启用详细日志在menuconfig中开启:

Boot options → [*] Enable verbose U-Boot console Device Drivers → Serial → [*] Debug UART

2. 使用JTAG调试OpenOCD配置示例:

source [find interface/jlink.cfg] transport select jtag set _CHIPNAME rk3399 jtag newtap $_CHIPNAME cpu -irlen 4 -ircapture 0x1 -irmask 0xf -expected-id 0x10001fff

3. 关键信号测量点

测试点正常值测量工具
PMIC_VDD_CPU0.9V万用表
DDR_VREF0.75V示波器
CLK_DDR800MHz频谱仪

4. 常见故障代码对照表

错误代码可能原因解决方案
TPL无输出电源异常检查PMIC配置
SPL卡住DDR初始化失败验证DRAM参数
U-Boot崩溃镜像损坏重新烧录

在实际项目中,我发现最常出现的问题是DDR初始化失败。通过调整include/configs/rk3399_common.h中的CONFIG_ROCKCHIP_SDRAM_COMMON相关参数,可以优化内存稳定性。另一个实用技巧是在spl/u-boot-spl.lds中增加调试符号,便于分析启动流程。

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

相关文章:

  • 李辉《曾国藩日记》笔记:天气太热,该上奏的事情都放着没起草
  • Windows on Arm原生编译实践与LLVM 12优化指南
  • 2025届必备的六大AI写作工具实测分析
  • 3分钟学会微信好友检测:一键找出删掉你的“单向好友“
  • Visual Studio 主题字体与快捷键:十年老架构师的深度定制开发环境
  • HEX框架:大语言模型推理效率的革命性提升
  • Astron-RPA:当RPA融合大模型,开启智能流程自动化新范式
  • 终极免费文档下载指南:如何一键下载30+文库平台的文档
  • 2026空调冷媒传感器技术解析:SEN68多合一环境传感器、SEN69C多合一环境传感器、SFA40甲醛传感器选择指南 - 优质品牌商家
  • 2026届最火的AI写作方案横评
  • 【Python专项】进阶语法-日志分类与分析(2)
  • 大语言模型驱动下的自动化代码漏洞检测工具,大语言模型驱动下的自动化代码漏洞检测:从实验到落地,我们离“AI安全审计师”还有多远?
  • 2026年CISP认证备考全攻略(非常详细)零基础入门到精通,收藏这一篇就够了
  • FPGA视频拼接项目资源优化实战:在Kintex7上如何用纯Verilog搞定16路画面
  • Dify多租户配置避坑手册:为什么87%的团队在APP_ENV=production时意外启用共享缓存?
  • 成都GEO优化公司怎么选?技术+本土双轮驱动,橙鱼传媒凭硬核实力领跑AI搜索赛道 - TOP10品牌推荐榜单
  • Ubuntu Frame:嵌入式系统的安全显示服务器解决方案
  • DODAF架构方法论
  • 安卓13平板桌面定制:手把手教你修改Launcher3源码,实现搜索框居中与任务栏隐藏
  • 效率飙升:用快马ai自动生成数据库运维脚本,释放navicat未能实现的潜能
  • 基于助睿数智(Uniplore)平台的 ETL 入门实验报告
  • hexo 上传到github命令报错
  • 【最新猿人学】 js 混淆 - 回溯 扣代码,补环境
  • AI时代,社交能力是走向优秀的软实力
  • 视频内容感知缓存技术WorldCache原理与实践
  • GoPaw:Go语言高性能网络抓包库的架构解析与实战应用
  • 法法【牛客tracker 每日一题】
  • MPC与漏斗控制结合:优化与鲁棒性的平衡
  • 量化金融工具箱:从数据清洗到策略回测的完整解决方案
  • 思维导图拆解项目范围 3 个真实落地案例