Recovering BIOS Firmware on the Star Labs StarBook

Marius

在 Star Labs StarBook 上恢复 BIOS 固件

原文由 Marius 发布,订阅该博客

如我在最新季度更新中所说,一次完全常规的固件更新竟把我的 Star Labs StarBook Mk VI (AMD) 变成了一块昂贵的镇纸。我只是照着 Star Labs 官方文档复制粘贴了那条 curl ... | bash 一键命令,脚本跑了大约半分钟后就关机了,自此 StarBook 再也无法启动。黑屏,键盘背光亮着,电源指示灯亮着,扬声器还偶尔发出咔嗒声。可惜无论怎么反复重启或是断开电池,都无济于事。

摆脱这一困境的唯一办法,就是用 SPI 编程器在外部重新刷写 BIOS 芯片。Star Labs 对此倒是有文档说明,但他们的教程默认你使用的是他们编程套件,配合专用的调试板FPC 排线。那套工具比通用编程器贵得多,没有标注任何品牌或型号信息,而且截至本文撰写时,在他们的网店里一直处于缺货状态。当你被困在外,手头那台变砖的笔记本恰好又是你唯一的电脑时,这可帮不上什么忙。

好消息是,至少对于 StarBook 的这个具体型号,你完全不需要那些。正如 Star LabsSean 在我为排查这个问题而提交的 GitHub issue 中指出的,这款 StarBook 使用的是 SOIC-8 封装的闪存芯片,这意味着只要注意电压,你就可以用便宜的通用 CH341A 编程器加一个普通的 SPI 夹子来恢复它。

警告:外部刷写 BIOS 芯片操作不当会永久损坏你的设备。AMD 版 StarBook 上的闪存芯片工作电压为1.8V,你必须使用 1.8V 转接板。用 CH341A 默认的 3.3V 去驱动它,不仅有损坏芯片的风险,而且根本无法正确读取。以下所有内容都是我个人验证可行的方法,已尽我所知记录在案,但操作风险完全由你自行承担。

1.8V

拆开后盖后,我从芯片丝印上看到,我这台 StarBook Mk VI (AMD) 上的闪存芯片是一颗 Winbond 25R128JWSQ,采用 SOIC-8 封装的 SPI NOR 闪存。Winbond 型号后缀中的 JW 据说就代表 1.8V 版本。

AliExpressAmazon 以及几乎任何地方都能买到的那种随处可见、只要三美元的黑色 CH341A 编程器,其 SPI 信号线工作在 3.3V(并口排针则是 5V)。直接把它夹到 1.8V 芯片上,运气好的话,flashrom 只会读出一堆乱码;运气不好,则会烧掉闪存甚至下游的元件。

解决办法是一块小小的 1.8V 转接板(本质上是带稳压器的电平转换器),接在 CH341A 和你的 SOIC-8 夹子之间。这类产品通常成套出售,例如 Sean 在 issue 中提到的 KOOBOOK CH341A 编程器 + 1.8V 转接板套装。无论买哪一种,都要确保商品明确标注支持 1.8V。

所需工具

你需要一个带 1.8V SOIC-8 转接板的 CH341A 编程器、一个 SOIC-8 测试夹(弹簧式的“Pomona”夹子,或更便宜的排线式夹子,都能用)、一台运行 Linux 的第二台电脑(可以用 Live 介质,比如 U 盘启动)来驱动编程器——比如从商场借一台笔记本加一个 Fedora Live U 盘就够了,只要你足够能言善辩,能向店员解释清楚你绝对不是在组装什么在他们看来十有八九像炸弹的东西。你还需要对应机型的正确固件镜像(下文会详述)、一把小的十字螺丝刀,最好再准备一个塑料撬棒。

步骤 1:拆开 StarBook

开始前请先关机并拔掉充电器。将笔记本翻过来,先拧下顶部两角的两颗长十字螺丝,再拧下边缘的八颗短螺丝,然后小心取下后盖。

接着,拧下固定电池的五颗螺丝(其中一个螺丝位是故意空着的),然后轻轻拔掉电池排线。

最后,在主板上找到 SOIC-8 闪存芯片。就是上文提到的那颗八脚 Winbond 小芯片。

注意:拆开 StarBook 时,我发现自己那块用了还不到两年的电池已经出现了明显的鼓包,所以也请顺便检查一下你的电池。锂电池鼓包有起火风险,应该及时更换。

步骤 2:连接夹子

SOIC-8 闪存芯片有明确的 1 脚,夹子的 1 脚(通常是排线红色边缘对应的那根线)必须与之对齐。方向弄反,芯片就根本不会被识别。

供参考,Winbond SOIC-8 闪存的引脚定义如下:

引脚名称功能
1/CS片选
2DO (IO1)数据输出 / MISO
3/WP (IO2)写保护
4GND接地
5DI (IO0)数据输入 / MOSI
6CLK时钟
7/HOLD (IO3)保持
8VCC电源 (1.8V)

