昨日、パラレルFlashのインターフェースを模擬する話を書いたが、
その後、いろいろ考えていたときに気づいたのがセクタサイズが不均一なことである。
そもそもFlashメモリというものは、消去は一定の範囲に一気に行うのが特色である。
ところでEEPROMとフラッシュROMの指すところは少し違うらしい。
EEPROMは電気的に消去・書き込みができるROMを表す言葉で、
今どきマスクROMやUV-EPROMなど作られることは少ないので、ROM=EEPROMと言っても間違いではない。
この点ではフラッシュROMもEEPROMに含まれるのだが、
部品としてのEEPROMはワード単位や比較的少量のデータ単位で読み書きできるものを指す。
これに対してフラッシュROMは一定のまとまりをもったページ単位で消去を行うものを指す。
ちなみにFlashの消去というのはビットを1にすることを指す。
書き込みコマンドではビットを 1→0 にする操作しかできない。
消去は時間がかかるが、書き込みは比較的短時間でできる。
消去を行う範囲で最も広いのがチップ全体である。
とはいえ、チップ全体を消去したいケースばかりではないはずである。
一部データを残しながら、一部データを書き換えたいというニーズもある。
このときに使われる消去単位がセクタである。
シリアルFlashでは1セクタ64kBとなっていることが多いようである。
ただし、後で書く通り、これより細かい単位での消去も可能である。
一方のパラレルFlashなのだが、2タイプのものが売られているそう。
1つはユニフォームセクタ型で、32Kワード単位で揃ったもの。
16bit幅の場合は32Kワードは64kBに相当する。一般的なシリアルFlashと同じだな。
こちらはわかりやすいのだが、もう1つがブート型と呼ばれるタイプで、
先頭あるいは末尾にこれより小さなセクションを設けている。
例えば最初の64kBを 16kB, 8kB, 8kB, 32kB と分けたりしている。
ブートプログラムの格納に適しているらしいが、一体どうやって使っていたんだろう?
小容量のセクションは管理情報の格納などに使っていたのかな?
このセクタ構成というのは品種により多種多様なようで、
Flashを書き換えるプログラムではこの構成を把握しておく必要がある。
そしてパラレルFlashをシリアルFlashに読み替えるときも問題になる。
パラレルFlashのxxxxxx番地からセクタイレースというのは、
必ずしも xxxxxx番地から64kBであるとは限らないからである。
それで次の疑問はシリアルFlashは8kB, 16kB, 32kB消去ができるのかということ。
これは可能でセクタを分割した、サブセクタのような単位があって、
4kB単位と32kB単位での消去にも対応しているようである。
8kB, 16kB消去は4kBサブセクタの消去を2回, 4回行えばよいようだ。
なお、メーカーによっては最小単位の4kBをセクタと呼び、
32kB, 64kBはセクタをまとめたブロックという呼び名を使っていたりする。
というわけで、なんともならないわけではないが、めんどくさいなと思った。
ブート型なんて構造のものがあるとは知らなくて、
現行のROMのアドレスマップを見て、おかしいなというところで気づいた。