多くの場合、PCのBIOSはフラッシュメモリに記録されており、SPI(Serial Peripheral Interface)で読み書きできる。Raspberry Piには特定のピンをSPIデバイスとして使う機能があるため、マザーボード上のフラッシュメモリICに接続することでPC外部からBIOSを読み書きできる。
通常、PC外部からBIOSを読み書きする必要はない。しかし、アップデートに失敗して壊れたBIOSをRaspberry Piで直した話 (1.8V SPI Flash)のようにBIOSが機能しない事態に陥った際の修復に役立つ他、corebootやSlim Bootloaderなどを導入する際にもしばしば必要となる。
この文書はRaspberry Pi Advent Calendar 2023の12月12日分の解説でもある。
この文書で解説する作業は製品の保証を無効にする可能性があります。
筆者は、契約行為、不法行為、その他、この文書に起因または関連し、あるいはこの文書に記載された内容の実施またはその他の扱いによって生じる一切の請求、損害、その他の義務について何らの責任も負わないものとします。
今回、私はLenovo ThinkPad X200にcorebootを導入するため、SPIによるフラッシュメモリ読み書きツールとしてRaspberry Pi 2 Model B V1.1を使用した。
ThinkPad X200のBIOSが書き込まれているフラッシュメモリICはパームレストの下にある。ICは8ピンまたは16ピンで、そのどちらであるかによって必要な道具が異なるため、道具を購入する前にキーボードとパームレストを外して確認する必要がある。
Raspberry PiとmicroSDカード、キーボード、モニター等の他に以下の道具を用意する。
- 対応するピン数のICテストクリップ。Pomona ElectronicsのSOIC Clipシリーズであれば、5250が8ピン、5252が16ピンのICに対応する。
- ジャンパーケーブル。(少なくとも6本)
- 虫眼鏡
作業直前に上着を脱ぎ、静電気を逃がしておく。
PCとRaspberry Piの電源を抜き、PCからバッテリーを外す。
前準備と同じようにキーボードとパームレストを外して、フラッシュメモリIC周辺の絶縁シートを剥がしてICを露出させる。このとき、シートをすべて剥がすのではなく、IC周辺だけめくるようにしておくと元に戻すのが楽。
IC(12月12日分の写真1枚目)表面の刻印を虫眼鏡で拡大しつつ頑張って読む。部分的にでも読めたらウェブで検索して似た写真を探す。私のものはどうやらMX25L6405D(16ピンSOP)らしいと判明した。
型番がわかったらウェブで検索してどのピンがVCC、GND、SCLK、CS、MISO、MOSIなのかを理解する。Librebootの解説ページが参考になる。
ピンアサインに確信が持てたら、PCにもRaspberry Piにも電源が接続されていないことを再確認してから、先ほどリンクしたページを参考にRaspberry PiのSPIに使うピン(2BならGPIO08からGPIO11)と3.3V、GNDをICの対応するピンにテストクリップ経由で接続する。
Raspberry Piに電源を繋ぎ、Raspberry Pi OSにログインする。そして、sudo modprobe snd_bcm2835
とsudo modprobe spidev
を実行する。
flashrom
パッケージをインストールし、sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=10000 -V
を実行する。もしEEPROMが見つからないというエラーが出たら、フラッシュメモリICとの接続がうまくいっていない。Raspberry Piをシャットダウンして電源を抜き、テストクリップでICを挟み直して起動とmodprobeからやり直す。
sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=10000 -c MX25L6405D -r stock_bios01.rom
を実行する。ただし、-cの後の部分はICによって違う。EEPROMが見つからなかったらRaspberry Piをシャットダウンして電源を抜き、テストクリップでICを挟み直して起動とmodprobeからやり直す。
同じようにsudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=10000 -c MX25L6405D -r stock_bios02.rom
、sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=10000 -c MX25L6405D -r stock_bios03.rom
を実行する。途中で失敗したらRaspberry Piをシャットダウンして電源を抜き、テストクリップでICを挟み直して起動とmodprobeからやり直す。
sha256sum stock_bios*.rom
を実行する。各ファイルのハッシュ値が異なる場合、フラッシュメモリICとの接続が不安定。Raspberry Piをシャットダウンして電源を抜き、テストクリップでICを挟み直して起動とmodprobeからやり直す。
hexdump -C stock_bios01.rom | less
を実行する。ひたすら00が連続していたりffが連続していたりしたら読み出しに失敗している。Raspberry Piをシャットダウンして電源を抜き、テストクリップでICを挟み直して起動とmodprobeからやり直す。
stock_bios*.romをどこかにコピーして保管する。
corebootをビルドし(ここが重要だが、この文書でここを説明するとRaspberry Piに関係ない部分の分量が多すぎるので割愛)、coreboot.romをRaspberry Piにコピーする。
sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=10000 -c MX25L6405D -w coreboot.rom
を実行する。最後にVERIFIEDと表示されなかったら書き込みに失敗している。Raspberry Piをシャットダウンして電源を抜き、テストクリップでICを挟み直して起動とmodprobeからやり直す。
すべてに成功したらRaspberry Piをシャットダウンして電源を抜き、ICテストクリップを外してThinkPad X200を組み立て直す。ThinkPadの電源を入れて、正常に起動したら作業完了。
Raspberry PiによるBIOSフラッシュメモリの読み書きについて、その手順を手短に紹介した。
繰り返しになるが、このような作業はPCを利用する上で通常は必要ない。BIOSが破損したら修理に出すか買い替えた方が時間の節約になるし、corebootなどの導入も可能なら他人に任せた方が無難である。
もし、万が一、自分でこのような作業をする必要に迫られた際は、時間に余裕があるとき、綺麗に片付いた机の上で、適度に休憩を挟みながら行うことを強く推奨する。