flashromの使い方

[SPIなFlash](http://qiita.com/yamori813/items/89562bade8460ad654c5)に[U-Boot](http://qiita.com/yamori813/items/c53cf7379fe018327180)を焼く際に[flashrom](https://www.flashrom.org/Flashrom)というオープンソースを使っているが、たまにしかやらないので忘れるので、使い方のメモを残しておく。

[ビルド方法](https://qiita.com/yamori813/items/e4f918630d8c9d46c812)

flashromはオンボードじゃないプログラマーではSPI,パラレル,LPC,FWHの焼き方に対応しているが、SPIのサポートがもっとも多い。デバイスはパラレルも多いのだが、ピン数が多いのでSPIのように手軽には扱えないし、プログラマーも限られている。LPC,FWHは対応しているデバイスがかなり限定されている。

flashromではいろいろなライターに対応していますが、spi flashの書き込みには入手しやすく書き込み速度も速いFTDIのチップの利用がお勧めです。

flashromのFTDIのサポートはHiスピードなMPSSEなチップのみなのでFT2232HやFT232Hを利用する必要があります。

下記はFT232Hとaitendoの変換基板を使ったMX25L6405などのSOP8に対応した、自作FT232Hな書き込みモジュールです。ZIFソケットちょっと高かったですが、クリップでやっているとエラーが多くて時間がかかるので購入しました。

<a data-flickr-embed="true"  href="https://www.flickr.com/photos/14000636@N03/25393992650/in/dateposted-public/" title="IMGP0279"><img src="https://farm2.staticflickr.com/1554/25393992650_6e6b0fa3e0_m.jpg" width="240" height="180" alt="IMGP0279"></a><script async src="//embedr.flickr.com/assets/client-code.js" charset="utf-8"></script>

ZIFソケットをつけた基板は細ピンでFT232Hの基板は通常のピンソケットにしていたところ、接触がわるくなり細ピンから普通のピンヘッダーにする基板をかまして使っています。秋月には細ピン用と通常の太いピンヘッダー用のピンソケットがありました。

FlashとFT232Hとの接続は以下のようになっています。

|Flash 8-PIN|Flash 16-PIN| |FT232H| |
|:--|:--|:--|:--|:--|
|1|	7| CS#	|CTS#	|ADBUS3|
|2|	8| SO/SIO1	|RTS#	|ADBUS2|
|3|	9| WP#/ACC	|3V3	| |
|4|	10| GND	|GND	| |
|5|	15| SI/SIO0	|RXD	|ADBUS1 	|
|6|	16| SCLK	|TXD	|ADBUS0 	|
|7|	1|HOLD#	|3V3	|	|
|8|	2|VCC	|3V3	|	|

私の環境は初代MacBook Airの雪豹を使っています。

とりあえず起動

```
$ ../flashrom -p ft2232_spi:type=232H 
flashrom v0.9.7-r1711 on Darwin 10.8.0 (i386)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
Found Macronix flash chip "MX25L1605" (2048 kB, SPI) on ft2232_spi.
Found Macronix flash chip "MX25L1605A/MX25L1606E" (2048 kB, SPI) on ft2232_spi.
Found Macronix flash chip "MX25L1605D/MX25L1608D" (2048 kB, SPI) on ft2232_spi.
Multiple flash chip definitions match the detected chip(s): "MX25L1605", "MX25L1
605A/MX25L1606E", "MX25L1605D/MX25L1608D"
Please specify which chip definition to use with the -c <chipname> option.
```

データの読み出し

```
$ ../flashrom -p ft2232_spi:type=232H -c "MX25L1605A/MX25L1606E" -r rom.bin
flashrom v0.9.7-r1711 on Darwin 10.8.0 (i386)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
Found Macronix flash chip "MX25L1605A/MX25L1606E" (2048 kB, SPI) on ft2232_spi.
Reading flash... done.
```

flashromは8MのFlashに2Mのイメージを書き込もうとするとエラーになるので、読み出したデータを書き込みするFlashのサイズに合わせ変更します

```
$ dd if=rom.bin of=rom_8m.bin ibs=8m conv=sync
```

書き込み

```
$ ../flashrom -p ft2232_spi:type=232H -c "MX25L6406E/MX25L6436E" -w rom_8m.bin 
flashrom v0.9.7-r1711 on Darwin 10.8.0 (i386)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
Found Macronix flash chip "MX25L6406E/MX25L6436E" (8192 kB, SPI) on ft2232_spi.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.
```

U-Bootで先頭のU-Boot自体の後に設定がありそれ以降が空きスペースの場合、この方法で大きなFlashに変えて使えるかもしれませんが、RedBootはFlashのサイズをハードコードしているのでRedBoot自体を再ビルドしないとFlash全体を利用する事ができません。

bootloderを作るためにSOP16なFlashをはがしてDIP8なソケットにしてみた。

![写真（2018-06-13 10.07）.jpg](https://qiita-image-store.s3.amazonaws.com/0/104066/ad442775-50b0-3dd0-878c-8b53d33fbac1.jpeg)

SOPなパターンははげやすいので、DIP側を先にワイヤーのハンダ付けするのがこつです。

# Arduinoを使ったライター

Arduinoをライターにする[frser-duino](https://github.com/urjaman/frser-duino)というコードがあったので、試してみました。3.3Vのクロックが8MのArduino Proで試しました。

githubからcloneしていくつか修正しました。クロックが遅いためかデフォルトの115200ではうまくいかず、57600に落としてあります。

* MakefileのCFLAGSによくわからないオプションが設定してあり、リンクでこけていたので削除
* MakefileのFRBAUDを57600に変更
* CFLAGSに-DRAMSTART=0x100を追加
* Makefileのavrdudeにconfファイルの場所の指定を追加
* main.cのF_CPUを8000000ULに変更

とりあえずこれで動くようになりました。接続は以下の通りです。

|Flash 8-PIN|Flash 16-PIN| |Arduino|
|:--|:--|:--|:--|
|1|	7| CS#	|10|
|2|	8| SO/SIO1	|12|
|3|	9| WP#/ACC	|3V3	|
|4|	10| GND	|GND	|
|5|	15| SI/SIO0	|11 	|
|6|	16| SCLK	|13 	|
|7|	1|HOLD#	|3V3	|
|8|	2|VCC	|3V3	|

```
$ ./flashrom  -p serprog:dev=/dev/cu.usbserialDA0059MQ:57600 -c "MX25L1605A/MX25L1606E" -r test.bin 
flashrom v0.9.7-r1711 on Darwin 10.8.0 (i386)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
serprog: Programmer name is "frser-duino"
Found Macronix flash chip "MX25L1605A/MX25L1606E" (2048 kB, SPI) on serprog.
Reading flash... done.
```

2Mのflashを読むのに365秒もかかってしまいます。FTだと18秒くらいなので、かなり遅いです。


# パラレルFlashライター

注意：Flashによるのかとっても不安定です。

パラレルの書き込みがおこないたくなり、flashromのページにリンクがあった[frser-atmega88](https://github.com/urjaman/frser-atmega88)を試してみた。frser-duinoと同じライブラリを使っている模様である。回路図が無かったので、いったん回路図を起こしてみた。

![parawiter.png](https://qiita-image-store.s3.amazonaws.com/0/104066/8fefc02d-468f-00c3-7b33-a2d8e36a668b.png)

データとアドレスは省略してあります。またFlashは適当なものをいれてあります。これをArduinoのユニバーサル基板で作ってみました。

31ピンはWE#になります。1ピンはA18かRESETかNCになるので、A18の場合は164にRESETの場合はVCCに接続します。

パラレルFlashは古いものも多く、認識できないケースも多いです。

![IMGP0018.JPG](https://qiita-image-store.s3.amazonaws.com/0/104066/6b0fdb58-e2d6-43ba-f886-d6d213a9ed8c.jpeg)

PLCC32ソケットのBottom Viewはこのようになっています。

![PLCC32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/72225822-e789-741c-c97e-2eb8dc8f1c64.png)

Flashは古いIntelのNICからはがしたものです。3.3Vなので3.3VのAdruino Proを使ってみました。

余談ですが、最近のパラレルのFlashは薄くて細長い表面実装(TSOP 0.5mmピッチ)のものがほとんどですが、表面実装になる前は上記の写真の様なPLCCという四角いチップでした。ごく初期にはDIP 600milのものもあったようです。

![FLASHPKG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/7fc1ca52-14e2-9b43-4431-39362fcdd09d.png)

ソースはforkしてちょっと修正してみた。~~(PR出してみました)~~ Platformioでビルドできるようにして[独自路線](https://github.com/yamori813/frser-atmega88)にしました。

```
$ ./flashrom  -p serprog:dev=/dev/cu.usbserial-DA0059MQ:57600     
Mon Oct 10 13:18:15 JST 2016
flashrom v0.9.7-r1711 on Darwin 10.8.0 (i386)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
serprog: Programmer name is "ATMegaXX8 SFR"
Found Atmel flash chip "AT49BV512" (64 kB, Parallel) on serprog.
No operations were specified.
```

64Kの読み込みは21秒でしたが、書き込みに51分4秒もかかります。

# 秋月のEN29F002T

古いCPUを再利用するために5V系のFlashを物色していたところ秋月でEN29F002T（2019年くらいでディスコン）というチップの扱いがあって入手してみた。このチップは1番ピンHiにする必要がある。

```
$ ./flashrom  -p serprog:dev=/dev/cu.usbserial-004012FDA:57600
flashrom v0.9.7-r1711 on Darwin 10.8.0 (i386)
flashrom is free software, get the source code at http://www.flashrom.org

Calibrating delay loop... OK.
serprog: Programmer name is "ATMegaXX8 SFR"
Found Eon flash chip "EN29F002(A)(N)T" (256 kB, Parallel) on serprog.
No operations were specified.
```

実は何かの機器からはがした5VなIntelの初期のFlashが手元にあったんですが、flashromでサポートされていなかったので、いろいろ試していたら、どうも書き込みがループしてしまって、壊してしまったようでした。プログラムのバグでハードが壊れる体験ってなかなかないですよね。。。^ ^;

PROMの頃は5Vと25Vが必要でEPROMになって5V/12Vになり、初期のFlashも5V/12Vが必要でした。上記で試したチップもこのタイプでした。その後EN29F002のような5V単一電源になり、3.3Vなどの低電圧のFlashがでてきました。

EN29F002の書き込みには3時間3分53秒かかった。早くできないかな。。。

layout,imageオプションを使って先頭32Kだけの書き込みにしたら50分54秒になった。(よくよくEN29F002Tのデータシート見たら先頭は64Kブロックなので64Kの書き込みと思われます)layout,imageオプションを付けてもイメージはflash全体のサイズないとダメなのはなんか変だな。

# LPC/FWH

パラレルフラッシュの一部に結線が少なくて済むLPCやFWHとよばれる方法で書き込みできるデバイスがあるようです。flashromでもサポートされているようなのでデバイスが手に入ったら試してみたいと思います。

https://www.flashrom.org/Teensy_3.1_SPI_%2B_LPC/FWH_Flasher

Teensyは高価なので、書きこみ回路は「あんちょこフラッシュＲＯＭライター」が参考にするのが良さそうです。

https://web.archive.org/web/20090711201503/http://park2.wakwak.com/~tkon/konflash.htm

LPC/FWHをサポートしているチップはかなり少ないようです。これはJTAGが普及して、同じように少ない結線での書き込みができるようになったりしたためかもしれません。