Raspberry Piを使ってBIOSが飛んだマザーを修理したお話

Raspberry Pi Advent Calendar2015 7日目の投稿です

**※前半はRaspberry Piと無関係なUEFIの話が続きます。興味のない方は下にスクロールして飛ばしてください**
***

**事のはじまり**

それは11月某日に起きた事件だった
ぼく「このPCをWin10にしてからスリープ入らないしシャットダウンしても電源切れないんだけど」
天の声「BIOSアップデートすればいいんじゃないですかね」
ぼく「それだ！」

PCのOSをWin10に変える時に、せっかくだからUEFIでインストールしようぜ！ とインストールしたはいいものの
スリープに入らない（というか項目が消えた）
シャットダウン時に電源が落ちない（OSは落ちてHDDの電源は切れる、昔のPCで「電源を切る準備ができました」って表示されて止まったのと同じ感じ）
といった感じに不具合が出ていた。

以前、別のPCをUEFI+Windows10にした時も同じ状態になっていて、原因を考えてみた。

この2台のPCのに共通する事は

- UEFIでWindows10をインストール
- 両方ともSandyBridge世代、ただし片方はH61チップセット、片方はC206チップセット
- UEFIをサポートしてはいるが、SecureBootやFastBootに関する設定がない


ここから推測してみた

- Intel 6シリーズはUEFIブートをサポートしてはいるものの、Win8が要求するUEFIとはバージョンが違う説

