WiFiのカードを入れ替えようかなと思ってつい魔が差してBIOSを書換をしたが、元に戻すときに失敗してしまい、Bricked状態にしてしまったけど、何とか復旧した話。
最新のBIOSからWiFi whitelistパッチを当てた状態で、beepがなるのがやっぱり気に入らなくて戻そうと思ったが、WINUPTP.EXEは同じバージョンだと書き換えられなくて、 いろいろやっているうちに、-sオプション付き(WINUPTP.EXE -s)で実行した直後に再起動してしまった。
-sは再起動時に書き換えると勘違いしていたが、実際にはバックグラウンドで処理が始まっていたようで、書換え途中の再起動で書換えに失敗。この後何しても起動しなくなってしまった。
さて。本格的に困った。
Webで検索すると、SPIPGMで書き換える方法とflashromで書き換える方法がいくつか出てくる。
SPIPGMはパラレルポートからSPIインターフェースのFlash ROMを書き換えるというもの。うちにはパラレルポートのあるPCがないのですぐには試せず、次のflashromコマンドによる方法がダメだったら試すことにしていったん置いておくことに。
flashromはraspberry pi上のraspbianで動いて、raspberry piのSPIインターフェースがそのまま使えるというので試してみることにした。
とりあえず、X201をばらしてFlash ROMにアクセスする。が、Webでいろいろ見るような足の着いたチップではなく面実装タイプのものでショックを受ける。8ピンというのは同じでランドがチップの外に0.5~1mmくらいはみ出ていたので、そこにはんだ付けして線だしすることにした。どうせ復活しなければ捨てるだけだし、というダメ元の精神で。
はんだ付けして、Raspberry Piにつないだが、OSの入ったSDカードがなかったので、最新のRASPBIAN STRETCH LITE (2018/10/09版)を書き込んで起動。
何はともあれツールがないと始まらないのでflashromをインストール。
$ sudo apt-get install build-essential pciutils usbutils libpci-dev libusb-dev libftdi1 libftdi-dev zlib1g-dev subversion $ sudo aptitude install flashrom
さらにraspi-configでSPIを有効にして再起動。
まずはバックアップ
$ sudo flashrom -p linux_spi:dev=/dev/spi0.0,spispeed=16000 -r ./backup.rom
難なく読み取れた。うまくいきそうな予感。
次に、BIOSアップデートプログラムから$01C2100.FL1を抜き出して、e_bcpvpw.exe でBIOS.WPHに変換するも、flashromではサイズが違うといわれて書き込めない。
(backup.romのサイズ 8,388,608バイトに対して、BIOS.WPHは3,192,510バイト)
サイズが違うということは、flash rom全体を焼くようにしないとだめなのかなと思い、とりあえず最初に抜き出しておいたバックアップのROMイメージ (backup.rom)をバイナリエディタで開き、最後に書いたBIOS.WPHとを見比べてみた。
まず、BIOS.WPH自体はbackup.romの0x00500000 (5MB以降)に何となく埋められているっぽいことが分かった。さらに比較してみると、backup.romの0x00607000~0x0060FFFFの間が0xFFで埋められた状態になっていることに気づいた。このブロックの書換え中に電源を落としてしまったため書換えに失敗したと予想して、backup.romの該当箇所にBIOS.WPHの0x00107000~0x0010FFFFを貼り付けてFlash ROMに書き込んでみた。
$ sudo flashrom -p linux_spi:dev=/dev/spi0.0,spispeed=16000 -w ./new.rom
今度はサイズ違いのエラーも出ず最後まで書き込み完了。
恐る恐る電源を入れてみたら、無事 Think Padのロゴが表示された。成功!!
Windowsを立ち上げ、WINUPTP.EXE -s を実行しBIOSを改めて書き込み、ちゃんと書き込みが終わったことをログで確認してから再起動、起動できることを確認。
今日の朝にやってしまい、いろいろ調べたり試したりで丸一日かけてしまった。
もうBIOSをいじるのはやめようと思った。