パラレルROMに書いたフリ

今どきのFlash ROMと言えばSPIなどのシリアル接続のものが一般的だが、

パラレルバスのFlashというのもあって、今でも古い設計のものでは使われている。


設計変更の中で様々な事情から、シリアルFllashをデータ格納先としながら、

パラレルFlashを操作するプログラムはそのまま使いたいという話があった。

ただ、操作方法がまるで違うわけでパラレルFlashへのライトコマンドなどを、

単純にシリアルFlashのコマンドに変換するという手は取れなくて、

ライトされたデータは一旦RAMに格納するという作戦が採用されることに。

ベリファイ処理ではRAMに格納したデータを確認する形になる。

その後のあるタイミングで、別のサブシステムでRAMに格納されたデータを処理、

最終的にはシリアルFlashに格納するという形になる。


それにしてもパラレルFlashをライトする方法ってどうなってるんだろ?

マジックワードを書き込むとライトできるような話は聞いたけど……

それでデータシートを見ていたのだが、思っていたよりシンプルだった。


パラレルFlashの統一的なインターフェースをCFI(Common Flash Memory Interface)というらしい。

いろいろ調べてみるとU-BootのCFI用のソースコードがあった。

u-boot/drivers/mtd/cfi_flash.c (github)

INTELとかAMDと書いてあって、何かCPUに関係あるのか?

と思ったのだが、NOR Flashを世界に先駆けて投入したのがIntelで、

それに次いで投入したのがAMDと富士通だったらしいですね。


もっともこれらの会社は現在、Flash ROMの製造を行っていない。

AMDと富士通は2003年に両社の合弁会社のSpansionに移管、

その後2015年にCypressに買収、さらにCypressは2020年にInfineonに買収された。

S29……という型名が付いているが、SはSpansionのことでしょうね。

いずれにせよInfineonがAMD系の正統なんですね。

一方のIntelだが、STMicroとともにNumonyxを設立、同社は2010年にMicronに買収されている。

ただ、調べた限りではMicronの現在のFlashもAMD系のコマンドのようだ。


というわけでAMD系を考えればよいわけである。

flash_write_cfiword がライト、flash_eraseがセクタイレースに相当する。

いずれも最初にflash_unlock_seqで2つのマジックワードをライトしてロック解除する。

ライトはその後にもう1つマジックワードをライトして準備完了、

次にライトしたいアドレスにライトしたいデータをライトする。

その後、flash_status_pollで同アドレスをリードして、ライトデータが読み出せるようになるまでポーリングしている。

セクタイレースは、その後にマジックワードを3つライト(うち2つはflash_unlock_seqと同じ)して準備完了、

次にセクタアドレスにマジックワードをライトするとイレースを開始する。

flash_status_pollで同アドレスをリードして0xFF…が読めるまでポーリングしている。


普段はリードするとそのアドレスのデータがリードできるのだが、

ライト・イレース中は特別なデータが読めるようになっている。

ポイントは7bit目がライト中はライトデータの7bit目の反転、イレース時は0であること。

ライト・イレースの完了後は通常のリードができるモードに戻って、

正常にライトが完了すると、ライトデータが読み返せるはずだし、

正常にイレースが完了すると0xFF…が読み出せるはずであると。

ライト・イレース中は少なくとも7bit目は完了後の期待値と違うはずだと。


シンプルに言えばこれで終わりである。

冒頭に書いたのだが、ライトコマンドをRAMへのライトにすり替えるとすれば、

マジックワードがライトされた後のライトアクセスをRAMに投げて即完了、

次にリードしたときにはRAMからデータがリードできればOKということになる。

イレースも少なくともセクタ先頭アドレスに0xFF…をライトしてやれば、

以後はそのデータが読み出せればOKということになる。


ライト・イレース中は少なくとも7bit目は最終結果と不一致になる仕組みだが、他のbitにも意味はある。

6bit目はライト・イレース中はトグルすると記載されている。

リードするたびに6bit目のデータが反転するそうである。

トグルが止まったことを確認することでライト・イレース完了を確認する考えもあるらしい。

5bit目はライト・イレース中は通常0だが、時間制限を超過した場合に1がセットされるとなっている。

7bit目が不一致で5bit目が1だったらエラーという意味なんだろうな。


ピン数削減などの考えもありシリアルFlashを搭載するというのを最初に考えたときは、

パラレルFlashのコマンドをシリアルFlashのコマンドに変換すればいけるはずと本気で考えていたらしい。

しかし、いろいろ無理があったようである。

RAM容量に余裕があったのが救いだろうか。