news 2026/10/15 17:18:20

coreboot 移植指南:Purism Librem Mini(v1/v2)硬件支持、固件烧录与源码实现解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
coreboot 移植指南:Purism Librem Mini(v1/v2)硬件支持、固件烧录与源码实现解析
  • 固件
  • 嵌入式
  • 操作系统
  • 驱动开发

【免费下载链接】coreboot

Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.

项目地址:https://gitcode.com/gh_mirrors/co/coreboot
点击查看免费下载

本文以 coreboot 仓库中的 Purism Librem Mini 主板移植文档为核心,系统梳理这款迷你主机的硬件规格、构建所需的专有固件(FSP、microcode、VGA Option ROM)、Intel ME/CSE 的安全处置方式、内部/外部烧录 SPI 固件的完整步骤,并结合src/mainboard/purism/librem_cnl/下真实源码讲解内存初始化、EC BRAM、GPIO 配置与 SATA 调优等实现细节。读完本文,你将掌握 Librem Mini 在 coreboot 下的移植状态、刷写方法,以及如何对照源码理解该平台的底层配置。

硬件规格总览

Librem Mini 是 Purism 推出的迷你台式机(minipc),coreboot 仓库中将其划分为 v1 与 v2 两个硬件版本,核心差异在于 CPU 与 PCH 平台:

部件规格
CPUIntel Core i7-8565U / i7-8665U(v1,Whiskey Lake-U)
Intel Core i7-10510U(v2,Comet Lake-U)
PCHWhiskey Lake / Cannon Point LP(v1)
Comet Lake LP Premium(v2)
Super I/O / ECITE IT8528E
协处理器Intel Management Engine(CSME 12.x,v1)
Intel Management Engine(CSME 14.x,v2)

v1 与 v2 在 coreboot 中对应两个不同的 Kconfig 目标:BOARD_PURISM_LIBREM_MINI与BOARD_PURISM_LIBREM_MINI_V2,二者均基于共享基板BOARD_PURISM_BASEBOARD_LIBREM_CNL(见 src/mainboard/purism/librem_cnl/Kconfig)。从 Kconfig 的select语句可以印证文档中的规格:v1 选择SOC_INTEL_WHISKEYLAKE(Whiskey Lake SoC),v2 选择SOC_INTEL_COMETLAKE_1(Comet Lake SoC),两者都启用SUPERIO_ITE_IT8528E与SYSTEM_TYPE_MINIPC;MAINBOARD_PART_NUMBER则分别输出 "Librem Mini" 与 "Librem Mini v2"。

此外,src/mainboard/purism/librem_cnl/variants/librem_mini/board_info.txt 提供了官方 board 元数据:类别为 desktop(迷你台式机),发布年份 2020,ROM 封装为 SOIC-8、走 SPI 协议、不可插拔(焊接在板上),且Flashrom support: y表明该板支持用 flashrom 刷写。Kconfig 中BOARD_ROMSIZE_KB_16384表明 flash 容量为 16 MiB,但 CBFS 区域因 v1/v2 而异:v1 为0x800000(8 MiB)、v2 为0xA00000(10 MiB),参见同一 Kconfig 文件中的CBFS_SIZE定义。

构建所需的专有固件(blobs)

与大多数 Intel 平台一样,构建一个最小可用的 coreboot 镜像需要若干专有二进制,前提是仅修改 BIOS 区域:

二进制文件用途必需 / 可选
FSP-M、FSP-SIntel Firmware Support Package(Intel 固件支持包)必需
microcodeCPU 微码必需
vgabiosVGA Option ROM可选

各部分的具体来源与处理方式如下:

  • FSP-M / FSP-S:来自3rdparty/fsp子模块,构建系统会自动拆分 FSP 二进制并将拆分后的部分整合进镜像。v1 使用 Coffee Lake(CFL)FSP,v2 使用 Comet Lake(CML)FSP。这与 Kconfig 中 v1 选择 Whiskey Lake、v2 选择 Comet Lake 的 SoC 选择一一对应。
  • CPU microcode:由构建系统自动从3rdparty/intel-microcode子模块打包进镜像。Purism 官方发布镜像可能携带更新的微码,这些微码来自 Purism 的 purism-blobs 仓库(外部资源,不随本仓库分发)。
  • VGA Option ROM:并非启动必需,但若希望在 pre-OS 阶段获得图形输出(且不使用 FSP/GOP 显示初始化),则应包含它。可通过 cbfstool 从主板现有固件中提取,或从 purism-blobs 仓库获取。

