anago 相当の flash programmer を mruby で作ってみようとしました. anago で最近気になったことを直してみようと調べてみました.
- GUI でデバイスを動かすときにスレッドをまともに扱っていない → 適切な直し方は知っているが C++ でつくるのめんどい
- flash programming で ROM image が 2 の n 乗ではないとかけない → ROM としてありえない数値なので解釈に困るので手動で補正するしかない
- flash device ID を拾えないか → 後述
- chip erase ではなく sector erase を使えないか → 後述
ROM dump はそんなに難しくないのですが flash programming で昔見てた AM29F040B, W29C040 などのデバイスを確認してます. flash の command 関連は当時のわたしが面倒そうだから実装しなかったと推測していたですが、デバイスによって仕様がかなりバラバラで実装が不可能なのが事実でした...
SPI ではなくパラレルの flash は +12V がいるのは除外して +5V だけのものでも西暦 2000年以前に設計された古いものがあり、コマンド体型が統一されていないので難しいです. 当時(2009年頃)、ファミカセに flash memory を載せる実験をしたきっかけはその5年前にバイト先で廃棄するだったパソコンのマザーボードに BIOS 用に載っていた W29C020 を拝借したことから始まります*1.
実験に成功した後 AM29F040B が新品で手に入ることを知り、秋月電子でも EN29F002 と MX29F040 が売っていることを知り...そんな流れです.
flash device ID を拾えないか
1998年設計の W29C040 には command で flash device ID を得る方法がありません. device ID 取得には 12V が必要の上、アドレスバスを全ビットを適切に入力する必要があります.
sector erase を使えないか
AM29F040B と MX29F040C は sector size が 0x10000 bytes 均一です.
W29C040 には sector erase はありません.
EN29F002 は sector の並びが均一ではない上、上位ビットはファミカセ基板で楽に配線できる方をつなげと当時指示を書いたので入力したアドレスバスから sector を指定/把握する方法がありません.
SST39SF040 は sector size が 0x1000 bytes 均一のようです. データシートにあまり細かく書いてありません. このデバイスがなぜか一番供給が安定しているみたいなのですが、コマンドアドレス幅が広いとかで癖があります.
導ける答え
- command を打たずに address: device ID の data を取得する
- command を打って同じ address を取得して値が変わったら command から device ID を取得する
- device ID を取得不能な場合は手動入力の上 chip erase をする
- W29C040 は chip erase がいらない
- device ID でも EN29F002 は chip erase
- AM29F040B 系と SST39SF040 系は sector size を見ながら sector erase + program
こんなところでしょうか...?
*1:許可をもらって拝借しました