coreboot 在 SiFive HiFive Unleashed 开发板上的移植、引导模式与固件烧录实战指南
固件嵌入式操作系统驱动开发【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载导读本文基于 coreboot 仓库中 SiFive HiFive Unleashed 主板的官方文档与移植代码完整讲解这块「首个足以运行多用户操作系统的 RISC-V 开发板」上 coreboot 的移植结构、MSEL 引导模式配置以及通过板内 Linux、USB/JTAGOpenOCD和外部 SPI 编程器三种途径烧写 32 MiB SPI Flash 的完整流程。读完本文你将掌握 HiFive Unleashed 上 coreboot 固件从构建、选择引导模式到烧录排错的端到端实战技能。HiFive Unleashed 与 FU540 平台概览SiFive HiFive Unleashed 是市场上首批资源足以承载多用户操作系统的 RISC-V 开发板原文表述为 the first RISC-V board on the market with enough resources to run a multiuser operating system。其核心是 SiFive FU540 SoC从 coreboot 的设备树描述fu540-c000.dtsi可以看到典型配置1 个 E51 管理核心rv64imacstatus disabled作为 boot ROM 中的引导核心4 个 U54 应用核心rv64imafdc支持 Sv39 MMU对应 Kconfig 中MAX_CPUS 5的设定板载 8 GiB DDR4memory80000000reg 0x0 0x80000000 0x2 0x00000000两个 UART、一个 I2C、三个 QSPI 控制器、一个千兆以太网控制器GEM。在 coreboot 中该主板的移植代码位于 src/mainboard/sifive/hifive-unleashedSoC 支持代码位于 src/soc/sifive/fu540配套的 RISC-V 架构说明可参考 Documentation/arch/riscv/index.md其中指出 coreboot 各阶段在 M 模式下运行ramstage 交给 payload 前会完成 trap 委派OpenSBI 以 M 模式运行在 RAM 中。coreboot 移植的源码结构主板代码布局主板目录下的每个文件各司其职对应 coreboot 的不同启动阶段文件阶段职责Kconfig构建期定义板级选项与依赖的 SoC/特性Kconfig.name构建期声明BOARD_SIFIVE_HIFIVE_UNLEASHED菜单项Makefile.mk构建期按阶段挂载源文件、生成 DTB 并写入 CBFSboard_info.txt元数据记录板卡分类、ROM 封装SOIC-16、SPI 协议、Flashrom 支持情况media.cbootblock/romstage/ramstage依据 MSEL 选择引导介质SPI Flash 或 SD 卡romstage.cromstage初始化串口、时钟、DDR随后进入 ramstagemainboard.cramstage向资源分配器注册 DRAM 范围fixup_fdt.cramstage运行时修正设备树MAC 地址、内存大小devicetree.cb构建期声明soc/sifive/fu540芯片与 CPU 簇设备hifive-unleashed-a00.dts构建期板级设备树源文件编译为fallback/DTB放入 CBFS关键 Kconfig 配置在 Kconfig 中选中 HiFive Unleashed 后会自动启用以下关键选项SOC_SIFIVE_FU540FU540 SoC 支持BOARD_ROMSIZE_KB_32768ROM 大小为 32 MiB与板载 SPI Flash 容量一致MISSING_BOARD_RESET该板没有实现复位逻辑烧录后需要手动断电重启FLATTENED_DEVICE_TREE启用扁平设备树支持SPI_SDCARD支持从 SPI 接口挂接的 SD 卡引导。SoC 侧 Kconfig 进一步明确了体系结构细节ARCH_RISCV_RV64、ABI 为lp64、代码模型medany、工作 hart 为 0RISCV_WORKING_HARTID、OpenSBI 平台为generic、OPENSBI_TEXT_START默认0x80000000即 DRAM 起始地址。启动流程与内存布局从 memlayout.ld 与各阶段代码可以看出完整的启动路径bootblockbootblock.c在 L2LIM0x08000000中运行打印当前FU540_MSEL寄存器中的引导模式值并完成 UART、CLINT、SPI 等最基础的初始化romstageromstage.c依次执行console_init()、clock_init()PLL 配置、UART 重初始化、sdram_init()DDR4 初始化与训练、cbmem_initialize_empty()最后run_ramstage()ramstage在 DRAM0x80000000 256K起2 MiB中运行其中内存布局还预留了 OpenSBI 空间DRAM 起始处 256 KiB最终由 OpenSBI 跳转到真正的 payload。时钟配置在 clock.c 中core PLL 输出 1 GHzdivr0、divf59、divq2DDR PLL 输出 933 MHzGEMGXL PLL 输出 125 MHztlclk coreclk / 2SPI/UART 等外设时钟分频也在此统一配置。DDR 初始化则在 sdram.c 中通过ux00ddr_*系列寄存器操作完成写/读 leveling、范围保护等流程sdram_size_mb()目前固定返回 8 GiB8 * 1024。构建 coreboot 固件构建前需要先配置运行make menuconfig在Mainboard菜单下选择SiFive→HiFive Unleashed对应Kconfig.name中的BOARD_SIFIVE_HIFIVE_UNLEASHED布尔项。一个值得注意的构建细节SiFive 的 ZSBL第零级引导程序只会从 GPT 分区中加载 FSBL而 coreboot 的 bootblock 正是用来替代 FSBL 的。因此 src/soc/sifive/fu540/Makefile.mk 中有一条特殊规则调用 util/riscv/sifive-gpt.py 把bootblock.raw.bin包装成带保护性 MBR GPT 头 FSBL 类型分区分区类型 GUID 为5B193300-FC78-40CD-8002-E86C45580B47的镜像生成最终的bootblock.bin。同时 Makefile.mk 会用dtc把 hifive-unleashed-a00.dts 编译成 DTB作为fallback/DTBraw 类型打包进 CBFS供 ramstage 的fixup_fdt.c在运行时加载并修正。引导模式Boot Modes详解MSEL 拨码开关HiFive Unleashed 使用标号为MSEL0MSEL3的拨码开关组合出16 种引导模式MSEL 值即拨码组合对应的数值。文档重点强调以下三种MSEL1直接跳入 SPI Flash绕过 ROM1ZSBL 不加载 FSBLMSEL11从 SD 卡加载 FSBLMSEL15默认引导模式从 SPI Flash 上的 GPT 分区加载 FSBL/coreboot。coreboot 对 MSEL 的处理主板层代码 media.c 对 MSEL 的实现比文档列出的三种更细其中注释直接说明coreboot 的 bootblock 即 ZSBL 眼中的 FSBL而 MSEL 决定了 FSBL 的引导介质。完整的 MSEL 映射宏如下宏取值含义MSEL_SPI0x15、14从 SPI0 以 1 线memory-mapped引导MSEL_SPI0x46、10、15从 SPI0 以 Quad4 线memory-mapped 引导MSEL_SPI1x112从 SPI1 以 1 线引导MSEL_SPI1x47、13从 SPI1 以 Quad 引导MSEL_SPI1SD8从挂接在 SPI1 的 SD 卡引导MSEL_SPI2x19从 SPI2 以 1 线引导MSEL_SPI2SD11从挂接在 SPI2 的 SD 卡引导即文档中的 MSEL11在boot_device_init()/boot_device_ro()中coreboot 读取FU540_MSEL地址0x1000见 addressmap.h命中MSEL_SPI0x1/MSEL_SPI0x4时通过fu540_spi_mmap()见 spi.c配置 QSPI0 的 memory-mapped 读模式把 0x20000000 处 256 MiB 的 Flash 映射窗口直接作为只读引导设备MEM_REGION_DEV_RO_INIT((void *)0x20000000, CONFIG_ROM_SIZE)。配置使用 0xEC 命令码Quad I/O Fast Read、4 字节地址、6 个 pad 时钟命中MSEL_SPI2SD时通过spi_sdcard_init(card, 2, 0)把 SD 卡封装成引导设备其他取值会直接die(Wrong configuration of MSEL\n)—— 也就是说 coreboot 的引导设备逻辑只接受上表中的值。提示文档中的 MSEL1绕过 ROM1 直跳 Flash属于 ZSBL 层面行为而 coreboot 的boot_device_ro()仅支持上述表格中的取值实际操作时请以板卡当前 MSEL 是否落在 coreboot 支持范围为准。刷写 coreboot 固件HiFive Unleashed 板载一颗32 MiB 的 SPI NOR FlashISSI IS25WP256D。板卡设备树hifive-unleashed-a00.dts中将其声明为compatible issi,is25wp256, jedec,spi-nor挂在 QSPI0 上spi-max-frequency 5000000050 MHz且启用 4 线收发。烧录途径有三种。板内编程Internal programming在板上的 Linux 系统中SPI Flash 会以 MTD 设备形式暴露直接操作/dev/mtd0即可读写。这是最快捷的路径适合先用 coreboot 引导起 Linux、再在系统内刷写新固件的场景。USB/JTAGOpenOCD将板上的 USB 端口连接到电脑板子上电后主机侧会出现两个串口设备例如/dev/ttyUSB0和/dev/ttyUSB1第一个是 JTAG 接口第二个连接 SoC 的 UART串口控制台下载并构建 RISC-V 版本的 OpenOCD并获取 Freedom Unleashed 对应的 OpenOCD 脚本启动 OpenOCDopenocd -f openocd.cfg通过 telnet 连接 OpenOCD 的命令行接口输入下面示例中之后的内容 flash write_image erase unlock build/coreboot.rom 0x20000000 auto erase enabled auto unlock enabled wrote 33554432 bytes from file build/coreboot.rom in 1524.943848s (21.488 KiB/s)需要注意写入地址0x20000000正是 FU540 的 QSPI0 Flash 内存映射基址FU540_QSPI0FLASH。从输出可以看到用 OpenOCD 整片烧写 32 MiB 并不快上例耗时约 25 分钟。文档给出的提速建议是构建并烧写一个更小的镜像 —— OpenOCD 不会校验镜像与 Flash 的大小是否一致因此可以显著缩短等待时间。外部 SPI 编程器使用 SPI 适配器配合 flashrom 进行外部编程理论上可行但文档明确说明该路径尚未经过测试并且板卡信息board_info.txt也标注Flashrom support: n。如果确实要走这条路务必先仔细研读板卡原理图确认 Flash 引脚与供电连接无误后再动手。ZSBL 错误码解析当引导失败时ROM1 中的第零级引导程序ZSBL会在串口控制台上打印错误码其格式如下原文引用自 SiFive 论坛// Error codes are formatted as follows: // [63:60] [59:56] [55:0] // bootstage trap errorcode // If trap 1, then errorcode is actually the mcause register with the // interrupt bit shifted to bit 55.即一个 64 位值最高 4 位[63:60]表示引导阶段bootstage随后 4 位[59:56]是 trap 标志低 56 位[55:0]为错误码。当trap 1时errorcode字段实际存放的是 RISC-V 的mcause寄存器值其中断位被移位到 bit 55。配合 FU540 手册与 mcause 编码表即可据此定位 ZSBL 是在哪个阶段、因何种异常而终止引导。移植现状与已知 TODO官方文档列出了该移植尚未完成的事项这也是评估生产可用性的重要边界原文清单如下支持从 Flash 运行 romstage修复栈问题以支持引导模式 1启动 U54 核心FU540 引脚配置与 GPIO 访问宏向 payload 提供序列号例如写入设备树实现指令模拟instruction emulation支持在 RISC-V 上引导 Linuxtrap handler 中的 SMP 支持。结合源码现状可以印证其中几项例如 fixup_fdt.c 已经在做向设备树写入板卡信息的工作——它会从 OTP 读取序列号otp.c 实现OTP 位于FU540_OTP即0x10070000以70:b3:d5:92:f0:00为基址前缀逐字节 OR 出local-mac-address属性并按sdram_size_mb()修正memory节点的reg大小dt_add_reg_prop写入0x80000000起始、8 GiB 大小的内存范围最后扁平化并写入各 hart 的 HLS而提供序列号仍未完成因为 MAC 派生自 OTP 但序列号本身还没有作为独立属性暴露给 payload。另外 memlayout.ld 中 romstage 放在 L2LIM 的 128 KiB 区域内运行而非直接从 Flash 执行这与 TODO 中从 Flash 运行 romstage的现状一致。附可继续深入阅读的仓库路径主板移植src/mainboard/sifive/hifive-unleashed含 media.c、fixup_fdt.c、hifive-unleashed-a00.dtsSoC 支持src/soc/sifive/fu540含 bootblock.c、clock.c、sdram.c、spi.c、memlayout.ld引导镜像打包工具util/riscv/sifive-gpt.pyRISC-V 架构说明Documentation/arch/riscv/index.md同系列后续板卡对比src/mainboard/sifive/hifive-unmatched赞分享固件嵌入式操作系统驱动开发【免费下载链接】corebootRead-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We dont handle Pull Requests.项目地址https://gitcode.com/gh_mirrors/co/coreboot点击查看免费下载相关推荐Tock 在 BBC HiFive Inventor 上的移植与烧录调试实战基于 FE310-G003 RISC-V 开发板Tock 在 BBC HiFive Inventor 上的移植与烧录调试实战基于 FE310 G003 RISC V 开发板 BBC HiFive Inven操作系统嵌入式嵌入式OScoreboot 刷机实战HP Compaq 8200 Elite SFF 移植与固件烧录完全指南coreboot 刷机实战HP Compaq 8200 Elite SFF 移植与固件烧录完全指南 本篇技术指南以 coreboot 官方移植文档为主体讲解固件嵌入式操作系统驱动开发MaaAssistantArknights明日方舟一键日常自动化指南MaaAssistantArknights明日方舟一键日常自动化指南 每天睡前刷两把日常、给基建换个班、把公招点完十几分钟就这么没了第二天原样再来一遍。M计算机视觉GUI自动化RPA创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

