2. Linux 系统工程开发环境搭建

Agilex SoC 的开发环境不是“装一个软件”就能完成的,而是由四条相互咬合的软件链组成:Quartus Prime 负责硬件工程与 HPS 配置导出,SoC EDS(或后续的 Ashling RiscFree / Arm DS)负责硬件到软件的交接与裸机/驱动调试,交叉编译工具链负责生成 ARM64 目标代码,Linux 源码与 Yocto/Buildroot 负责生成内核、设备树与根文件系统。四者之间通过版本号、器件系列和 HPS 配置信息强耦合,任何一环版本错位,都会在编译或启动阶段以难以定位的错误暴露出来。

四条软件链的职责与交接关系

理解环境搭建的关键,是先看清各工具之间的数据流向,而不是孤立地安装。下图给出本节的核心结构:Quartus 工程产出 .sof 与 HPS 配置信息,SoC EDS 的 embedded_command_shell.sh 提供 hps_config、bsp-editor、quartus_hps 等工具,把硬件信息转换为 U-Boot 设备树、preloader 和启动镜像;交叉工具链则被 U-Boot、内核和应用程序共同调用。

Agilex SoC Linux 开发环境四条软件链与交接关系 Quartus Prime Pro 器件:Agilex AGF/AGI 产出:.sof / .rbf HPS 配置:DDR、时钟、外设 导出:.qsys / .sopcinfo SoC EDS / RiscFree embedded_command_shell bsp-editor / hps_config quartus_hps / arm-ds 生成 preloader + dtb 交叉编译工具链 aarch64-linux-gnu- gcc / ld / objcopy glibc 或 musl 版本需与内核匹配 Linux 内核与根文件系统 linux-socfpga 分支 Yocto / Buildroot Image + dtb + rootfs SD 卡启动镜像 Agilex SoC 目标板 HPS + FPGA 融合 SDM 配置引脚 UART / JTAG / SD 启动:preloader→U-Boot .sopcinfo 调用 dtb / preloader 烧写/启动 编译内核/应用 版本匹配要点(示例,需以官方发布说明为准) • Quartus 版本决定可用器件与 HPS 配置项,SoC EDS 版本必须与 Quartus 同代(如 23.x 对应 23.x)。 • 工具链 ABI 必须与内核和 rootfs 一致:glibc 工具链配 glibc rootfs,musl 工具链配 musl rootfs。 • 内核分支(linux-socfpga)与 U-Boot 分支需与 SoC EDS 提供的 preloader 头文件版本对齐,否则设备树节点不匹配。

安装顺序与关键配置

推荐按“Quartus → SoC EDS → 工具链 → Linux 源码”的顺序安装,因为后一步依赖前一步的产物。Quartus Prime Pro 安装时需勾选 Agilex 器件支持包,安装完成后确认 quartus_sh --version 输出与下载版本一致。SoC EDS 安装后,必须通过 embedded_command_shell.sh 进入其环境,而不是直接使用系统 shell,否则 bsp-editor、hps_config 等命令会找不到。

# 进入 SoC EDS 环境(示例路径)
~/intelFPGA_pro/23.4/embedded/embedded_command_shell.sh

# 确认工具可用
which bsp-editor
which quartus_hps
aarch64-linux-gnu-gcc --version

交叉工具链建议优先使用 SoC EDS 自带的 aarch64-linux-gnu,或使用 Yocto 生成的 SDK 安装脚本。若自行下载 Linaro 工具链,必须核对 glibc 版本与 rootfs 一致。一个常见错误是:用 glibc 2.35 的工具链编译,却把二进制放进 glibc 2.31 的 rootfs,运行时报 GLIBC_2.34 not found。

从硬件工程到启动镜像的交接

Quartus 工程编译完成后,在 Platform Designer 中打开 HPS 组件,配置 DDR 型号、时钟频率、外设使能(UART、SD/MMC、Ethernet、USB 等),然后生成 .sopcinfo。接着在 SoC EDS 环境中执行 bsp-editor,导入 .sopcinfo,选择启动方式(SD/MMC 或 QSPI),生成 U-Boot 设备树和 preloader 源码。这一步的实质是把硬件描述翻译成软件可读的设备树节点。

# 生成 preloader 与设备树(示例)
bsp-editor
# 在 GUI 中:File → New BSP → 选择 .sopcinfo → 设置启动器件
# 生成后进入 software/uboot-socfpga 目录
make
# 产出:u-boot-with-spl.sfp、socfpga_agilex_socdk.dtb

内核编译时,ARCH=arm64、CROSS_COMPILE=aarch64-linux-gnu- 必须与工具链前缀一致。设备树使用上一步生成的 .dtb,或使用内核源码中对应开发板的 dts 并叠加 HPS 配置。最终把 u-boot-with-spl.sfp、Image、.dtb 和 rootfs 按分区写入 SD 卡。

版本匹配的检查清单

检查项判断方法不匹配的典型现象
Quartus 与 SoC EDS 同代对比安装目录版本号bsp-editor 无法识别 .sopcinfo
工具链 ABI 与 rootfs 一致readelf -l 查看 interpreterGLIBC 版本找不到
内核分支与 preloader 对齐检查 dts 中 compatible 字符串串口无输出、DDR 初始化失败
U-Boot 与内核设备树一致对比 dtb 与内核 dts外设 probe 失败
建议在环境搭建完成后,先用 quartus_hps -c 1 -o P 读取 HPS 状态,再通过串口确认 preloader 和 U-Boot 的版本打印,最后启动内核并检查 dmesg 中 HPS 外设是否全部 probe 成功。这三步能快速定位是硬件配置、启动链还是内核配置的问题。

环境搭建的本质是让四条软件链在版本和接口上对齐。只要 Quartus、SoC EDS、工具链和 Linux 源码四者的版本关系清晰,后续的驱动开发、应用部署和调试才有稳定的基础。