关于显示初始化,需要说明的是:本平台目前尚不支持 libgfxinit(文档明确标注 "no libgfxinit support yet"),Kconfig 中虽然基板启用了MAINBOARD_HAS_LIBGFXINIT,但 Makefile.mk 中gma-mainboard.ads仅在CONFIG_MAINBOARD_USE_LIBGFXINIT开启时才编译;实际外部显示依靠 VGA Option ROM 或 FSP/GOP 初始化完成。Kconfig 中VGA_BIOS_ID也分别指定了 v1(8086,3ea0)与 v2(8086,9b41)的显卡 PCI ID,供 Option ROM 加载匹配使用。

Intel ME/CSE 的安全处置:HAP 位禁用

Librem Mini 使用 Intel Management Engine / Converged Security Engine(ME/CSE),v1 为 12.x 版本、v2 为 14.x 版本。Purism 的固件通过设置High Assurance Platform(HAP)位来禁用 ME/CSE:该位使 ME 在平台 bring-up(BUP)之后进入禁用状态,并关闭所有 PCI/HECI 接口。

可通过 coreboot 的 cbmem 工具验证 ME 状态:

sudo ./cbmem -1 | grep 'ME:'

需要说明的是,该输出依赖于 coreboot 被修改为"即使 PCI 设备不可见/未激活也能打印 ME 状态",这正是 Purism 发布版镜像的默认行为;上游通用构建不一定具备此输出。cbmem 工具源码位于 util/cbmem(cbmem -1表示列出一次 console 日志)。

刷写 coreboot 固件

内部编程(Internal programming)

主 SPI flash 可通过 flashrom 访问。支持该芯片组的最低版本为 flashrom v1.2;若为 Mini v2,则需要v1.2-107-gb1f858f或更新的版本。使用内部编程器可以方便地刷写固件——既可以只刷 BIOS 区域,也可以刷写整个镜像。board_info.txt中Flashrom support: y同样印证了这一支持状态。

典型刷写思路(以内部编程器为例)是先读取并备份现有固件,再写入新构建的 coreboot 镜像:

# 备份现有固件(务必先备份!) sudo flashrom -p internal -r backup.bin # 仅刷写 BIOS 区域 sudo flashrom -p internal -w coreboot.rom --ifd -i bios

外部编程(External programming)

系统内部的 flash 芯片是一颗8 MiB 焊接式 SOIC-8芯片,其 VCC 线路上带有二极管,支持在系统内编程(in-system programming)。芯片位于主板底部、CPU 散热器下方,与前面板 USB 2.0 接口处于同一水平线上。

进行外部烧录前需要拆卸外壳并依次卸下所有螺丝:

  1. 2 颗顶盖螺丝;
  2. 4 颗将主板固定到机箱的螺丝;
  3. 4 颗将散热器/风扇组件固定到主板的螺丝(位于 SODIMM 内存插槽下方)。

如果 Wi-Fi 天线连接到内部 Wi-Fi/BT 模块,则需要先移除 M.2 SSD。随后使用SOIC-8 芯片夹(chip clip)连接编程器即可读写芯片。具体型号为Winbond W25Q128JV(3.3V)。

需要特别注意的是EC 固件:它存储在一颗独立的 SOIC-8 芯片(Winbond W25Q80DV)上,但该芯片没有二极管保护,因此在不断焊的情况下无法进行读写——即外部编程只能覆盖主 BIOS flash,EC flash 必须从主板上拆下芯片才能编程。

源码级实现细节:该平台如何在 coreboot 中落地

内存初始化与 SPD 缓存(romstage)

src/mainboard/purism/librem_cnl/romstage.c 中mainboard_memory_init_params展示了完整的 FSP 内存配置流程:

  • 通过struct cnl_mb_cfg配置 Rcomp 电阻({ 121, 81, 100 })、Rcomp targets({ 100, 40, 20, 20, 26 })、DQ 引脚交错(dq_pins_interleaved = 1)与 VREF_CA 配置(vref_ca_config = 2);
  • 通过 SMBus 从地址0x50、0x52读取两条内存槽的 SPD,并结合SPD_CACHE_IN_FMAP(Kconfig 中基板已启用)实现 SPD 缓存复用:若缓存有效且内存条未更换,则直接spd_fill_from_cache跳过 SMBus 读取,加速冷启动;若检测到内存变化,则使NvsBufferPtr = 0让 MRC 缓存失效并重新训练。

