4. HSS与U-Boot移植基础

在 PolarFire SoC 的启动链中,HSS(Hart Software Services)是上电后最先运行的一段固件,它承担着多核调度、时钟与 DDR 初始化、以及把控制权交给 U-Boot 的职责。理解 HSS 与 U-Boot 的分工,是后续裁剪、定制和排障的基础。本节围绕“获取并配置 HSS 源码”和“配置 U-Boot for PolarFire SoC”两条主线展开,重点说明多核启动、时钟与 DDR 初始化职责,以及环境变量、启动脚本与网络/存储引导方式的设置方法。

一、HSS 的定位与源码获取

HSS 运行在 PolarFire SoC 的 E51 监控核上,属于裸机固件,通常以源码形式从官方仓库获取。它负责在 U54 应用核启动前完成底层硬件初始化,并提供服务调用接口。获取源码的典型流程如下:

git clone https://github.com/polarfire-soc/hart-software-services.git
cd hart-software-services
git checkout <与Libero设计匹配的tag>

源码目录中,src/ 存放核心逻辑,boards/ 存放板级配置,configs/ 存放不同板卡的默认配置。移植时首先要确认目标板卡对应的配置文件,例如 configs/mpfs_icicle_defconfig。该文件决定了 DDR 类型、时钟频率、串口、启动介质等关键参数。

二、多核启动、时钟与 DDR 初始化职责

HSS 的核心职责可以概括为三件事:多核启动管理、时钟初始化、DDR 初始化。上电后,E51 核首先执行 HSS,完成时钟树配置,使 CPU、总线、外设获得稳定时钟;随后初始化 DDR 控制器,完成内存训练与容量映射;最后根据启动模式,从 eNVM、eMMC、SD 卡或 QSPI 等介质加载 U-Boot 镜像,并唤醒 U54 核。U54 核被唤醒后,从 HSS 指定的入口地址开始执行 U-Boot 的 SPL 或主镜像。

多核启动的关键在于“谁先跑、谁等谁”。E51 负责监控与调度,U54 负责应用负载。HSS 通过 HSS_MMC_... 或 HSS_QSPI_... 等启动介质接口读取镜像,再通过 hss_uart 输出启动日志。若 DDR 训练失败,通常会在串口看到训练超时或容量异常,此时应检查 DDR 型号、频率与板级配置是否一致。

PolarFire SoC 启动链与 HSS 职责 上电复位 E51 核先运行 HSS 固件 时钟 / DDR / 多核调度 U-Boot SPL / 主镜像 Linux 内核 U54 应用核 HSS 内部职责 1. 时钟树配置 2. DDR 训练与映射 3. 唤醒 U54 核 U-Boot 职责 环境变量 / 启动脚本 网络 / 存储引导 加载内核与设备树 启动介质选择(HSS 根据启动模式读取镜像) eNVM QSPI Flash SD / eMMC 网络 TFTP UART 下载

三、配置 HSS 源码

HSS 的配置主要通过 defconfig 和板级头文件完成。以 Icicle 板为例,常用配置项包括:

  • CONFIG_SERVICE_MMC:启用 eMMC/SD 启动支持;
  • CONFIG_SERVICE_QSPI:启用 QSPI 启动支持;
  • CONFIG_DDR_TYPE:指定 DDR 类型(如 DDR4、LPDDR4);
  • CONFIG_DDR_FREQ:设置 DDR 工作频率;
  • CONFIG_UART_BAUD:设置串口波特率,通常为 115200。

修改配置后,使用 make 编译,生成 hss.bin 或 hss.elf。若 DDR 训练失败,可先降低频率或放宽时序参数,再逐步收紧。编译产物通常需要转换为可烧录格式,例如通过 hss-payload-generator 将 HSS 与 U-Boot 打包成 payload.bin,再写入启动介质。

四、配置 U-Boot for PolarFire SoC

U-Boot 的配置分为编译期配置和运行期环境变量两部分。编译期通过 defconfig 选择板卡支持,例如 mpfs_icicle_defconfig。运行期则通过环境变量控制启动行为。常用环境变量包括:

变量名 作用 示例值
bootcmd 默认启动命令 run distro_bootcmd
ipaddr 开发板 IP 地址 192.168.1.100
serverip TFTP 服务器地址 192.168.1.10
bootargs 内核启动参数 console=ttyS0,115200 root=/dev/mmcblk0p2
fdtfile 设备树文件名 mpfs-icicle-kit.dtb

设置环境变量后,使用 saveenv 写入持久存储。启动脚本通常放在 bootcmd 中,或通过 boot.scr 加载。网络引导时,U-Boot 通过 TFTP 从 serverip 拉取内核与设备树;存储引导时,则从 eMMC/SD 的指定分区读取。判断引导是否成功,可观察串口是否打印内核解压日志、设备树加载地址以及根文件系统挂载信息。

提示:HSS 与 U-Boot 的版本需要与 Libero 设计中的硬件配置匹配。若更换了 DDR 型号或时钟频率,必须同步更新 HSS 的板级配置,否则可能出现训练失败或启动卡死。
注意:修改 bootargs 中的 root= 参数时,要确保分区编号与实际存储布局一致。错误的根分区会导致内核恐慌(Kernel Panic),此时可通过串口进入 U-Boot 命令行,用 printenv 和 setenv 临时修正后再启动。

整体来看,HSS 负责“把硬件带起来”,U-Boot 负责“把系统引导起来”。移植时先确保 HSS 的时钟与 DDR 配置正确,再调整 U-Boot 的环境变量与启动脚本,最后根据实际介质选择网络或存储引导方式。掌握这条链路后,后续的内核裁剪、根文件系统构建和驱动调试才有稳定的起点。