2019年1月26日土曜日

Raspberry Pi 1 Model Bを使ってWinbondのflash chipに書き込みしてみた

*** 更新記録 ***

* 2019-01-28 材料、接続方法について追記

*** 更新記録ここまで ***


Raspbianのflashrom v0.9.9-r1954でread/writeできたので記録として。

$ flashrom --version
flashrom v0.9.9-r1954 on Linux 4.14.79+ (armv6l)
flashrom is free software, get the source code at https://flashrom.org

教訓1: flashromで読み書きする時はspispeedを指定しよう (linux_spi時は特に)

教訓2: 面倒でもICテストクリップのピンの対応を確認しよう


動機


* Shuttle SZ170R8のUEFI (BIOS)が飛んだ (飛ばした)時に備えてやり方を知っておきたかった
* ↑ UEFI (BIOS)に含まれているIntel ME関連のcodeを排除したcustom UEFIを作り、書き込んでみたかった
* 普段使ってないRaspberry Pi 1 Model BがあるのでROM焼き器として流用したかった


概要


こんな具合で接続している。

図1 RPi1BとブレッドボードとICテストクリップ

図2 別の角度から

図3 ICテストクリップとSOIC


材料など


Hardware


* Raspberry Pi Model B (RasPi1B) ※ちなみにrev1とrev2があるがどちらかは不明
* microSD card (32GB) ※32GBも要らないのだが適当なものが余っていなかったので
* LAN cable ※Rasbpian install後update & SSHでheadless運用するため
* USB cable (Type A - micro B) ※電源
* USB電源 ※5V 2Aぐらいのもの
* ICテストクリップ for SOIC-8 ※ebayで適当に買った物。400円くらい
* Winbond W25Q64FVSIG ※これも多分ebayで入手。10個で600円ぐらい
* ピンケーブル ※RasPiのGPIO (ピンヘッダ)からブレッドボードに繋ぐメス→オスのものと、ブレッドボードからICテストクリップのソケットに繋ぐオス→オスのもの
* ブレッドボード ※その辺に余っていた物。多分秋月電子で買った200円ぐらいの品
* テスタ (DMM) ※ICテストクリップのピンの対応を調べるのに使う

Software


* Raspbian Stretch Lite ※2019-01の最新版stable
* flashrom v0.9.9-r1954 ※Stretchに含まれるversion
* 書き込むUEFI/BIOSのimage file ※場合によっては.exeなどから取り出す必要あり


接続方法


具体的な方法は既に他のwebsiteでなされているので省略。要点のみ挙げると:

* SPIの最もsimpleな接続方法を使う (dual SPIとかquad SPIとかは使わない)
* W25Q64FVSIGの場合は電源電圧が3.3 V
* W25Q64FVSIGの場合は/HOLDと/WPのpinをpullup (=3V3と接続)しておく (pullupでholdとwrite protectの機能をそれぞれ解除)
* Raspbianの初期状態ではSPIの機能が無効化されているので、raspi-configで有効化しておく


Pitfalls


ICテストクリップの接続先の対応について


非常に当たり前のことなのだが、テストクリップの先のピンが、コネクタ部分のどのピンと対応しているのかを予めテスタで調べておくこと。

これを怠ったが故に間違ったピンを接続し、flash chipから香ばしい臭いが漂ってきた (80〜90度Cくらいにはなっていたようだ)。Flash chipは安いし予備もあるから良いが、RasPiが壊れていたら大変だった。

危うく2019年の「今年破壊したモノ」リスト入りさせる所だった。こういう基本的な所で手を抜くとロクなことがないという実例である。

なお、今回は幸運にもRasPiは勿論、flash chipも破損していなかった (書き込み・読み取り共に正常に完了した)。


spispeed=指定について


Web上にはRaspberry Pi + flashromでW25Q64FV (W25Q64.V)を扱っている記事がたくさんあり、すんなりいくものとばかり思っていた。が、実際に (↑きちんと確認して)接続しても認識すらしなかったので一体何が悪いのか分からなくなった。そんな中でこのpageを見付け、速度が問題なのでは?と気付き、安定性を取って遅いspispeed (512)を指定したらうまく認識するようになった。

cf. [Does not work without spispeed= on RPi · Issue #29 · flashrom/flashrom · GitHub](https://github.com/flashrom/flashrom/issues/29)

要は、高周波をまともに扱えるような配線状況でもないのに最高速度を出して (?)無理するとchipもまともに認識できない、という至極当たり前なことだった訳だ。よって、spispeed=による速度 (kHz)指定が必要となる。

ちなみに、このoptionについて調べると以下のような記述も出て来た:

Flashrom uses the Linux-native SPI driver, which is implemented by flashrom's linux_spi module. To use the RaspberryPi with flashrom, you have to specify that driver. You should always tell it at what speed the SPI bus should run; you specify that with the spispeed parameter (given in kHz). You also have to specify the Linux SPI device, e.g.
flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=1000

cf. [RaspberryPi - flashrom](https://www.flashrom.org/RaspberryPi)

今回は写真 (図1及び図2)の通り、RPiのGPIO headerから一旦ブレッドボードに出して、そこから長さが不揃いのジャンパケーブルでテストクリップに接続している。この非常に残念な接続方法により、datasheetによれば104MHzまで出るらしいが30MHzが限界だった (少なくとも35MHzだと認識せず)。

spispeed=で指定しない場合にどれくらいの値が出ているのかは不明だが、遅い方が読み取り・書き込みできる可能性が高くなるのは言うまでもない。勿論、読み書きの速度も遅くなるが。


Command examples


Flash chipの認識


特にoperationを指定しないと、何のchipとして認識しているかをprobeしてくれる。

$ flashrom --verbose --programmer linux_spi:dev=/dev/spidev0.0,spispeed=30000
...
Probing for Generic unknown SPI chip (REMS), 0 kB: probe_spi_rems: id1 0xef, id2 0x16
Found Winbond flash chip "W25Q64.V" (8192 kB, SPI).
This chip may contain one-time programmable memory. flashrom cannot read
and may never be able to write it, hence it may not be able to completely
clone the contents of this chip (see man page for details).
No operations were specified.

Winbondのflash chip "W25Q64.V"として認識しているのが分かる。W25Q64FVを接続しているのでok。


Flash chipからの読み取り


$ flashrom --verbose --read /tmp/image.bin --programmer linux_spi:dev=/dev/spidev0.0,spispeed=30000

Flash chipから読み取った内容を/tmp/image.binにdumpする。


Flash chipへの書き込み


$ flashrom --verbose --write /tmp/image.bin --programmer linux_spi:dev=/dev/spidev0.0,spispeed=30000

Flash chipへ/tmp/image.binを書き込む。


flashromのcommandsとoptionsについて


$ flashrom --help

で見られる。

$ man flashrom

もある。


参照したwebsites


* [BIOSのアップデートに失敗するなどしてBIOSの内容が壊れ、PCが起動しなくなった場合の対処方法(Raspberry Pi を使用した)](http://www.floatgarden.net/pc/bios_flash_raspberry_pi.html)
* [Raspberry Piを使ってBIOSが飛んだマザーを修理したお話 - Qiita](https://qiita.com/Ellise_MX/items/ed12700dbce31c01b34d)
* [Raspberry Pi(Zero)でASUS Z97-CのBIOSを焼く | 純規の暇人趣味ブログ](https://jyn.jp/raspberrypi-bios-flash/)
* [Libreboot – How to program an SPI flash chip with the Raspberry Pi](https://libreboot.org/docs/install/rpi_setup.html)

0 件のコメント:

コメントを投稿