SHINEtoolbox:MATLAB无监督低照度RAW图像增强工具箱

SHINEtoolbox:MATLAB无监督低照度RAW图像增强工具箱

简介:SHINEtoolbox是一款面向心理学、神经科学及视觉感知研究者的MATLAB专用工具箱,专用于消除图像刺激间的亮度、对比度、色彩饱和度、纹理强度与空间频谱等低阶属性差异,从而提升实验控制精度与结果可靠性。资源共23个文件,含18…

2026/10/15 15:47:03 阅读更多 →
SHINEtoolbox高光谱处理工具箱:MATLAB专用遥感数据全链路分析指南

SHINEtoolbox高光谱处理工具箱:MATLAB专用遥感数据全链路分析指南

简介:SHINEtoolbox是一款面向心理学、神经科学及视觉感知研究者的MATLAB专用工具箱,专为消除图像亮度、对比度、色彩饱和度、纹理与尺寸等低阶属性差异而设计,助力科研人员在实验中实现视觉刺激的标准化控制,提升认知与神经响应测…

2026/10/15 15:47:03 阅读更多 →
UML序列图问答系统:可验证、可执行的交互契约引擎

UML序列图问答系统:可验证、可执行的交互契约引擎

简介:本资源是一份面向软件工程初学者与UML建模实践者的UML序列图(时序图)系统性学习文档,聚焦于动态交互建模核心能力培养。内容全面覆盖序列图五大核心元素——角色、对象、生命线、激活期与消息的定义、图形表示及语义规则&…

