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來說,你根本不需要那些東西。如同我在除錯過程中開的 GitHub issue 裡,Star LabsSean所指出的,這款StarBook採用的是SOIC-8封裝的快閃晶片,這表示只要注意電壓,你就能用便宜的通用CH341A燒錄器加上一般的 SPI 夾具把它救回來。

警告:外部刷寫 BIOS 晶片如果操作不當,可能會永久損壞你的裝置。StarBook AMD 版上的快閃晶片以1.8V運作,你務必使用 1.8V 轉接板。若以CH341A預設的 3.3V 去驅動,不僅有損壞晶片的風險,也根本無法正確讀取。以下內容都是對我有效的做法,並已盡我所知詳實記錄,但所有操作風險皆由你自行承擔。

1.8V

我這台StarBook Mk VI (AMD)上的快閃晶片,在拆開背蓋後可以直接從晶片本體上判讀,型號是Winbond 25R128JWSQ,屬於SOIC-8封裝的 SPI NOR 快閃記憶體。JW這個後綴在Winbond的料號中,據說就代表 1.8V 版本。

AliExpressAmazon等各處都能買到的那種到處可見、只要三塊美金的黑色CH341A燒錄器,其 SPI 訊號線是以 3.3V 運作(並列排針則是 5V)。如果直接夾上 1.8V 的晶片,最好的情況是flashrom讀出一堆亂碼,最糟的情況則是直接把快閃晶片或其周邊電路燒毀。

解法是一塊小小的 1.8V 轉接板(本質上是帶有穩壓器的位準轉換器),把它接在CH341ASOIC-8夾具之間即可。這類產品通常以套件形式販售,例如Sean在 issue 中貼過的KOOBOOK CH341A Programmer + 1.8V Adapter組合。無論買哪一種,請務必確認商品有明確標示支援 1.8V。

你會需要的東西

你會需要一個附有 1.8V SOIC-8 轉接板的CH341A燒錄器、一個SOIC-8測試夾(彈簧式的「Pomona 樣式」夾具,或是便宜的排線式夾具都可以)、一台可跑 Linux 的第二台電腦(用 Live 隨身碟開機也行)來操作燒錄器——例如跟百貨公司借一台筆電,再用Fedora Live USB開機,只要你能很有說服力地跟店員解釋你絕對不是在組裝看起來很像炸彈的東西就行。你還會需要對應你機型的正確韌體映像檔(詳見下方)、一把小的Phillips十字螺絲起子,以及最好再準備一支塑膠撬棒。

步驟一:拆開StarBook

開始前請先將所有電源關閉並拔掉充電器。把筆電翻到背面,先卸下上方角落的兩顆較長Phillips十字螺絲,再卸下周圍的八顆較短螺絲,然後小心地取下背蓋。

接著,卸下固定電池的五顆螺絲(其中一個螺絲孔是刻意留空的),然後輕輕拔掉電池排線接頭。

最後,在主機板上找到那顆SOIC-8快閃晶片,就是前面提到的那顆小小的八隻腳Winbond晶片。

注意:我在拆開StarBook時發現,才用不到兩年的電池就已經明顯鼓脹,所以也請順便檢查一下你的電池。膨脹的鋰電池有起火風險,應該盡快更換。

步驟二:連接夾具

SOIC-8快閃晶片有固定的第 1 腳,而夾具的第 1 腳(通常是排線上紅色邊的那條線)必須與之對齊。方向接錯,晶片就完全不會被偵測到。

供參考,WinbondSOIC-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 腳反而是以一個小小的凹陷(蝕刻)圓點來標示,正好在灰點的對角。我完全不知道那個灰點是做什麼用的,但如果你對齊灰點,夾具就會整個夾反。如果你的晶片也有灰點,請認那個凹點,而不是灰點。

步驟三:使用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)(產品型號B6-A)來說,就是roms/B6-A.bios這個檔案。完整的flashrom映像檔也放在該機型對應的ami-flashrom目錄下。請挑選符合你機型的檔案,並重新命名成方便使用的名稱,例如starbook.rom

注意:Star Labs的韌體版本命名,說得客氣一點,實在是一團亂。截至本文撰寫時,AMDStarBook最後一個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確認寫入真的成功。無論如何,在燒錄過程中請勿拔除或晃動燒錄器。完成後,取下夾具、接回電池、鎖回背蓋,然後嘗試開機。

步驟四:修復後的首次開機

當我再次按下電源時,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 進行翻譯

留言