P/ECE研究室〜S1C33分室



* Wed Jul 10 00:00:00 JST 2002 Naoyuki Sawa




シリアルコントローラの話題(ほとんどLCDCの話題でしたが)はいったん中断して、今回はフラッシュメモリの話題です。

P/ECEのCPU・S1C33209はフラッシュメモリを内蔵していませんので、これはCPUの機能ではありません。

しかし、念願のオリジナルカーネル実現に向けて、フラッシュメモリは最重要項目の一つ(もう一つはUSB)ですから、

そろそろ手をつけてみることにしました。




例によって例によって例のごとく、僕はフラッシュメモリを直接書き換えるようなプログラムを組んだことがありません。 そこで、P/ECE開発環境に付いてきたフラッシュメモリデータシートを読む前に、まずは日本語の資料で予備知識を付けておくことにしました。 富士通さんの「フラッシュメモリガイドブック」 シャープさんの「フラッシュメモリ」のページ これらの資料によると、P/ECEのフラッシュメモリ・SST社製「SST39VF400A-70-4C-EK」(以下、SST39VF400Aと呼びます)は ・NOR型 ・コマンド方式 ・均等ブロック型フラッシュ のフラッシュメモリに分類されるようです。 「NOR型」というのは半導体の製造方法の一つで、他に「NAND型」「AND型」「DI-NOR型」などのフラッシュメモリがあるそうです。 プログラムを組む上でこれらの違いが影響するようなことはなさそうなので、とりあえず気にしないことにします。 「コマンド方式」はフラッシュメモリの消去や書き換えなどの方法を指していて、他に「スタティック論理方式」があります。 コマンド方式のフラッシュメモリに消去や書き換えを指示するためには、特定のアドレスに特定のデータを特定の順序で書き込む、 といった、一種の隠しコマンド的な手法を採っています。 隠しコマンドの発行手順自体は通常のメモリ読み書きと同じですので、特殊な制御入力端子が要らないのが利点です。 これに対して、専用の制御入力端子を使って消去や書き換えの指示を行うのが「スタティック論理方式」です。 「均等ブロック型フラッシュ」は、フラッシュメモリ全体をいくつかのブロックに等分し、ブロック単位で消去が行えるフラッシュメモリです。 P/ECEでは、ファイルシステムの“セクタ”が、ブロック単位に相当します。(もっと大きな単位もありますが、P/ECEでは使われていません) その他の消去タイプとして、全体を一気に消去することだけが可能な「チップ一括消去フラッシュ」、 先頭部分のいくつかのブロックだけを特別扱いして、不意の消去・書き換えから守る「ブートブロック型フラッシュ」があります。 P/ECEのフラッシュメモリも先頭部分にブート用の緊急カーネルが入っていますが、「ブートブロック型フラッシュ」ではないので、 緊急カーネルの部分は特別に保護されたりしていません。 P/ECEカーネルのフラッシュメモリAPIを使う場合は、APIがアドレスを検査して、緊急カーネル部分の消去・書き換えを防いでくれています。 APIを通さず、直接フラッシュメモリの消去・書き換えを行った場合は、他のブロックと全く同じ手順で消去・書き換えできてしまいます。 要注意です。
さてそれでは、SST39VF400AのデータシートとP/ECEカーネルソースを参考に、フラッシュメモリの使い方を見ていきます。 SST39VF400Aは、通常のデータ読み出しモード以外に、四つの特別なモードを持っています。 ・ソフトウェアIDモード ・CFIクエリーモード ・消去モード(チップ消去・ブロック消去・セクタ消去) ・ワード書き込みモード 前半二つは、フラッシュメモリそのものについての情報を得るための機能です。 フラッシュメモリの種類や容量、アクセスタイミングなどを取得することができます。 後半二つは、フラッシュメモリの内容を変更するための機能です。 次回はまず安全な、ソフトウェアIDモードとCFIクエリーモードの実験。 次々回以降に、消去と書き込みの実験を行ってみようと思います。 一足先に、ソフトウェアIDモードのサンプルプログラムを作ってみました。
ソースはこちら ソフトウェアIDモードはフラッシュメモリの内容変更を伴わないので“安全”…と思いきや、意外とそうでもなかったです。 詳しくは次回に。 (…続きます)

nsawa@piece-me.org