2026/10/15 15:47:03 阅读更多 →

最新新闻

STM32+MPU6050姿态解算源码详解:I2C通信与DMP固件实战

STM32+MPU6050姿态解算源码详解:I2C通信与DMP固件实战

简介:面向嵌入式入门与进阶开发者,一套基于STM32F103C8T6与MPU6050的Keil完整工程可直接编译下载使用。工程自带标准外设库源码与头文件,并配套完整示例与说明文档,覆盖I2C读取MPU6050原始数据、姿态解算、串口输出及定时器、ADC、…

2026/10/16 17:52:20 阅读更多 →
超低成本3D打印SCARA机械臂:从运动学到固件的完整落地指南

超低成本3D打印SCARA机械臂:从运动学到固件的完整落地指南

简介:一套超低成本、可通过3D打印实现的开源SCARA四轴机械臂项目完整资料,适合机器人爱好者、创客与嵌入式系统学习者,用于在没有昂贵模具和工业设备的前提下自制性能可靠的装配机器人。压缩包共72个文件,大小约27.09MB&#xff0…

2026/10/16 17:52:20 阅读更多 →
Qt调用海康威视SDK:从登录到实时预览的完整实践指南

Qt调用海康威视SDK:从登录到实时预览的完整实践指南

简介:面向Qt开发者与安防集成人员,这是一套基于Qt 5.8与海康威视官方SDK的摄像头登录与预览完整工程示例,完整演示了设备注册、预览初始化、图像回调、停止预览与注销等核心流程,可直接仿照应用于网络摄像头客户端项目。资源共68个…

