Zephyr 在 BeagleV-Fire(Microchip PolarFire MPFS025T)上的构建、调试与烧录实战指南
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
BeagleV®-Fire 是 BeagleBoard 推出的一款基于 Microchip PolarFire® MPFS025T 5 核 RISC-V SoC(内含 FPGA fabric)的单板计算机(SBC)。本文以 Zephyr 仓库中 boards/beagle/beaglev_fire/doc/index.rst 为骨架,结合该板卡的设备树、defconfig 与 SoC Kconfig 源码,完整讲解 BeagleV-Fire 的三种 Zephyr 板卡配置、west build构建流程、OpenOCD + GDB 调试、以及基于 Hart Software Services(HSS)的镜像生成与usbdmsc烧录全流程。读完本文,你将能够独立完成从源码构建到上板运行的全链路操作。
硬件概览:RISC-V 五核 + FPGA 的融合平台
BeagleV-Fire 的核心是 Microchip 的 PolarFire MPFS025T SoC,包含 5 个 RISC-V 核心(1 个 E51 监控核 + 4 个 U54 应用核),并集成了可编程 FPGA fabric。它在 Zephyr 中被定义为 arch 为riscv、type 为mcu的板卡(见 beaglev_fire_polarfire_u54.yaml),vendor 为beagle。
这块板子继承了 BeagleBone Black 的 P8/P9 cape 排针引脚定义,可以直接叠放 BeagleBone 生态的 cape 扩展板,加上 RISC-V ISA 与 FPGA 的可重构能力,非常适合嵌入式开发者、开源硬件爱好者和研究者做异构计算、自定义外设与低功耗原型验证。
从 beaglev_fire_common.dtsi 可以看到板级的核心设备树配置:
compatible = "beagle,beaglev-fire", "microchip,mpfs",并 include 了 SoC 级设备树microchip/mpfs.dtsi;- 控制台与 shell 均指向
uart0(chosen节点),波特率 115200,时钟 150 MHz; - 定义了 2GB 的高位 DDR 内存区
ddr_cached_high(地址0x1000000000,大小0x80000000),并作为zephyr,sram使用; - 默认使能了
gpio2。
支持的板卡配置与三种运行形态
BeagleV-Fire 在 Zephyr 中提供了三个 board configuration,分别对应 PolarFire SoC 上不同 hart(核心)的使用策略:
| 配置标识 | 用途 | 对应 defconfig |
|---|---|---|
beaglev_fire/polarfire/e51 | 仅使用 E51 监控核心 | beaglev_fire_polarfire_e51_defconfig |
beaglev_fire/polarfire/u54 | 使用 U54 应用核心 | beaglev_fire_polarfire_u54_defconfig |
beaglev_fire/polarfire/u54/smp | 使用 U54 核心并开启CONFIG_SMP=y | beaglev_fire_polarfire_u54_smp_defconfig |
这些配置在 Kconfig.beaglev_fire 中通过BOARD_BEAGLEV_FIRE统一入口,按所选变体分别select SOC_POLARFIRE_U54或SOC_POLARFIRE_E51,对应的 SoC 定义位于 soc/microchip/miv/polarfire/Kconfig.soc。
设备树层面,三种配置通过禁用/启用 CPU 节点来体现核心差异:
- E51 形态(beaglev_fire_polarfire_e51.dts):禁用
cpu@1~cpu@4(4 个 U54),只保留 E51; - U54 形态(beaglev_fire_polarfire_u54.dts):禁用
cpu@0(E51),仅启用 4 个 U54; - U54 SMP 形态(beaglev_fire_polarfire_u54_smp.dts):直接 include U54 的设备树,并在 defconfig 中追加
CONFIG_SMP=y启用多核调度。
三种 defconfig 的共同基础配置包括:
CONFIG_MPFS_HAL=n CONFIG_BASE64=y CONFIG_INCLUDE_RESET_VECTOR=y CONFIG_CONSOLE=y CONFIG_SERIAL=y CONFIG_UART_CONSOLE=y CONFIG_XIP=n CONFIG_INIT_STACKS=y CONFIG_SYS_CLOCK_TICKS_PER_SEC=1000差异点值得注意:
- U54 与 U54 SMP 额外设置了
CONFIG_RV_BOOT_HART=1(指定 U54_1 为启动 hart,与后续 HSS payload 中的owner-hart: u54_1对应)、CONFIG_RISCV_CMODEL_MEDANY=y(RISC-V 中等任意代码模型,适配高位 DDR 地址空间); - U54 单核形态显式设置
CONFIG_MP_MAX_NUM_CPUS=1; - U54 SMP 形态开启
CONFIG_SMP=y,由 Zephyr 调度器接管 4 个 U54 核心。
构建应用
使用west build构建 BeagleV-Fire 的应用与 Zephyr 其他板卡完全一致,只需指定对应的 board 标识。例如构建samples/hello_world到 U54 配置:
west build -b beaglev_fire/polarfire/u54 samples/hello_world将-b后面的板卡标识替换为beaglev_fire/polarfire/e51或beaglev_fire/polarfire/u54/smp,即可切换三种形态。构建产物(ELF 文件)后续既用于 GDB 加载调试,也用于 HSS payload 镜像生成。
调试:OpenOCD + GDB 完整流程
在把应用真正烧进板卡之前,通常先通过调试器加载运行。官方推荐的调试链路是OpenOCD(带 RISC-V 支持) + RISC-V GDB + Microchip FlashPro5/6 调试器。
1. 准备调试工具
- OpenOCD 与 RISC-V GDB:可以随 Microchip SoftConsole SDK 一起获取,安装后通常位于
<softconsole_path>/openocd/下; - 调试器:Microchip FlashPro5/6;
- 串口:使用 3.3V USB 转 UART 桥接器连接 BeagleV-Fire 的 UART 调试口。
2. 连接 UART 并中断 HSS 启动
在终端中打开 UART 调试口:
tio <port>连接成功后按下板卡上的 Reset 按钮,终端会显示一个启动进度条(见下图)。看到进度条后,立刻按下任意键(0-9 或 a-z),即可中断 Hart Software Services(HSS)加载 payload 的过程,进入 HSS CLI。
3. 启动 OpenOCD
在另一个终端中,使用 SoftConsole 自带的 OpenOCD 连接板卡:
<softconsole_path>/openocd/bin/openocd --command "set DEVICE MPFS" --file \ <softconsole_path>/openocd/share/openocd/scripts/board/microsemi-riscv.cfgset DEVICE MPFS指定目标设备为 PolarFire MPFS 系列,microsemi-riscv.cfg是该 SoC 的 OpenOCD 板级脚本。保持此终端持续运行。
4. 用 GDB 上传并调试
推荐使用 Zephyr SDK 自带的 RISC-V GDB。启动 GDB:
<path_to_zephyr_sdk>/riscv64-zephyr-elf/bin/riscv64-zephyr-elf-gdb然后在 GDB 命令行中依次执行以下命令连接设备并加载二进制:
set arch riscv:rv64 set mem inaccessible-by-default off file <path_to_zephyr.elf> target extended-remote localhost:3333 load break main continue要点说明:
set arch riscv:rv64:显式指定 64 位 RISC-V 架构;set mem inaccessible-by-default off:避免 GDB 因访问不可达内存而中断,适配 PolarFire 的内存映射;target extended-remote localhost:3333:连接本地 OpenOCD 的 GDB 服务端口(默认 3333);load将 ELF 加载到板卡内存,随后break main+continue即可在main处停下调试。
烧录:HSS payload 生成与 usbdmsc 方式
当 Zephyr 与 PolarFire 的 Hart Software Services(HSS)配合使用时,不能直接把 ELF 当作启动镜像,而需要用 HSS 提供的hss-payload-generator工具生成 HSS 可以引导的 payload 镜像。
1. 编写 payload 配置文件
创建一个 YAML 配置文件,描述每个 hart 的入口地址与要加载的 payload:
set-name: 'ZephyrImage' # Define the entry point address for each hart (U54 cores) hart-entry-points: u54_1: '0x1000000000' # Define the payloads (ELF binaries or raw blobs) payloads: <path_to_zephyr.elf>: exec-addr: '0x1000000000' # Where Zephyr should be loaded owner-hart: u54_1 # Primary hart that runs Zephyr priv-mode: prv_m # Start in Machine mode skip-opensbi: true # Boot directly without OpenSBI关键字段含义:
exec-addr: '0x1000000000':Zephyr 的加载地址,即上文设备树中ddr_cached_high2GB DDR 的起始地址;owner-hart: u54_1:指定由 U54_1 核心运行 Zephyr,与 defconfig 中的CONFIG_RV_BOOT_HART=1保持一致;priv-mode: prv_m:以 Machine 模式启动(不经过 S 态/OS 层);skip-opensbi: true:直接引导,不经过 OpenSBI。
2. 进入 HSS CLI 并切换 boot source
生成镜像后,重启通过 USB 与 UART 连接的板卡,在 HSS 引导时按键中断,然后依次执行mmc与usbdmsc命令。典型交互输出如下:
Press a key to enter CLI, ESC to skip Timeout in 1 second .[6.304162] Character 100 pressed [6.308415] Type HELP for list of commands [6.313276] >> mmc [10.450867] Selecting SDCARD/MMC (fallback) as boot source ... [10.457550] Attempting to select eMMC ... Passed [10.712708] >> usbdmsc [14.732841] initialize MMC [14.736400] Attempting to select eMMC ... Passed [15.168707] MMC - 512 byte pages, 512 byte blocks, 30621696 pages Waiting for USB Host to connect... (CTRL-C to quit) . 0 bytes written, 0 bytes read USB Host connected. Waiting for disconnect... (CTRL-C to quit) / 0 bytes written, 219136 bytes readmmc:将 eMMC/SD 卡设为 boot source;usbdmsc:把板卡的 eMMC 以 USB 大容量存储(Mass Storage)设备的形式暴露给主机,此时主机端会看到一个新的磁盘设备。
3. 用 dd 写入镜像
当板卡以 USB 存储设备出现后,即可用dd(或 BalenaEtcher 等工具)将生成的镜像写入对应磁盘:
dd if=<path_to_zephyr.elf> of=/dev/sdXD bs=4M status=progress oflag=sync注意of=/dev/sdXD中的sdXD需要替换为板卡在主机上实际映射的设备节点,写入前务必确认,避免误写其他磁盘。oflag=sync确保数据落盘后再断开。
小结
BeagleV-Fire 是 Zephyr 官方支持的一块集 RISC-V 多核与 FPGA 于一体的开发板,仓库内提供了 E51、U54、U54 SMP 三种板卡配置,分别通过设备树中 CPU 节点的启停与 defconfig 中的CONFIG_SMP、CONFIG_RV_BOOT_HART等开关来切换运行形态。调试与烧录链路清晰:OpenOCD + GDB 负责在线调试,HSS +hss-payload-generator负责生成可引导镜像,mmc+usbdmsc+dd负责写入 eMMC。开发者可结合 设备树 与 defconfig 按需裁剪,快速在 RISC-V + FPGA 平台上开展原型开发。
【免费下载链接】zephyrPrimary Git Repository for the Zephyr Project. Zephyr is a new generation, scalable, optimized, secure RTOS for multiple hardware architectures.项目地址: https://gitcode.com/GitHub_Trending/ze/zephyr
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考