不过你不需要手动去接这些线,因为夹子和 1.8V 转接板已经帮你把八根线都连好了。你唯一需要做对的,就是让夹子的 1 脚与芯片的 1 脚对齐。

注意:在我的这颗芯片上,封装上有一个灰色圆点,位于与 1 脚相反的角上。而真正的 1 脚标记是那个小小的凹陷(蚀刻)圆点,恰好在灰色圆点的对角线上。我也不清楚那个灰点是干什么用的,但如果你按它对齐,夹子就会夹反。如果你的芯片上也有这个灰点,请认准凹陷点,而不是灰点。

步骤 3:使用 flashrom 刷写

夹好夹子后,将 CH341A 插到第二台电脑上。用 dmesg 看一下就能确认设备已被识别:

usb 3-6: New USB device found, idVendor=1a86, idProduct=5512, bcdDevice= 3.04
usb 3-6: Product: USB UART-LPT

如果还没安装 flashrom,请先安装:

# Debian/Ubuntu
sudo apt install flashrom

# Fedora
sudo dnf install flashrom

在写入任何内容之前,请先确认 flashrom 能否通过夹子与闪存正常通信:

sudo flashrom -p ch341a_spi

如果一切接触良好,flashrom 会识别出 Winbond 芯片(显示为类似 W25Q128JW 的型号)。如果看到的是:

No EEPROM/flash device found.
Note: flashrom can never write if the flash chip isn't found automatically.

……也不用慌。依我的经验,这几乎总是夹子接触不良,而不是真的出了问题。我也是来回晃动、重新夹了几次,芯片才稳定地被识别出来,毕竟这些廉价夹子确实不太好用。只有在连续几次都能稳定识别到芯片后,再继续下一步。

即便固件已经变砖,在覆盖之前先做个备份也是好习惯。把芯片读两遍并对比镜像,以确保接触良好:

sudo flashrom -p ch341a_spi -r backup1.rom
sudo flashrom -p ch341a_spi -r backup2.rom
cmp backup1.rom backup2.rom && echo "OK: reads match"

如果两次读取的结果不一致,说明夹子接触不稳,请重新夹好再试。

至于固件镜像,Star Labs公开的 GitHub 仓库中发布了他们的固件。用于外部编程时,你需要的是完整的 SPI 镜像,而不是 EFI/fwupd 更新文件。以我的 StarBook Mk VI (AMD)(产品 SKU B6-A)为例,对应的是 roms/B6-A.bios 这个镜像。完整的 flashrom 镜像也存放在该机型对应的 ami-flashrom 目录下。请选择与你机型匹配的文件,并重命名为方便使用的名字,例如 starbook.rom

注意:Star Labs 的固件版本号,说得委婉些,相当混乱。截至本文撰写时,AMD 版 StarBook 最后一个 AMI(即原版“BIOS”)版本是 25.12,而从 26.04 开始则是 Coreboot。无论你决定刷哪一个,都要确保是对应你确切机型的完整镜像。


最后,使用 flashrom 命令写入下载好的镜像:

sudo flashrom -p ch341a_spi -w starbook.rom

默认情况下 flashrom 会先擦除、再写入,然后校验芯片。Star Labs 官方命令末尾会加上 -n -N(即 --noverify--noverify-all)来跳过这些校验步骤,但我建议不要加,让 flashrom 确认写入确实成功。无论哪种方式,在编程器工作期间都不要断开或碰动它。顺利完成后,取下夹子,重新接好电池,装回后盖,然后尝试开机。

步骤 4:恢复后的首次启动

当我再次开机时,我的 StarBook 又活了过来,只是停在了一个提示缺少启动项的界面上,因为刷入全新镜像也会清除 EFI 启动变量。这没什么大不了的,你只需让固件重新指向你的引导程序即可。你可以通过启动菜单选择你的 SSD(通常会自动重新添加启动项),也可以启动一个救援/Live 系统并运行 grub-install(我就是这么做的),或者进入 EFI Shell 手动启动引导程序:

fs0:
cd efi/fedora
grubx64.efi

注意:在较新的 Coreboot 版本中,Star Labs 正在启用 Rom Armor 和防回滚机制。在 AMD 主板上,外部刷写和降级在 26.06 版本对我来说仍然可行,但预计从 26.07 开始将会被限制。

一点感想

整件事最让我沮丧的,并不是固件更新可能会失败,因为刷写固件本来就有风险。真正让人恼火的是,Star Labs 官方文档中的恢复方案依赖一套根本买不到的专用套件,而一个带 1.8V 转接板的通用 CH341A 明明就能很好地完成任务。然而,这些信息在 Star Labs 的官方文档中却无处可寻,这也正是我当初决定写下这篇文章的原因。希望它能帮下一个人省下我当初花费的一整天时间(以及那些焦虑)。

本文章由 muse-spark-1.2-contributor 进行翻译

评论