src/mainboard/purism/librem_cnl/variants/librem_mini/variant.c 中的variant_memory_init_params进一步做了两项针对性调优:

  1. SATA HSIO 调整:为端口 0 和 2 启用PchSataHsioRxGen3EqBoostMag(分别设为 2 和 1),这正是文档"已知问题"一节提到 SATA 6 Gbps 兼容性经过实验调优的代码落点;
  2. Refresh2X:启用Refresh2X = 1以缓解 S3 挂起/恢复问题(对应文档 Working 列表中的 S3 Suspend/Resume)。

EC BRAM 与自动上电设置(bootblock)

src/mainboard/purism/librem_cnl/variants/librem_mini/bootblock.c 在 bootblock 阶段就完成了 EC(ITE IT8528E)BRAM 接口的初始化:通过pnp_enter_conf_state进入配置状态,将 IT8528E 的 RTCT(RTC-like Timer)逻辑设备使能并设置 I/O base 为CONFIG_PC_CMOS_BASE_PORT_BANK1(默认0x360,见 Kconfig),再用lpc_open_pmio_window在 LPC 上打开该 2 字节窗口。

这段代码的注释解释了关键设计:BRAM 使用 PCH 的 bank 0(用于 RTC)和 EC 的 bank 1(包含自动上电设置)。由于cmos.default在 bootblock 早期就会被应用,所以 BRAM 接口必须在 bootblock 中就绪。仓库中的 cmos.default 与 cmos.layout 展示了可配置项power_on_after_fail(可选值为 Enable/Disable,默认 Disable),对应注释中"利用该设置可将 Mini 当作类服务器设备使用"的用法;cmos.layout还在 bank 1 末尾(位 1520)为 EC 补充了校验和,因为 EC 固件虽会初始化无效的power_on_after_fail,但自身并不计算校验和。

GPIO、设备树与故障指示

  • GPIO 配置:gpio.c 中的 pad 配置表由 intelp2m 工具自动生成,覆盖 GPP_A 至 GPP_H 全部 GPIO 组;其中值得关注的是GPP_C22(USB3_P1_PWREN,上电输出高)与GPP_E8(STATUSLED#)被配置为 GPO,后者被用于故障指示(见下)。
  • 设备树:overridetree.cb 详细描述了 USB 端口布局(前后 Type-A/Type-C 的 ACPI PLD 分组与过流保护 OC0–OC3 映射)、SATA 端口使能(2.5" 盘位 port 0、M.2 port 2,并开启satapwroptimize)、三路 PCIe:RP8(M.2/E 2230 WLAN,ClkSrc 设为 free-run)、RP10(板载 LAN,PXE ROM ID10ec,8168)、RP13(M.2/M 2280 NVMe),以及 IT8528E Super I/O 各逻辑设备(UART1 使能、其余关闭)。基板 devicetree.cb 还配置了 SpeedStep、SaGv_Enabled、声学降噪(Acoustic Noise Mitigation、SlowSlewRate 等)、SLP 信号最小断言时间与 GPE 路由。
  • 故障指示:die.c 实现了die_notify:在 postcar 阶段之前若发生致命错误,通过gpio_output(GPP_E8, 1)点亮 SATA LED 并让其以 100ms 间隔闪烁,作为无 POST code 显示平台(Kconfig 中NO_POST已启用)的简易故障可视化手段。
  • 调试串口:Kconfig 还提供一个可选功能ENABLE_EC_UART1,可启用 EC 的 UART1(需要焊接 U81 焊盘,TX 为 pin 14、RX 为 pin 19,信号为 3.3V,不可直连 RS-232),供 coreboot、SeaBIOS 或 Linux 输出启动日志。

已知问题(Known issues)

文档明确列出了当前移植存在的三个已知问题:

  • SeaBIOS 检测 USB 设备可能不稳定("can be finicky");
  • 使用 VGA Option ROM 显示初始化时模式切换较慢,有时会卡住;
  • 部分 2.5" SATA 设备在 6 Gbps 速率下存在兼容性问题:尽管 HSIO PHY 设置已通过实验调优(即上文 variant.c 中的 SATA HSIO EQ Boost 配置),部分设备仍可能在内核日志(dmesg)中报错并降速至 3 Gbps,但不应导致启动失败;值得注意的是,同样的现象也存在于 AMI 厂商固件上。

当前支持状态(Working / Not working)

已验证可用(Working):

  • 外部显示:HDMI/DisplayPort,可通过 VGA Option ROM 或 FSP/GOP 初始化(尚无 libgfxinit 支持);
  • Payload:SeaBIOS(1.14)、edk2(CorebootPayloadPkg)、Heads(Purism 下游版);
  • 千兆以太网、M.2 2230 Wi-Fi;
  • 通过 flashrom 进行系统固件更新;
  • PCIe NVMe(M.2 2280);
  • M.2 与 SATA III 存储;
  • 音频:前面板 3.5mm 耳机孔、HDMI、DisplayPort;
  • SMBus(读取 DIMM 的 SPD,对应 romstage.c 中的get_spd_smbus流程);
  • 基于 FSP 2.0 的初始化(v1 用 CFL FSP,v2 用 CML FSP);
  • S3 挂起/恢复(对应 variant.c 中 Refresh2X 的启用);
  • 操作系统:可启动 PureOS 10.x、Debian 11.x、Qubes 4.1.0-alpha1、Linux Mint 20、Windows 10 2004。

未工作 / 未测试(Not working / untested):

  • ITE IT8528E Super I/O 的其余功能(当前设备树仅启用了 UART1 与 RTCT 逻辑设备,KBC、Consumer IR、PECI、SSPI 等均处于关闭状态,参见 overridetree.cb)。

结语

Librem Mini(v1/v2)是 coreboot 中支持较为完整的迷你台式机平台之一:硬件层面覆盖内存训练、SATA 调优、EC BRAM、USB/PCIe 设备树与 ME 禁用等关键环节;操作层面同时支持 flashrom 内部刷写与 SOIC-8 夹子外部烧录。通过本文档与src/mainboard/purism/librem_cnl/源码对照阅读,开发者可以清晰理解每一个"Working"条目背后的实现支撑,也可以在此基础上进一步探索 IT8528E 其余 Super I/O 功能等未测试领域。

  • 固件
  • 嵌入式
  • 操作系统
  • 驱动开发

【免费下载链接】coreboot

Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.

项目地址:https://gitcode.com/gh_mirrors/co/coreboot
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 17:18:02

从零手写小型C编译器:词法、AST与x86-64汇编的完整实现

简介:一套小型C语言编译器的完整源代码,面向希望深入理解编译原理的开发者、计算机专业学生以及底层系统编程爱好者。项目覆盖词法分析、语法分析、语义分析、优化与代码生成等核心环节,并包含生成汇编代码的实现,可作为学习编译器…

作者头像 李华
网站建设 2026/10/15 17:17:43

论文查重率居高不下?“重复率+AIGC”双保险降重法

论文写完,最怕的就是查重。辛辛苦苦写了几万字,一查重复率百分之三四十,整个人都不好了。更麻烦的是,现在很多高校不仅查重复率,还查AIGC疑似率——AI写作痕迹一旦被判定,轻则要求修改,重则影响…

作者头像 李华
网站建设 2026/10/15 17:17:29

STM32模拟交通灯Keil工程实战:从源码解析到答辩项目改造

简介:这份资源是面向嵌入式初学者与高校课程设计学生的STM32模拟交通灯项目完整资料包,基于Keil μVision开发环境,用C语言实现红绿黄灯定时切换,涉及GPIO控制、定时器中断与状态机设计等知识点,适合作为单片机编程入门…

作者头像 李华
网站建设 2026/10/15 17:14:51

java数组练习

题目1 遍历数组并求和定义一个数组,存储1,2,3,4,5 遍历数组得到每一个元素,求数组里面所有的数据和package com.example;public class Demo {public static void main(String[] args){int[] arr{1,2,3,4,5}…

作者头像 李华
网站建设 2026/10/15 17:14:11

网页消息提醒音模块:合成音与文件音双路径实现

简介:面向网页前端开发者的消息提醒音实现示例包,聚焦HTML5 Audio API与事件监听,适合需要为聊天、管理系统增加新消息提示音的初中级JavaScript学习者。压缩包共3个文件,包含一个mp3提示音源文件、一个jQuery脚本及一个可直接运行…

作者头像 李华
网站建设 2026/10/15 17:14:09

Java Web购物车源码解析:Servlet+JSP+JDBC轻量级MVC实现

简介:面向JavaWeb初学者的购物车系统完整源码包,基于Servlet/JSPSessionJDBC实现,涵盖商品添加删除、数量更新、金额统计等核心交互,同时附有数据库脚本与详细开发笔记,适合课设练习与框架前基础巩固。源码演示了如何通…

作者头像 李华