MEEPROMMERというEEPROMライターの記事がありました。
これを改造してEPROMライターを作ろうと思いつきました。
ROMはPROM->EPROM->EEPROM->Flashと変わってきました。EPROMはチップの真ん中に窓があり紫外線で消去して、高電圧(25V,21V,12V)をかけて書き込むタイプの部品でした。EEPROMは電気的に消せるようになったので、窓はありません。
EPROMは70年代から90年代にかけて主流だったので、かなりの数生産され中古部品で潤沢にあり入手しやすいと思われます。それに比べるとEEPROMが主流だったのはFlashが出てくるまでの5年程度の期間だったので、生産量はかなりすくなかったと思われます。
DIP 600milのEEPROMは新品を購入できるみたいですが、1000円以上もしてかなり高価です。おそらく同じ容量の中古のEPROMは100円くらいで買えることもあると思います。
大昔の中学生時代にEPROMライターを作ろうとして、いまだに未完成案件になっています。
完成してないのは紫外線のイレーサーの問題があったためでもあるが、今はamazonやaitendoさんで安いのがあるので今度購入するつもりだ。
MEEPROMMERのリポジトリはここです。
Hardwareの下に非常に分かりやすく書かれた回路図があります。ターゲットは32KByteのEEPROMの28C256のようです。
こちらのターゲットはまずEPROMの27C256にします。ほぼほぼピンは同じなので回路図に沿ってワイヤリングしていきます。
データーシートを見るといくつかピンが違います。
A14は1ピンから27ピンに変更して、VPPはとりあえずVCCにつなぎます。
これで回路は完成なのでPlatformioの設定ファイルを用意して、Arduinoのスケッチを書き込みます。
ワーニングは出ますがコンパイルできます。ボーレートはflashromが115200でうまく動かなかったので57600に変えました。
ファームの用意ができたのでホスト側のプログラムを用意します。MEEPROMMERはJavaで書かれたGUIのプログラムとPythonのコマンドラインのツールが用意されていました。ところがPythonのスクリプトは不完全なものでした。
しかたないので、Pythonで続きを書こうかと思ったのですが、いろいろ調べていたらMEEPROMMERを大きなEEPROM対応にしている人のところに完全なスクリプトがありました。おそらくどっかのアーカイブにはあってコミットし忘れたのかもしれません。
ちょっと変更されているので、MEEPROMMER向けにバックポートしてみました。
% ./CommandlineClient/meepromer.py -h
usage: meepromer.py [-h] [-w | -W | -r | -d | -v | -V | -S] [-a ADDRESS]
[-o OFFSET] [-b BYTES] [-p PAGE_SIZE] [-f FILE] [-c COM]
[-s SPEED]
Meepromer Command Line Interface
optional arguments:
-h, --help show this help message and exit
-w, --write Write to EPROM
-W, --write_paged Fast paged write to EPROM
-r, --read Read from EPROM as ascii
-d, --dump Dump EPROM to binary file
-v, --verify Compare EPROM with file
-V, --version Check burner version
-S, --signature Check EPROM Electonic Signature (set A9 to 12V)
-a ADDRESS, --address ADDRESS
Starting eeprom address (as hex), default 0
-o OFFSET, --offset OFFSET
Input file offset (as hex), default 0
-b BYTES, --bytes BYTES
Number of kBytes to r/w, default 32
-p PAGE_SIZE, --page_size PAGE_SIZE
Number of bytes per EPROM page e.g.:CAT28C*=32,
AT28C*=64, X28C*=64, default 32
-f FILE, --file FILE Name of data file
-c COM, --com COM Com port address
-s SPEED, --speed SPEED
Com port baud, default 57600
Read source for further information
EPROMはVPPが12Vになった256kBitの頃から部品番号を返す仕組み(シグネチャ)が入りました。メーカーが1バイトで部品番号が1バイトの2バイトになります。256しかメーカーがない平和な時代でした。FlashになるとCFI仕様になり、メーカーと部品番号が2バイトづつに拡張されます。USBも2バイトづつですね。
これを読めるように拡張してみます。まずArudinoのファームウエアーにSを追加して2バイトを読んで返すようにします。
Pythonのスクリプトにもコマンドを追加します。
シグネチャを読み出すにはA9ラインに12Vを加える必要があるので595から切り離して、12Vを加えられるようにします。
% ./CommandlineClient/meepromer.py -S -c /dev/cuaU0
EPROM Signature:
20 8D
ST M27C256B
ST M27C256B*PLCC32
読めました。デバイスハックの一歩目は正しい値が読めるところから始まります。
VPP関係の部品が手元にないので、書き込みについては後日いじります。
まずは27C256で使えるようにして、その後他のチップもサポートしないな。
Type | Pin | Size | VPP | Address | Signature |
---|---|---|---|---|---|
27C32 | 24 | 4K | 21V | A0-A11 | NO |
27C64 | 28 | 8K | 21V | A0-A12 | NO |
27C128 | 28 | 16K | 21V | A0-A13 | NO |
27C256 | 28 | 32K | 12V | A0-A14 | YES |
27C512 | 28 | 64K | 12V | A0-A15 | YES |
MC34063で5Vを昇圧してVPPを作るようにしました。
適当に実装したら、コイルとレバーがギリギリぶつからない状態でした。
まずは64,256をサポートしたい。64はPGMピンがあり256にはない。しかしEEPROMにはPGMと同等のWEが復活している。64のEPROMを動くようにしてから256対応を考えるのが良さそう。