👁 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

实机运行:刷好固件的 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/payload
  • fallback/dsdt.aml
  • fallback/romstage
  • fallback/ramstage
  • fspm.bin
  • fsps.bin
  • cpu_microcode_blob.bin
  • vbt.bin
  • SMMSTORE
  • ecrw 和 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. 刷写前安全要求

在真实设备测试前,应至少完成以下准备:

  1. 保存原机完整 SPI dump,并确认可以用外置编程器恢复。
  2. 明确只写入目标 FMAP 的 COREBOOT 区域,不要覆盖 Descriptor、ME、SMMSTORE 或设备唯一数据。
  3. 先记录原机开机、满载功耗、温度、频率和风扇状态,方便 A/B 对比。
  4. 首次测试优先使用 FreeBSD Logo 正式成品,Apple 版作为独立 Logo 备选,不要混用文件名。
  5. 刷写后保留写前备份、写后回读文件和 SHA-256,不要只保留一个 ROM 文件。

本记录不等同于刷写建议,也不保证任何第三方设备可以无条件使用。固件刷写失败时,需要依赖原机备份和外置 SPI 编程器恢复。

11. BIOS 刷写方法

11.1 推荐工具和来源

本项目只负责构建 ROM,不把刷写器伪装成 BIOS 内置升级功能。推荐使用 MrChromebox 官方 Firmware Utility Script 的自定义固件入口:

官方脚本支持备份当前固件、从本地文件或 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。按照菜单选择:

  1. 先选择 Backup Current Firmware,保存完整备份到 USB 或另一台机器。
  2. 选择 Flash Custom Firmware。
  3. 选择从本地文件或 USB 读取 ROM。
  4. 根据目标选择下列正式成品之一:

text noibat-freebsd-logo.rom noibat-apple-logo.rom

  1. 仔细确认设备型号、板名和文件名,等待脚本完成数据保留、写入和验证。
  2. 如果脚本报告错误,不要关机;先使用菜单恢复刚才保存的备份,并保存脚本日志。
  3. 只有脚本明确报告成功后,才使用脚本菜单关机,再手动开机测试。

首次启动可能需要等待较长时间进行内存训练。不要因为短时间黑屏就立即断电;如果超过合理等待时间仍无显示,应使用准备好的外置恢复方案。

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 需要兼容 ID RTL5682 才能驱动
  • GitHub Actions 因账号 billing 限制无法运行,ARM64 编译 crossgcc-i386 会失败,必须在 x86 主机上编译

一张图看完整流程

目标

构建一个"桌面/Win/macOS 友好"的 coreboot UEFI 固件变体 noibat-mac,包含以下实验性修改:

  1. 隐藏 BAT0 电池设备(_STA 返回 0)
  2. 移除 DPTF 充电性能控制
  3. 添加 RT5682 兼容 ID _CID=RTL5682
  4. 兼容 shallow clone(git describe --always)

环境

  • 主机: x86_64 Ubuntu 24.04
  • CPU: 4 核
  • 磁盘: ~15GB 可用空间(编译中间产物 + crossgcc)
  • 源码: MrChromebox/coreboot branch MrChromebox-2603
  • 目标 Board: google/puff variant noibat-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 不再显示电池图标,也不会启用笔记本省电策略
  • RTL5682 CID 可能帮助 macOS 识别声卡,但不保证完整驱动支持
  • 后续若需更新,只需 git fetch 更新 coreboot 源码,重新应用补丁即可

参考链接

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*

“`