今どきの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容量に余裕があったのが救いだろうか。