跳到主要内容 Stratix 10 SOC U-Boot 与 ATF 编译构建教程 | 极客日志
C
Stratix 10 SOC U-Boot 与 ATF 编译构建教程 介绍 Stratix 10 SOC 开发中,通过开源 U-Boot 和 Arm Trusted Firmware (ATF) 替代 EDA 工具生成 FSBL,实现多板适配。内容涵盖环境准备(Quartus Prime Pro, Ubuntu/WSL)、交叉编译工具链配置、ATF 编译生成 bl31.bin、U-Boot 编译集成 ATF 镜像、以及将 SPL 转换为 HEX 格式以打包 HPS SOF 文件用于 JTAG 加载的全过程。解决了 WSL 时间同步导致的编译警告及缺少外部 Blob 文件的错误。
静心 发布于 2026/4/6 更新于 2026/4/18 4 浏览一、前言
上节介绍了 Stratix 10 SOC 的 Boot 机制,提出了 Boot 方式的选择方法、系统架构设计建议及软件开发调试所需文件依赖。
GHRD (Golden Hardware Reference Design) 工程自定义设计的开发调试通过 JTAG 加载实现,需要软件生成 JTAG 加载所需的文件。之前通过 Quartus 工具综合 + 实现已生成 sof 文件,这里还需要 HPS FSBL 文件,然后将 sof 文件和 HPS FSBL 文件打包成 HPS SOF 文件,用于 JTAG 加载启动。
由上图可知,需要通过 HPS Bootloader 源码编译生成 HPS FSBL 文件。这与之前的 FPGA 器件通过 Quartus 工具的 BSP Generator 生成 FSBL 的方式不同,优势在于:之前的生成 FSBL 方式需要依托于 EDA 工具高度定制,每板需要一个镜像;而 Stratix 10 和 Agilex 器件使用开源的 U-Boot 源码,一个镜像可以适配多个板。
接下来展示 HPS FSBL 的编译过程,编译过程中会遇到一些问题,一起来解决。
二、准备
1. EDA 工具 Quartus Prime Pro 25.1(或其他版本,建议 25.1 以上)
2. Linux 操作系统
3. Windows 操作系统 建议 Windows 11 安装 WSL,具体搭建方式请参考相关文档。
三、U-Boot 编译
1. U-Boot Build 流程 具体请参考 RocketBoards 官方文档,大致流程如下:
2. 下载 U-Boot 源码
3. 设置交叉编译工具链 wget https://developer.arm.com/-/media/Files/downloads/gnu/11.2-2022.02/binrel/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
tar xf gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
rm -f gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu.tar.xz
export PATH=`pwd `/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH
注意此时 aarch64-none-linux-gnu 安装在 linux 根目录下。
4. 配置环境变量 解压后切换到 U-Boot 源码路径,并设置编译工具链环境变量:
cd /mnt/g/Stratix10_uboot/u-boot-socfpga-socfpga_v2025.07/
export PATH=/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-none-linux-gnu-
5. 配置 Stratix 10 通用 defconfig make socfpga_stratix10_defconfig
该命令将 ./configs/socfpga_stratix10_defconfig 文件内的配置信息刷到 U-Boot 根目录下的 generated_defconfig 文件。
6. 编译 U-Boot
7. 处理依赖缺失 编译过程可能会提示没有 gcc 或者 python 等依赖,使用以下命令安装:
sudo apt update
sudo apt install build-essential
sudo apt install python3
8. 处理时间同步警告 编译过程出现 make[1]: warning: Clock skew detected. Your build may be incomplete,是因为 Makefile 的修改时间大于系统的当前时间,这里是 WSL 系统时间同步问题。
查询 WSL 系统的当前时间,可能比 Windows 系统时间慢。安装后台同步时间的服务 chrony:
sudo apt update
sudo apt install chrony
sudo systemctl status chrony
再次查询 WSL 系统的当前时间,应与 Windows 系统时间相同。
9. 处理缺少外部 Blob 错误 重新编译 U-Boot 后,报错提示:Image 'u-boot' is missing external blobs and is non-functional: blob-ext 或 bl31.bin。
出现该错误的原因是 U-Boot 编译需要 ATF 支持,但缺少关键的二进制 blob 文件 (bl31.bin)。bl31.bin 是 ATF 的 Stage 3-1 镜像,负责提供安全监控调用 (SMC)、PSCI 电源管理等服务。U-Boot 的 FIT 镜像在 build 时需要把 bl31.bin 打包进去,但找不到该文件,故 Binman 报错并中止编译。
四、ATF 编译
1. 下载 ATF 源码
2. 设置环境变量 解压后切换到 ATF 源码路径,设置编译工具链环境变量,并检查交叉编译工具链是否 ok:
cd /mnt/g/Stratix10_uboot/arm-trusted-firmware-socfpga_v2.13.0/
export PATH=/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-none-linux-gnu-
aarch64-none-linux-gnu-gcc --version
3. 编译 ATF make PLAT=stratix10 clean
make PLAT=stratix10 all
4. 确认输出文件 在 ./build/stratix10/release 路径下成功编译 bl2.bin, bl31.bin。
五、U-Boot & bl31.bin 编译
1. 复制 bl31.bin 切换到 U-Boot 源码路径,把刚才编译好的 bl31.bin 复制到 U-Boot 根目录:
cp /mnt/g/Stratix10_uboot/arm-trusted-firmware-socfpga_v2.13.0/build/stratix10/release/bl31.bin .
2. 重新编译 U-Boot PATH=/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin:$PATH
export CROSS_COMPILE=aarch64-none-linux-gnu-
aarch64-none-linux-gnu-gcc --version
make distclean
make -j
3. 确认编译结果 在 spl/ 路径下生成 u-boot-spl.bin, u-boot-spl-dtb.bin 和 u-boot-spl-dtb.hex 文件,最后 OFCHK .config 检查配置并正常退出,说明 U-Boot 编译成功。
4. 验证 FIT 镜像 使用以下命令查看,U-Boot 根目录下 FIT 镜像 u-boot.itb 是否包含 bl31.bin 和 u-boot:
./tools/dumpimage -l u-boot.itb
Image 1 (atf) 子镜像就是 bl31.bin,说明 bl31.bin 已打包 ok。
5. 生成的文件说明
U-Boot 根目录下 :
u-boot 文件:ELF 格式,主要用于开发调试。
u-boot.itb 文件:FIT 格式,封装了内核、设备树等,主要用于固化部署,即 HPS SSBL 文件。
spl/路径下 :
u-boot-spl.bin:即 HPS FSBL 文件,该 BIN 格式文件用于烧录到 flash。
6. HPS Boot 流程回顾 Stratix 10 SoC 中 HPS 的 Boot 流程(简化版,省掉 FPGA 配置):
Power On。
SDM 先加载 HPS EMIF IO,再加载 HPS FSBL (u-boot-spl.bin) 到 HPS 的片上 RAM 的 0x00000000 地址,最后释放 HPS 的复位。
HPS 执行 FSBL(初始化 DRAM、时钟、外设等),再从启动介质加载 SSBL (u-boot.itb) 到 HPS 侧 DRAM。
HPS 跳转执行 SSBL。
SSBL 加载 Linux Kernel/Application。
7. SPL 源码分析 SPL 源码中有详细的 FSBL 初始化流程(SPL 源码绝对路径:./arch/arm/mach-socfpga/spl_s10.c),请参考已注释的 SPL 源码:
#include <hang.h>
#include <init.h>
#include <log.h>
#include <asm/global_data.h>
#include <asm/io.h>
#include <asm/utils.h>
#include <debug_uart.h>
#include <image.h>
#include <spl.h>
#include <asm/arch/clock_manager.h>
#include <asm/arch/firewall.h>
#include <asm/arch/mailbox_s10.h>
#include <asm/arch/misc.h>
#include <asm/arch/reset_manager.h>
#include <asm/arch/smmu_s10.h>
#include <asm/arch/system_manager.h>
#include <wdt.h>
#include <dm/uclass.h>
DECLARE_GLOBAL_DATA_PTR;
void board_init_f (ulong dummy)
{
const struct cm_config *cm_default_cfg = cm_get_default_config();
int ret;
struct udevice *dev ;
ret = spl_early_init();
if (ret)
hang();
socfpga_get_managers_addr();
writel(SYSMGR_WDDBG_PAUSE_ALL_CPU, socfpga_get_sysmgr_addr() + SYSMGR_SOC64_WDDBG);
if (CONFIG_IS_ENABLED(WDT))
initr_watchdog();
writeq(0 , CPU_RELEASE_ADDR);
socfpga_per_reset(SOCFPGA_RESET(OSC1TIMER0), 0 );
timer_init();
mbox_init();
mbox_hps_stage_notify(HPS_EXECUTION_STATE_FSBL);
sysmgr_pinmux_init();
cm_basic_init(cm_default_cfg);
#ifdef CONFIG_DEBUG_UART
socfpga_per_reset(SOCFPGA_RESET(UART0), 0 );
debug_uart_init();
#endif
preloader_console_init();
print_reset_info();
cm_print_clock_quick_summary();
ret = uclass_get_device_by_name(UCLASS_NOP, "socfpga-secreg" , &dev);
if (ret) {
printf ("Firewall & secure settings init failed: %d\n" , ret);
hang();
}
#if CONFIG_IS_ENABLED(ALTERA_SDRAM)
ret = uclass_get_device(UCLASS_RAM, 0 , &dev);
if (ret) {
debug("DRAM init failed: %d\n" , ret);
hang();
}
#endif
#ifdef CONFIG_CADENCE_QSPI
mbox_qspi_open();
#endif
}
8. 转换 FSBL 为 HEX 格式 前言中用于 JTAG 加载启动的 HPS SOF 文件,是由 sof 文件和 HPS FSBL Hex 文件打包生成的,而 U-Boot 编译生成的 HPS FSBL (u-boot-spl.bin) 文件不能直接用于打包,需要用 ELF 格式的 u-boot-spl 文件转换出 HEX 格式的 u-boot-spl.hex。
9. 执行转换命令 aarch64-none-linux-gnu-objcopy -O ihex spl/u-boot-spl spl/u-boot-spl.hex
10. 完成打包 查看已生成 HPS FSBL HEX 文件,接下来就可以打包 HPS SOF 文件,再用 JTAG 加载启动了。
微信扫一扫,关注极客日志 微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
相关免费在线工具 Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
JSON美化和格式化 将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online