👁 711
⚠️ 刷 BIOS 高风险,没有自救能力的千万别刷!
刷 BIOS 是高风险操作:万一不开机(变砖),没有外置 SPI 编程器和原机备份基本救不回来。没有自救能力、不能自己救砖的,千万别刷!
本博客不对你刷 BIOS 承担任何风险!刷坏了自己负责,刷前务必先备份原机固件。
2026-08-03 更新:功耗温控调校 + 双 Logo 成品(最新)
今天又构建了一轮,出两个 16 MiB coreboot + EDK2 成品:FreeBSD Logo 版(含 25 W 功耗调校)和 Apple Logo 版(仅换 Logo)。
下载(网盘需要登录,通用密码在 GitHub 仓库或 TG 群里):
📦 打开网盘 p.godsun.pro/chromebox-book
🔑 网盘需登录:通用密码在 GitHub 仓库或 TG 群公告里找。
实机运行:刷好固件的 Chromebox G3 在 Fedora 44 下正常点亮(i7-10610U / 16GB / 1.3TB)
发布用途:博客草稿和成品归档
构建日期:2026-08-03(Asia/Shanghai)
目标设备:HP Chromebox G3 / Google Noibat / Intel Core i7-10610U
1. 结论先行
本轮完成了两个独立的 16 MiB coreboot + EDK2 BIOS 成品:
| 正式成品文件 | Logo | 功耗/温控配置 | SHA-256 |
|---|---|---|---|
out/noibat-mac-black-logo/noibat-freebsd-logo.rom |
用户提供的 FreeBSD Logo | 本轮 25 W/51 W/72°C 调校 | e1fe75e9cf633e2dfd72a88719e11f4c962965e30fcba35098c6749d730bb713 |
out/noibat-apple-logo/noibat-apple-logo.rom |
Apple Logo | 原版 Noibat 设置,仅替换启动 Logo | 8b0adc0872dab4134383d538eb77d6353f1d67170aca3b6030415400424ffe9a |
两份文件均已完成离线构建和文件校验,但尚未刷入或在真实机器上启动验证。博客发布时应明确说明:这是“构建通过、静态复核通过”,不是“实机稳定性已经证明”。
2. 为什么要改功耗和温控
原始配置的长期 CPU 功耗限制约为 15 W。满载时处理器频率降到约 2 GHz,主要怀疑是长期功耗墙触发,而不是单纯的 CPU 频率设置问题。
本轮采用的思路是:提高长期功耗上限,同时保留短时功耗和温度保护,不把 51 W 当作长期功耗使用。
PL1 = 25 W:长期功耗目标和上限。PL2 = 51 W:短时间功耗上限,由平台时间窗口控制,不代表可以持续 51 W。- DPTF 长期功耗调节范围:
15-25 W。 - 温度达到约
72°C时开始被动降频。 - CPU 自身的被动和紧急保护仍然保留,未删除硅片级保护。
因此,25 W 是本固件的长期调校目标,51 W 是短时峰值。实际满载频率仍会受散热器、环境温度、供电适配器、EC 策略和 CPU 体质影响,不能只看 BIOS 数值判断一定能长期跑满。
3. FreeBSD Logo 版包含的修改
正式成品:
out/noibat-mac-black-logo/noibat-freebsd-logo.rom
该文件使用用户提供的 incoming/mylogo 作为 Logo 输入。项目内按用户要求将它标记为 FreeBSD Logo,并转换为 EDK2 使用的 250×250、24 位、无压缩 BMP3。
除 Logo 外,该版本还包含以下固件修改:
| 修改项 | 当前值或状态 |
|---|---|
| 长期 PL1 | 25 W |
| 短时 PL2 | 51 W |
| DPTF 长期 PL1 范围 | 15-25 W |
| 50°C 以上主动风扇请求 | 当前最高档,约 90% |
TEMP_SENSOR_0 被动降频 |
72°C |
| CPU 被动保护 | 约 95°C,保留 |
| CPU 紧急保护 | 约 100°C,保留 |
TEMP_SENSOR_0 紧急保护 |
约 78°C,保留 |
| BAT0 | ACPI _STA 返回 0,隐藏不适用的电池设备 |
| RT5682 | 保留原 HID,并增加 CID=RTL5682 |
| 充电器性能参与者 | 从 DPTF 性能策略中移除 |
| SMBIOS/OEM | 保留当前 HP/Noibat 目标字符串 |
这个变体的脚本名称仍是 noibat-mac-black-logo,其中 mac 表示面向 macOS 兼容性研究的配置,不代表 Logo 来源。正式成品文件已经改成更明确的 noibat-freebsd-logo.rom。
4. Apple Logo 版包含的修改
正式成品:
out/noibat-apple-logo/noibat-apple-logo.rom
Apple 版与 FreeBSD Logo 版不是同一套功耗配置:
- 使用上游 MrChromebox Noibat 原版配置。
- 只替换 EDK2 启动画面为 Apple Logo。
- 不包含本轮的 PL1 25 W、PL2 51 W、72°C DPTF 调校。
- 不包含 FreeBSD Logo 版的 BAT0、RT5682 和自定义风扇策略修改。
这两个成品特意保留为 A/B 选择,避免把 Logo 选择和功耗实验混成一个不可追踪的 ROM。
5. Logo 资源记录
5.1 用户提供的 FreeBSD Logo 输入
文件:incoming/mylogo
格式:PNG,250x250,8-bit RGBA
SHA-256:cf5dbd2401d3eaeaec8e0a827a3bc895f198ea49bf9ad93f94d9404772d4620d
5.2 FreeBSD Logo 的 EDK2 转换文件
文件:assets/noibat-logo-black.bmp
格式:BMP3,250x250,24-bit,无压缩
SHA-256:fe39edc50900ad006a3291fc376bc72341732099a13209878f0d8b3d6cb449d4
该 BMP 是构建时实际复制到 EDK2 MdeModulePkg/Logo/Logo.bmp 的文件。FreeBSD Logo 版构建完成后,嵌入文件与此资源的 SHA-256 一致。
5.3 Apple Logo 文件
文件:assets/apple-logo.bmp
格式:BMP3,250x250,24-bit,无压缩
SHA-256:33878f83b35967d4e09b4b0f565952f1fff37eaa944b0b0c51a180d617324ef2
Apple 版构建完成后,EDK2 内嵌 Logo 与此资源的 SHA-256 一致。这里的“Apple 版”指启动画面资源和 Noibat 固件变体,不是 Apple 官方 BIOS,也不包含 Apple 原机固件身份信息。
6. 构建基线
本轮使用的 coreboot 基线:
分支:MrChromebox-2606
提交:5c8ac8a174703c24e5d20d693f7d42d87c391b39
工作目录:work-25w-72c/coreboot/
本项目此前已检查 GitHub 项目和 MrChromebox 上游版本;本轮没有发现需要合并的新上游提交,因此没有擅自切换基线。
构建命令:
SKIP_FETCH=1
WORKDIR=/home/godsun/corebios/work-25w-72c
./scripts-build-noibat.sh noibat-mac-black-logo
SKIP_FETCH=1
WORKDIR=/home/godsun/corebios/work-25w-72c
./scripts-build-noibat.sh noibat-apple-logo
Apple 变体构建时,脚本会切回原版 Noibat 配置,再安装 Apple Logo;因此 Apple 版不会继承 FreeBSD 版的功耗温控补丁。
7. 构建输出与文件命名
7.1 FreeBSD Logo 正式成品
正式使用:out/noibat-mac-black-logo/noibat-freebsd-logo.rom
构建原始输出:out/noibat-mac-black-logo/coreboot.rom
大小:16777216 bytes(16 MiB)
SHA-256:e1fe75e9cf633e2dfd72a88719e11f4c962965e30fcba35098c6749d730bb713
7.2 Apple Logo 正式成品
正式使用:out/noibat-apple-logo/noibat-apple-logo.rom
构建原始输出:out/noibat-apple-logo/coreboot.rom
大小:16777216 bytes(16 MiB)
SHA-256:8b0adc0872dab4134383d538eb77d6353f1d67170aca3b6030415400424ffe9a
coreboot.rom 是构建脚本的通用原始文件名,不代表第三种 Logo。博客或刷写记录应使用带 Logo 标记的正式成品名,避免把两个变体混淆。
8. 已完成的离线校验
8.1 文件大小和 SHA-256
两份正式成品均为完整 16 MiB,SHA-256 已记录在上面的表格中,并再次执行了独立哈希检查。
8.2 成品复制一致性
带标记的正式成品与同一目录内的构建原始 coreboot.rom 已使用 cmp 逐字节比较,结果一致。
8.3 CBFS 结构
两份 ROM 均能由对应版本的 cbfstool 正常读取,并包含预期项目:
fallback/payloadfallback/dsdt.amlfallback/romstagefallback/ramstagefspm.binfsps.bincpu_microcode_blob.binvbt.binSMMSTOREecrw和ecrw.hash
8.4 DSDT 和 ACPI
两个变体的 DSDT 在构建时均为:
0 Errors
0 Warnings
28 Remarks
从两个 ROM 的 fallback/dsdt.aml 独立提取后,iasl -d 均成功完成,返回码为 0。
8.5 Logo 嵌入检查
每次变体构建都会把目标 BMP 复制到 EDK2 Logo 路径。FreeBSD 构建完成后,内嵌 Logo 与 assets/noibat-logo-black.bmp 哈希一致;Apple 构建完成后,内嵌 Logo 与 assets/apple-logo.bmp 哈希一致。
Apple 构建会覆盖工作区中临时的 MdeModulePkg/Logo/Logo.bmp,但不会改变已经输出并校验过的 FreeBSD ROM。
8.6 文件所有者和权限
两个变体目录内的正式成品现在属于:
godsun:godsun
权限:0644
普通用户可以读取、复制、重命名和删除,不需要 root 权限。之前出现 root:root 是因为复制成品时命令在 root 环境中运行,重复别名随后已删除。
9. 当前没有完成的验证
以下项目没有被本轮伪称为“已通过”:
- 没有刷写真实机器。
- 没有记录实机 CPU Package Power、稳定满载频率、温度和风扇转速。
- 没有验证实机在 72°C 附近是否完全按预期介入 DPTF。
- 没有完成当前两份新 ROM 的虚拟 SPI 写入和回读测试。
- 没有启用“重启进入 BIOS 后选择文件升级”的 UEFI Capsule 功能。
- 没有建立生产用 Capsule 签名证书和离线私钥流程。
- 没有构建“Apple Logo + FreeBSD 版功耗温控”的第三个混合变体。
10. 刷写前安全要求
在真实设备测试前,应至少完成以下准备:
- 保存原机完整 SPI dump,并确认可以用外置编程器恢复。
- 明确只写入目标 FMAP 的
COREBOOT区域,不要覆盖 Descriptor、ME、SMMSTORE 或设备唯一数据。 - 先记录原机开机、满载功耗、温度、频率和风扇状态,方便 A/B 对比。
- 首次测试优先使用 FreeBSD Logo 正式成品,Apple 版作为独立 Logo 备选,不要混用文件名。
- 刷写后保留写前备份、写后回读文件和 SHA-256,不要只保留一个 ROM 文件。
本记录不等同于刷写建议,也不保证任何第三方设备可以无条件使用。固件刷写失败时,需要依赖原机备份和外置 SPI 编程器恢复。
11. BIOS 刷写方法
11.1 推荐工具和来源
本项目只负责构建 ROM,不把刷写器伪装成 BIOS 内置升级功能。推荐使用 MrChromebox 官方 Firmware Utility Script 的自定义固件入口:
- 工具源码仓库:https://github.com/MrChromebox/scripts
- 官方文档:https://docs.mrchromebox.tech/docs/fwscript
- 官方下载入口:https://mrchromebox.tech/firmware-util.sh
- 项目构建仓库:https://github.com/rothdren-lion/noibat-bios-builder
- 底层
flashrom项目:https://flashrom.org/
官方脚本支持备份当前固件、从本地文件或 USB 选择自定义 ROM,并自动尝试保留序列号、HWID、VPD、RW_MRC_CACHE 和 SMMSTORE 等设备相关数据。脚本应由普通用户启动,由脚本在需要时调用 sudo;不要先执行 sudo su 或直接以 root 用户启动脚本。
11.2 使用官方脚本刷写自定义成品
环境要求
- 使用 ChromeOS VT2 终端或原生 Linux。
- 不要在 WSL、Crostini/Penguin 容器或其他虚拟化终端中运行。
- 如果当前仍是原厂 ChromeOS 固件,先按设备支持情况进入 Developer Mode。
- 进入 Full ROM 操作前,确认设备的固件写保护状态符合脚本提示。
- 准备可用的外置 SPI 编程器或其他恢复方案。
- 准备一个 USB 盘或另一台机器保存原机备份。
ChromeOS 下,从登录界面按 Ctrl+Alt+F2 进入 VT2,使用 chronos 登录;不要在已登录桌面中的 crosh 或 Crostini 中运行。原生 Linux 可直接打开终端。
下载并启动脚本
cd
curl -LOf https://mrchromebox.tech/firmware-util.sh && sudo bash firmware-util.sh
从普通用户终端执行这条命令,由 sudo 只对脚本进程提权;不要先执行 sudo su。按照菜单选择:
- 先选择
Backup Current Firmware,保存完整备份到 USB 或另一台机器。 - 选择
Flash Custom Firmware。 - 选择从本地文件或 USB 读取 ROM。
- 根据目标选择下列正式成品之一:
text
noibat-freebsd-logo.rom
noibat-apple-logo.rom
- 仔细确认设备型号、板名和文件名,等待脚本完成数据保留、写入和验证。
- 如果脚本报告错误,不要关机;先使用菜单恢复刚才保存的备份,并保存脚本日志。
- 只有脚本明确报告成功后,才使用脚本菜单关机,再手动开机测试。
首次启动可能需要等待较长时间进行内存训练。不要因为短时间黑屏就立即断电;如果超过合理等待时间仍无显示,应使用准备好的外置恢复方案。
11.3 刷写前的文件校验
在把 ROM 复制到 USB 或交给脚本前,先检查 SHA-256。博客中这两个正式文件的期望值为:
sha256sum noibat-freebsd-logo.rom
# e1fe75e9cf633e2dfd72a88719e11f4c962965e30fcba35098c6749d730bb713
sha256sum noibat-apple-logo.rom
# 8b0adc0872dab4134383d538eb77d6353f1d67170aca3b6030415400424ffe9a
如果从项目目录直接操作,完整路径是:
/home/godsun/corebios/out/noibat-mac-black-logo/noibat-freebsd-logo.rom
/home/godsun/corebios/out/noibat-apple-logo/noibat-apple-logo.rom
不要使用名称不明确的旧文件,也不要把 Apple 版和 FreeBSD Logo 版互相重命名后再刷写。coreboot.rom 只是构建脚本生成的通用原始文件名,刷写记录应使用带 Logo 标记的正式成品名。
11.4 高级用户手动 flashrom 方法
手动方式只适合已经有恢复能力、能判断 FMAP 区域并理解 SPI 写保护的用户。官方文档也建议普通用户优先使用 Firmware Utility Script:https://docs.mrchromebox.tech/docs/firmware/manual-flashing.html。
先读取并保存当前固件,至少保留完整备份和目标写入区域的备份。Intel Noibat 的区域名称必须以当前机器的 FMAP/flashrom 输出为准;本项目历史实机记录使用的是 COREBOOT,不能把其他 Chromebook 的 bios 区域命令直接套用到本机。
本项目的历史命令形态如下,仅作为审查模板,不是无条件执行指令:
sudo flashrom -p internal:boardmismatch=force
--fmap-file /path/to/noibat-freebsd-logo.rom
-i COREBOOT -N
-w /path/to/noibat-freebsd-logo.rom
使用这条命令前必须同时确认:
flashrom检测到的是本机目标 SPI 芯片和 Intel 平台。- 目标 ROM 的板型为 Google Noibat,而不是其他 Chromebook。
--fmap-file指向已经完成 SHA-256 校验的正式成品。-i COREBOOT的区域名与当前机器实际 FMAP 一致。- Descriptor、ME、SMMSTORE 和设备唯一数据不会被误写。
-N只用于跳过未写区域的额外验证;不要使用-n跳过全部验证。
历史记录中的 boardmismatch=force 只用于已确认板型相同、但 ROM 内 SMBIOS 字符串不同的情况。它不是“忽略所有硬件检查”的通用开关。
刷写后应再次从芯片回读,并与目标区域逐字节比较:
sudo flashrom -p internal -r after-flash.rom
sha256sum after-flash.rom
cmp target-coreboot-region.bin after-coreboot-region.bin
如果没有把目标 ROM 的相同 FMAP 区域从完整镜像中提取出来,不能直接拿完整 16 MiB 文件和区域回读文件比较。
11.5 外置 SPI 编程器恢复
CH341A、树莓派或其他 flashrom 兼容编程器只作为恢复和离线验证手段。外置读取时优先保存完整 16 MiB 芯片内容,至少读取两次并比较;写入时保留 Descriptor、ME、GbE/设备唯一数据,只在确认区域布局后恢复 BIOS/COREBOOT 内容。
外置编程器接线、电压和夹子方向必须按芯片型号核对。1.8 V 芯片不能直接接 3.3 V 编程器。硬件恢复应参考 MrChromebox 官方 unbrick 文档:https://docs.mrchromebox.tech/docs/support/unbricking/。
11.6 当前不能使用的 BIOS 内升级方法
当前 Noibat 构建没有启用 UEFI Capsule/FMP 自更新:
- BIOS Setup 中没有“选择 ROM 文件并升级”的页面。
- 没有生成可用于本机的
coreboot.cap。 - 没有配置生产签名证书和离线私钥。
- 现有 EDK2 写入后端尚未验证为只写
COREBOOT区域。
所以不能通过“重启进入 BIOS”直接刷这两个 ROM。当前可控路径是 Linux/ChromeOS 下的官方脚本,或经过完整备份和区域核对的手动 flashrom。
12. 可直接用于博客的简短说明
本项目针对 HP Chromebox G3(Google Noibat)在满载时约 2 GHz 的功耗限制进行了固件层调校。自定义变体将长期 PL1 从约 15 W 调整到 25 W,保留 51 W 短时 PL2,并将 DPTF 被动温控阈值调整为 72°C,同时提高风扇响应。该版本使用用户提供的 FreeBSD Logo,正式文件为 noibat-freebsd-logo.rom。
另外保留一个 Apple Logo-only 版本。它使用原版 Noibat 配置,只替换 EDK2 启动画面,正式文件为 noibat-apple-logo.rom,不包含自定义功耗温控修改。两份 ROM 均已完成 16 MiB、SHA-256、CBFS、DSDT 和 Logo 嵌入校验,但尚未进行实机刷写和启动测试。
HP Chromebox G3 自编译 Coreboot UEFI 记录
这篇是一次 HP Chromebox G3(Noibat)自编译 coreboot UEFI 固件的完整记录,重点不只是“编译成功”,而是把桌面机上不该出现的电池、充电策略、声卡兼容 ID、UEFI Payload 容量等坑都一起处理掉。
背景
HP Chromebox G3(Google 代号 Noibat)是一台基于 Intel Comet Lake-U 平台的小型台式机。MrChromebox 维护的 coreboot 分支提供了 UEFI 固件支持,但原版固件有几个桌面机不需要的问题:
- ChromeEC 会暴露
BAT0电池 ACPI 设备,导致 Windows 显示电池图标并启用笔记本电源策略 - DPTF 包含充电性能控制(Charger Performance Control),台式机无电池,这些配置无意义
- Realtek RT5682 声卡的 ACPI HID 是
10EC5682,macOS 需要兼容 IDRTL5682才能驱动 - GitHub Actions 因账号 billing 限制无法运行,ARM64 编译 crossgcc-i386 会失败,必须在 x86 主机上编译
一张图看完整流程
目标
构建一个"桌面/Win/macOS 友好"的 coreboot UEFI 固件变体 noibat-mac,包含以下实验性修改:
- 隐藏 BAT0 电池设备(
_STA返回 0) - 移除 DPTF 充电性能控制
- 添加 RT5682 兼容 ID
_CID=RTL5682 - 兼容 shallow clone(
git describe --always)
环境
- 主机: x86_64 Ubuntu 24.04
- CPU: 4 核
- 磁盘: ~15GB 可用空间(编译中间产物 + crossgcc)
- 源码: MrChromebox/coreboot branch
MrChromebox-2603 - 目标 Board:
google/puffvariantnoibat-mac
编译过程
1. 依赖安装
sudo apt-get update
⚠️
iasl(ACPI 编译器)必须安装,否则构建时找不到 crossgcc 编译的 iasl 会直接报错停止。
2. 克隆 Builder 仓库
git clone https://github.com/rothdren-lion/noibat-bios-builder.git
这个仓库只是一个编排脚本,不包含 coreboot 完整源码,编译时会自动拉取。
3. 拉取 Coreboot 源码
export WORKDIR="$PWD/work"
脚本会执行 git clone --branch MrChromebox-2603 --depth 1 https://github.com/MrChromebox/coreboot.git work/coreboot。
⚠️ 国内环境直接访问 GitHub 可能 TLS 握手失败,使用
GIT_HTTP_VERSION=HTTP/1.1可绕过部分 TLS 问题。
4. 预缓存 CrossGCC 依赖(关键踩坑点)
coreboot 的 crossgcc 构建系统会从 coreboot.org 下载交叉编译工具链的源码包,但 coreboot.org 经常返回 403 Forbidden。替代方案是从 GNU 官方镜像下载,但 部分包的 hash 与 coreboot 期望的不一致(如 binutils-2.45.tar.xz),会导致 hash 校验失败。
解决方案:提前从正确来源下载所有 tarball 并放入缓存目录:
TARBALL_DIR="work/coreboot/util/crossgcc/tarballs"
mkdir -p "$TARBALL_DIR"
脚本会执行 `git clone --branch MrChromebox-2603 --depth 1 https://github.com/MrChromebox/coreboot.git work/coreboot`。
> ⚠️ 国内环境直接访问 GitHub 可能 TLS 握手失败,使用 `GIT_HTTP_VERSION=HTTP/1.1` 可绕过部分 TLS 问题。
4. 预缓存 CrossGCC 依赖(关键踩坑点)
coreboot 的 crossgcc 构建系统会从 coreboot.org 下载交叉编译工具链的源码包,但 coreboot.org 经常返回 403 Forbidden。替代方案是从 GNU 官方镜像下载,但 部分包的 hash 与 coreboot 期望的不一致(如 binutils-2.45.tar.xz),会导致 hash 校验失败。
解决方案:提前从正确来源下载所有 tarball 并放入缓存目录:
```bash
TARBALL_DIR="work/coreboot/util/crossgcc/tarballs"
mkdir -p "$TARBALL_DIR"
curl -Lf -o "$TARBALL_DIR/gmp-6.3.0.tar.xz"
"https://ftpmirror.gnu.org/gmp/gmp-6.3.0.tar.xz"
curl -Lf -o "$TARBALL_DIR/mpfr-4.2.2.tar.xz"
"https://ftpmirror.gnu.org/mpfr/mpfr-4.2.2.tar.xz"
curl -Lf -o "$TARBALL_DIR/mpc-1.3.1.tar.gz"
"https://ftpmirror.gnu.org/mpc/mpc-1.3.1.tar.gz"
curl -Lf -o "$TARBALL_DIR/gcc-14.2.0.tar.xz"
"https://ftpmirror.gnu.org/gcc/gcc-14.2.0/gcc-14.2.0.tar.xz"
curl -Lf -o "$TARBALL_DIR/binutils-2.45.tar.xz"
"https://sourceware.org/pub/binutils/releases/binutils-2.45.tar.xz"
curl -Lf -o "$TARBALL_DIR/nasm-2.16.03.tar.bz2"
"https://www.nasm.us/pub/nasm/releasebuilds/2.16.03/nasm-2.16.03.tar.bz2"
curl -Lf -o "$TARBALL_DIR/acpica-unix-20250807.tar.gz"
"https://downloadmirror.intel.com/864114/acpica-unix-20250807.tar.gz"
验证 hash:
cd work/coreboot/util/crossgcc
name=$(basename "$f")
if [ -f "sum/$name.cksum" ]; then
expected=$(sed -e 's@.*([0-9a-f]{40,}).*@1@' < "sum/$name.cksum")
actual=$(sha1sum "$f" | awk '{print $1}')
if [ "$expected" = "$actual" ]; then
echo "✓ $name"
echo "✗ $name HASH MISMATCH"
踩坑: 如果 binutils 从 GNU mirror 下载,hash 会是
b576a0...,但 coreboot 期望的是09fd8a...。必须从sourceware.org下载才能 hash 匹配。
5. 手动应用实验性补丁
由于 shallow clone 和重复应用的问题,git apply 会失败。我们手动修改源文件:
5.1 build-uefi.sh — 兼容 shallow clone
cd work/coreboot
shallow clone 没有 tag 信息,git describe --tags 会失败。加 --always 后回退到 commit hash。
5.2 ec.h — 定义 NOIBAT_DESKTOP_NO_BATTERY
// 文件: src/mainboard/google/puff/variants/noibat/include/variant/ec.h
5.3 battery.asl — 条件隐藏电池设备
修改 Device (BAT0) 中已有的 _STA 方法:
// 文件: src/ec/google/chromeec/acpi/battery.asl
踩坑: 不能用
#ifndef包裹整个Device (BAT0)块!因为ec.asl中的Notify(BAT0, ...)仍然引用 BAT0,如果 BAT0 设备不存在,ASL 编译会报Object does not exist错误。用_STA=0的方式,设备存在但 OS 看不到,完美解决。
踩坑: 不能在 BAT0 内新增第二个
_STA方法!ASL 不允许同一作用域内重复定义方法名,会报Name already exists in scope。必须修改原有的_STA。
5.4 ec.asl — 修复 ECPD 前向引用
// 文件: src/ec/google/chromeec/acpi/ec.asl
踩坑: ASL 不支持前向引用。
ECPD设备定义在_Q16/_Q1C方法之后,但 Notify 在之前就引用了它,导致Object does not exist编译错误。用CondRefOf是 coreboot 自身代码库中已有的模式。
5.5 overridetree.cb — 移除充电控制 + 添加声卡 CID
cd work/coreboot
OTREE="src/mainboard/google/puff/variants/noibat/overridetree.cb"
> 踩坑: ASL 不支持前向引用。`ECPD` 设备定义在 `_Q16`/`_Q1C` 方法之后,但 Notify 在之前就引用了它,导致 `Object does not exist` 编译错误。用 `CondRefOf` 是 coreboot 自身代码库中已有的模式。
5.5 overridetree.cb — 移除充电控制 + 添加声卡 CID
```bash
cd work/coreboot
OTREE="src/mainboard/google/puff/variants/noibat/overridetree.cb"
sed -i '/## Charger Performance Control/,/register "controls.charger_perf[3]"/d' "$OTREE"
sed -i 's/register "hid" = ""10EC5682""/register "hid" = ""10EC5682""nttttregister "cid" = ""RTL5682""/' "$OTREE"
5.6 复制自定义 Config
cp patches/config.noibat-mac.uefi work/coreboot/configs/cml/config.noibat-mac.uefi
5.7 UefiPayloadPkg.fdf — 增大 FV 容量
FDF="work/coreboot/payloads/external/edk2/workspace/mrchromebox/UefiPayloadPkg/UefiPayloadPkg.fdf"
5.6 复制自定义 Config
```bash
cp patches/config.noibat-mac.uefi work/coreboot/configs/cml/config.noibat-mac.uefi
```
5.7 UefiPayloadPkg.fdf — 增大 FV 容量
```bash
FDF="work/coreboot/payloads/external/edk2/workspace/mrchromebox/UefiPayloadPkg/UefiPayloadPkg.fdf"
sed -i '/!else/,/!endif/ s/DEFINE FD_SIZE = 0x0800000/DEFINE FD_SIZE = 0x0900000/' "$FDF"
sed -i '/!else/,/!endif/ s/DEFINE NUM_BLOCKS = 0x800/DEFINE NUM_BLOCKS = 0x900/' "$FDF"
踩坑: UEFI payload 编译后约 8.6MB,超过默认的 8MB FV 限制。GenFv 报错
the required fv image size 0x83e160 exceeds the set fv image size 0x800000。增大到 9MB 解决。
6. 运行 Kconfig
cd work/coreboot
make olddefconfig KCONFIG_CONFIG="configs/cml/config.noibat-mac.uefi"
7. 编译 CrossGCC + IASL
make crossgcc-i386 iasl CPUS="$(nproc)" BUILDGCC_OPTIONS="-m"
首次编译约 15-25 分钟。crossgcc 编译 i386-elf 交叉工具链(GCC 14.2 + Ada 支持)和 IASL ACPI 编译器。
踩坑: 必须确保所有 tarball hash 正确,否则中途失败需要删除错误文件重新下载。
8. 编译 UEFI ROM
bash build-uefi.sh noibat-mac
编译过程约 3-5 分钟,包含:
- coreboot 主板代码编译
- ACPI 表生成(DSDT 用 iasl 编译)
- EDK2 UEFI Payload 编译
- FSP(Firmware Support Package)集成
- CBFS 打包
9. 输出
ls -lh out/
ROM 内容一览
cbfs.ioplus 0x000 raw 12200 none
踩坑总结
| 问题 | 症状 | 解决方案 |
|---|---|---|
| GitHub TLS 失败 | git clone 卡住或报 GnuTLS 错误 |
GIT_HTTP_VERSION=HTTP/1.1 |
| coreboot.org 403 | crossgcc 下载失败 | 预缓存所有 tarball |
| binutils hash 不匹配 | hash mismatch 校验失败 |
从 sourceware.org 下载,不用 GNU mirror |
git describe 失败 |
shallow clone 没有 tag | 加 --always 参数 |
| BAT0 整体隐藏 | Object does not exist (BAT0) |
改用 _STA=0 代替 #ifndef 包裹 |
_STA 重复定义 |
Name already exists in scope |
修改原有 _STA,不新增 |
| ECPD 前向引用 | Object does not exist (ECPD) |
用 CondRefOf 包裹 |
| FV 容量溢出 | fv image size exceeds set size |
FDF 中 FD_SIZE 增大到 9MB |
| 4K 屏幕显示小框 | 开机 Logo 只占屏幕中间一小块 | EDK2 DSC 中 PcdVideo 从 1280×800 改为 0(自动检测原生分辨率) |
| 4K BMP 塞不进 ROM | 3840×2160 BMP 约 24MB > 16MB ROM | BMP 做小图 400×300,4K 全屏由 GOP 黑色背景填充 |
| iPXE git stash 冲突 | Your local changes would be overwritten by checkout |
git stash drop + git checkout coreboot |
注意事项
- ⚠️ 此固件为实验性质,刷写前必须用 programmer 备份原厂固件
- ⚠️ 不要盲目刷写,保留回滚方案
- 桌面机隐藏电池设备后,Windows 不再显示电池图标,也不会启用笔记本省电策略
RTL5682CID 可能帮助 macOS 识别声卡,但不保证完整驱动支持- 后续若需更新,只需
git fetch更新 coreboot 源码,重新应用补丁即可
参考链接
- MrChromebox coreboot: https://github.com/MrChromebox/coreboot
- Builder 仓库: https://github.com/rothdren-lion/noibat-bios-builder
- coreboot 官方文档: https://doc.coreboot.org/
by 数码罗记 · godsun.pro
## 踩坑总结 | 问题 | 症状 | 解决方案 | |——|——|———-| | GitHub TLS 失败 | `git clone` 卡住或报 GnuTLS 错误 | `GIT_HTTP_VERSION=HTTP/1.1` | | coreboot.org 403 | crossgcc 下载失败 | 预缓存所有 tarball | | binutils hash 不匹配 | `hash mismatch` 校验失败 | 从 sourceware.org 下载,不用 GNU mirror | | `git describe` 失败 | shallow clone 没有 tag | 加 `–always` 参数 | | BAT0 整体隐藏 | `Object does not exist (BAT0)` | 改用 `_STA=0` 代替 `#ifndef` 包裹 | | `_STA` 重复定义 | `Name already exists in scope` | 修改原有 `_STA`,不新增 | | ECPD 前向引用 | `Object does not exist (ECPD)` | 用 `CondRefOf` 包裹 | | FV 容量溢出 | `fv image size exceeds set size` | FDF 中 FD_SIZE 增大到 9MB | | 4K 屏幕显示小框 | 开机 Logo 只占屏幕中间一小块 | EDK2 DSC 中 PcdVideo 从 1280×800 改为 0(自动检测原生分辨率) | | 4K BMP 塞不进 ROM | 3840×2160 BMP 约 24MB > 16MB ROM | BMP 做小图 400×300,4K 全屏由 GOP 黑色背景填充 | | iPXE git stash 冲突 | `Your local changes would be overwritten by checkout` | `git stash drop` + `git checkout coreboot` |
Boot Splash Logo 替换
编译时 logo 通过 `CONFIG_EDK2_BOOTSPLASH_FILE` 打包进 CBFS,替换很简单:BMP 格式要求
– 24-bit 或 32-bit 无压缩 BMP – 建议尺寸 400×300 ~ 800×600(UEFI 会按 BGRT 规范自动居中) – 不要超过 1280×800(UEFI 默认显示分辨率) – 深色背景效果最佳(与开机画面融合)4K 屏幕全屏显示
原版 EDK2 RELEASE 模式硬编码 GOP 分辨率为 1280×800,在 4K 显示器上开机只会显示一个小框,四周是显示器自身的黑边。需要修改 EDK2 的 PCD 配置让 GOP 自动检测屏幕原生分辨率: “`bash DSC=”work/coreboot/payloads/external/edk2/workspace/mrchromebox/UefiPayloadPkg/UefiPayloadPkg.dsc”RELEASE 模式下 PcdVideo 从硬编码改为自动检测(0 = auto)
sed -i ‘s/PcdVideoHorizontalResolution|1280/PcdVideoHorizontalResolution|0/’ “$DSC” sed -i ‘s/PcdVideoVerticalResolution|800/PcdVideoVerticalResolution|0/’ “$DSC” sed -i ‘s/PcdSetupVideoHorizontalResolution|640/PcdSetupVideoHorizontalResolution|0/’ “$DSC” sed -i ‘s/PcdSetupVideoVerticalResolution|480/PcdSetupVideoVerticalResolution|0/’ “$DSC” “` > ⚠️ BMP 不要做成 4K 分辨率! 3840×2160 24-bit BMP 约 24MB,超过 16MB ROM 总容量,根本塞不进去。正确做法是 BMP 做小图(如 400×300),GOP 自动设为 4K 后,Logo 居中在黑色全屏背景上显示。Logo 图片处理
用 PIL/Pillow 自动处理原始 Logo 图片: “`python from PIL import Image import numpy as np加载原始图片
img = Image.open(‘logo.jpg’) arr = np.array(img)裁掉右下角水印/标志(只取上方 75% 的主 Logo)
h, w = arr.shape[:2] top_75 = arr[:int(h*0.75)] bright_mask = np.all(top_75 > 30, axis=2) bright_rows = np.any(bright_mask, axis=1) bright_cols = np.any(bright_mask, axis=0) rmin = np.where(bright_rows)[0][0] rmax = np.where(bright_rows)[0][-1] cmin = np.where(bright_cols)[0][0] cmax = np.where(bright_cols)[0][-1] logo_crop = arr[max(0,rmin-20):rmax+20, max(0,cmin-20):cmax+20]400×300 黑底居中
target_w, target_h = 400, 300 final = np.zeros((target_h, target_w, 3), dtype=np.uint8) logo_h, logo_w = logo_crop.shape[:2] scale = min((target_w * 0.5) / logo_w, (target_h * 0.5) / logo_h) new_w, new_h = int(logo_w * scale), int(logo_h * scale) logo_resized = Image.fromarray(logo_crop).resize((new_w, new_h), Image.LANCZOS) logo_arr = np.array(logo_resized) y_off = (target_h – new_h) // 2 x_off = (target_w – new_w) // 2 final[y_off:y_off+new_h, x_off:x_off+new_w] = logo_arr保存为 24-bit 无压缩 BMP
Image.fromarray(final).save(‘boot_splash.bmp’, format=’BMP’) “` 处理后:Logo 142×150 像素,居中在 400×300 黑底上,BMP 文件仅 351KB。替换并重编
“`bash替换 logo 文件
cp boot_splash.bmp work/coreboot/Documentation/coreboot_logo.bmp清理并重编(crossgcc 已编译,只需重编 coreboot 本体,约 3-5 分钟)
cd work/coreboot rm -rf build/* make -j$(nproc) “` > ⚠️ iPXE git 冲突: 如果之前 stash 过 iPXE 的本地修改,`make` 会在 checkout 时报 `Your local changes would be overwritten`。解决方法: > “`bash > cd payloads/external/iPXE/ipxe > git stash drop # 丢弃 stash > git checkout coreboot > “` > 然后清理 build 目录重新编译。UEFITool 替换 Logo 的两个大坑
如果你不是编译 coreboot,而是用 UEFITool 直接修改现有固件,需特别注意: 1. 有些主板的 Logo 不是单张 BMP:现代很多核心板或主流 PC 主板,Logo 是被打包在叫 `AMILOGO` 的特殊二级容器里的,或者同时塞了 JPEG 和 BMP 好几张图。如果直接右键 Replace 整个 Raw Section,可能导致 BIOS 识别不到。需要进入容器内部逐个替换。 2. 体积超限时别硬塞:直接把画布等比例缩小(比如缩到 400×400 甚至 300×300),UEFI 内部会根据 BGRT 规范自动把它居中,小一点的图标在 4K 屏幕下反而显得更精致,而且能确保 100% 塞得进固件。注意事项
– ⚠️ 此固件为实验性质,刷写前必须用 programmer 备份原厂固件 – ⚠️ 不要盲目刷写,保留回滚方案 – 桌面机隐藏电池设备后,Windows 不再显示电池图标,也不会启用笔记本省电策略 – `RTL5682` CID 可能帮助 macOS 识别声卡,但不保证完整驱动支持 – 后续若需更新,只需 `git fetch` 更新 coreboot 源码,重新应用补丁即可参考链接
– MrChromebox coreboot: https://github.com/MrChromebox/coreboot – Builder 仓库: https://github.com/rothdren-lion/noibat-bios-builder – coreboot 官方文档: https://doc.coreboot.org/ *by 数码罗记 · godsun.pro* “`💖 打赏支持
如果这篇文章帮到了你,欢迎打赏支持
微信扫一扫,赞赏支持
发表回复