これについては、MSDNにて資料を発見
[https://msdn.microsoft.com/ja-jp/library/hh824898.aspx](https://msdn.microsoft.com/ja-jp/library/hh824898.aspx)


Windows10の記述はないけど、だいたいWindows8と同じ・・・だと思う

- Windows8はUEFI 2.0以降であればとりあえず起動する
- SecureBootを利用するためにはUEFI2.3.1（2011年4月制定）が必要



後で分かった事だが、UEFIのバージョンはスリープしない病とはあまり関係が無かった模様
2010年製造のHP Probook 4520sにUEFIでWin10を入れているがスリープもシャットダウンも問題なかったため。
Intel 6シリーズ製品に初期搭載されているUEFIのACPI周りに問題がある可能性が高い。

ちなみにHPは2008年からノートPCでUEFIブートをサポートしてる。詳細なUEFIドキュメントを公開しているので、興味ある方は御覧ください
http://h20566.www2.hp.com/hpsc/doc/public/display?docId=emr_na-c03774279

使用しているPCのUEFIを調べたら、2011年2月リリースのUEFIが搭載されていたのでUEFI2.3.1以前のバージョンを使用していた事がわかった
もしかしたらメーカーがUEFIアップデートを配布していて、UEFIのバージョンを上げることができるかもしれない

**UEFIを更新してみた**
使用しているマザーはFoxconn H61MX（実際の型番はH61MXT1/F2/-S/-VとかいうOEM向けカスタム品）
製造元のFoxconnサイトを調べてみたら、ご丁寧に「Update code to support WIN8.1」の記述があるUEFIが置いてあった。
ただ、直接最新のUEFIに上げる事ができないらしく、適当なバージョンのUEFIに一度アップデートする。これは成功

次に本命の最新UEFIにアップデートしてみる。SDカードをフォーマットし、ファイルを配置する。
マシンを再起動し、アップデート用SDからブート、何故か現れるWindows98のブート画面
Windows98のDOSを配布して大丈夫なんですかね（小声）

・・・しばらく待ってもWindows98のブート画面から進まない。
どこかでコケたんだろうと思い、PCの電源を落として再度投入する。しかし、待てども待てどもディスプレイは真っ黒だった

**どうやらブート画面の裏でファームウェアの更新が進んでいた模様**

更新中のプロンプトをブートロゴで隠す不親切なFoxconnに頭を抱えるが、最後のスイッチを押したのは自分。
ファームウェアの更新は自己責任、やっちまった・・・
頭を抱える。


***

**ここからRaspberry Pi Advent Calendarの本題**
飛んだファームをどうにかして復活できないかGoogle先生に尋ねると、救いの手を差し伸べられた

Hardware Flashing with Raspberry Pi
https://github.com/bibanon/Coreboot-ThinkPads/wiki/Hardware-Flashing-with-Raspberry-Pi

nWorld Raspberry PiでBIOSを焼いてみた。
http://firtel.blogspot.jp/2014/01/raspberry-pi-bios-recovery.html

Raspberry PiのGPIOにEEPROMを接続してFlashingできちゃうぜ！ という事らしい
**こ　れ　だ**

焼くために必要なものを揃える

- Raspberry Pi本体。今回はPi1 B+を使用した。GPIOは互換性があるので、Pi2でもいける、と思う
- 焼くEEPROM マザーから引っこ抜きます。足が脆いのでIC引き抜き器の使用を推奨。
　非ソケット式でEEPROMを外せない場合はテストクリップを使うか直接配線しよう。
- ブレッドボードと配線用の線材

作業用のシステム構成
Raspberry PiのOSはNOOBSでインストールしたraspbianもといDebian8 Jessie
今回はOS X YosemiteをインストールしたiMacからSSHで作業を行った


必要なものを揃えたら配線する
上のgithubの情報を見ると、GPIOのピンをEEPROMの各信号ピンにそのまま接続すればいいらしい

EEPROMのどの足がどの信号に対応しているのか調べる為に、EEPROMのスペックシートを探す
今回使用したROMは**Winbond W25Q32**で、GitHubの画像とまんまピン配置が同じだったので、画像の通りに接続した

Piピン番号	EEPROMピン番号
17(3V3)		3(WP#/ACC) 7(HOLD) 8(VCC)
19(GPIO10)	5(D1)
21(GPIO9)	2(D0)
23(GPIO11)	6(SCK)
24(GPIO25)	1(CS)
25(GND)		4(GND)

画像はGitHubより拝借
![687474703a2f2f692e696d6775722e636f6d2f325a39747665522e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/33416/2c685176-f71e-0f82-71e7-1f73cec48c30.png)

こんな感じで対応するピン同士を

![687474703a2f2f692e696d6775722e636f6d2f576b4e764f55792e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/33416/3bbd9a41-32f6-b93a-c855-f8a1648dbbe0.png)


![CUrEWwUUAAALSTE.jpg](https://qiita-image-store.s3.amazonaws.com/0/33416/85d721d8-03d2-d409-0119-947093eda924.jpeg)
こんなふうに配線

配線したらRaspberry Piを起動する。
配線が間違っていないか、どこかショートしていないか、火を吹かないか等心配しながら電源投入する

何もトラブル無くRaspberry Piが起動したので、EEPROMをFlashする為に必要なツールを導入する
ターミナルを立ち上げてrootにユーザーを切り替え、次のコマンドを実行する

```bash:shell.sh
apt-get install build-essential pciutils usbutils libpci-dev libusb-dev libftdi1 libftdi-dev zlib1g-dev subversion
svn co svn://flashrom.org/flashrom/trunk flashrom
cd flashrom
make
make install
```

次に、焼きたいROMを持ってくる。今回はMacでダウンロードしてSCPでRaspberry Piに転送した

```bash:shell.sh
user@mac # scp BC1F1P08.BIN root@192.168.1.26:/tmp/bios.rom
```

いよいよROMを焼きます。まずはROMの中身をErase

```bash:shell.sh
flashrom -E -V -p linux_spi:dev=/dev/spidev0.0
```

ここで/dev/spidev0.0が存在しないとエラー発生。

Raspbianでは、ROM焼きに使うSPIなるものがデフォルトでは有効になっていないらしい。
raspi-configコマンドを叩いて、Advanced Option -> A5 SPIを選択して再起動すれば有効になった
画像はwww.raspberrypi.orgより拝借
![raspi-config-audio.png](https://qiita-image-store.s3.amazonaws.com/0/33416/04eaf22d-9c66-8bd4-fe81-77309877ef15.png)


再起動したらもう一度初期化を実行

```bash:shell.sh
flashrom -E -V -p linux_spi:dev=/dev/spidev0.0
```

![CUmDn8DUsAAKyRN.jpg](https://qiita-image-store.s3.amazonaws.com/0/33416/534635a0-8786-ba5c-d477-6a46918286b4.jpeg)

ROMの初期化に成功！

初期化が完了したらいよいよROM焼き。Verifyも同時にしているらしく、結構時間がかかった

```bash:shell.sh
flashrom -w bios.rom -V -p linux_spi:dev=/dev/spidev0.0 -c
```


![CUmC4ZqUcAADXrU.jpg](https://qiita-image-store.s3.amazonaws.com/0/33416/1d3e1c17-458d-578a-826c-c33263df9dd9.jpeg)

ROM焼きの様子


コマンドが完了したらRaspberry Piをシャットダウンし、EEPROMをマザーに挿し直す

そして・・・


![CUmGf_1UkAAeXaf.jpg](https://qiita-image-store.s3.amazonaws.com/0/33416/eff04fdd-ee11-773d-1fe9-b74db89d7a62.jpeg)

復活！！！


![CUmG9TlVEAApTls.jpg](https://qiita-image-store.s3.amazonaws.com/0/33416/6e5f02bd-e651-554f-79e8-f3360abb22a2.jpeg)

右手を上げて勝利のガッツポーズをしている様子.bin


最新版のROMをFlashしましたが普通に通りました。
この後Win10を立ち上げてテストしたところ、スリープもシャットダウンも正常に動くようになって大満足

今回はBIOS ROMを焼きましたが、普通にEEPROM焼き器として流用できそうです

以上、Raspberry Pi Advent Calendar 2015 7日目の記事になります。