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
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)
こんな感じで対応するピン同士を
配線したらRaspberry Piを起動する。
配線が間違っていないか、どこかショートしていないか、火を吹かないか等心配しながら電源投入する
何もトラブル無くRaspberry Piが起動したので、EEPROMをFlashする為に必要なツールを導入する
ターミナルを立ち上げてrootにユーザーを切り替え、次のコマンドを実行する
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に転送した
user@mac # scp BC1F1P08.BIN root@192.168.1.26:/tmp/bios.rom
いよいよROMを焼きます。まずはROMの中身をErase
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より拝借
再起動したらもう一度初期化を実行
flashrom -E -V -p linux_spi:dev=/dev/spidev0.0
ROMの初期化に成功!
初期化が完了したらいよいよROM焼き。Verifyも同時にしているらしく、結構時間がかかった
flashrom -w bios.rom -V -p linux_spi:dev=/dev/spidev0.0 -c
ROM焼きの様子
コマンドが完了したらRaspberry Piをシャットダウンし、EEPROMをマザーに挿し直す
そして・・・
復活!!!
右手を上げて勝利のガッツポーズをしている様子.bin
最新版のROMをFlashしましたが普通に通りました。
この後Win10を立ち上げてテストしたところ、スリープもシャットダウンも正常に動くようになって大満足
今回はBIOS ROMを焼きましたが、普通にEEPROM焼き器として流用できそうです
以上、Raspberry Pi Advent Calendar 2015 7日目の記事になります。