2026/10/16 17:52:20 阅读更多 →
图像亮度变换函数详解:从像素映射到伽马校正与对比度拉伸

图像亮度变换函数详解:从像素映射到伽马校正与对比度拉伸

做图像处理的同学应该都有这种经历:拿到一张偏暗的照片,第一反应就是调亮度、调对比度。但在工程上,这种“调”并不是简单地乘一个系数,而是通过亮度变换函数对像素灰度值做逐点映射。所谓亮度变换函数,本质上就是把输…

2026/10/16 17:52:20 阅读更多 →
128×128灰度图也能93%准确率:基于CNN的垃圾分类识别实战

128×128灰度图也能93%准确率:基于CNN的垃圾分类识别实战

简介:一份面向垃圾分类场景的深度学习算法研究论文资料,内容围绕生活垃圾分类图像识别展开。文档从城市化带来的垃圾处理需求切入,系统说明了为何源头分类重要,以及如何借助带标记的垃圾图像数据训练分类模型。作者将原始图像降维…

2026/10/16 17:52:20 阅读更多 →
Roblox技能系统设计:数据驱动与加权随机生成器实战

Roblox技能系统设计:数据驱动与加权随机生成器实战

在 Roblox 上做咒术回战题材的技能系统时,很多人会卡在一个相似的地方:想还原“乙骨”那种“下一招用什么完全无法预测”的战斗体验,结果只在客户端写了一个 math.random(1, 5) ,然后随机切换技能图标。等真正跑起来才发现&…

2026/10/16 17:51:19 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →