- 固件
- 嵌入式
- 操作系统
- 驱动开发
【免费下载链接】coreboot
Read-only mirror of https://review.coreboot.org/coreboot.git. Synced every hour. We don't handle Pull Requests.
本文以 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 平台:
| 部件 | 规格 |
|---|---|
| CPU | Intel Core i7-8565U / i7-8665U(v1,Whiskey Lake-U) Intel Core i7-10510U(v2,Comet Lake-U) |
| PCH | Whiskey Lake / Cannon Point LP(v1) Comet Lake LP Premium(v2) |
| Super I/O / EC | ITE 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-S | Intel Firmware Support Package(Intel 固件支持包) | 必需 |
| microcode | CPU 微码 | 必需 |
| vgabios | VGA 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 接口处于同一水平线上。
进行外部烧录前需要拆卸外壳并依次卸下所有螺丝:
- 2 颗顶盖螺丝;
- 4 颗将主板固定到机箱的螺丝;
- 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进一步做了两项针对性调优:
- SATA HSIO 调整:为端口 0 和 2 启用
PchSataHsioRxGen3EqBoostMag(分别设为 2 和 1),这正是文档"已知问题"一节提到 SATA 6 Gbps 兼容性经过实验调优的代码落点; - 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.
相关推荐
coreboot 移植 Lenovo ThinkPad T420:刷写实战、硬件支持状态与源码实现解析
coreboot 移植 Lenovo ThinkPad T420:刷写实战、硬件支持状态与源码实现解析 本文基于 coreboot 仓库中 T420 主板文档
固件嵌入式操作系统驱动开发coreboot 刷机实战:HP Compaq 8200 Elite SFF 移植与固件烧录完全指南
coreboot 刷机实战:HP Compaq 8200 Elite SFF 移植与固件烧录完全指南 本篇技术指南以 coreboot 官方移植文档为主体,讲解
固件嵌入式操作系统驱动开发coreboot 移植实战:HP EliteBook 2170p 主板支持详解(固件刷写、EC blob 与源码实现)
coreboot 移植实战:HP EliteBook 2170p 主板支持详解(固件刷写、EC blob 与源码实现) 本文以 coreboot 仓库中的主板支
固件嵌入式操作系统驱动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考