概 要
NORドライバは、ファイルシステム層がNORフラッシュデバイスとの間でデータブロック(論理セクタ)を効率的に書き込みおよび読み出すことを可能にする。NORフラッシュデバイスへのアクセス、NORフラッシュデバイスの識別、NOR物理ブロックの消去、ページ単位でのデータ書き込みなどの詳細はすべて、NORドライバによって内部的に管理されます。NORフラッシュデバイスは、0ベースの論理セクタインデックスによって識別される論理セクタのアレイとして上位ファイルシステム層に提示されます。
emFileには、2つの異なるNORドライバが付属しています。
・ ブロックマップNORドライバ
・ セクターマップNORドライバ
ブロックマップNORドライバは、高速書き込み操作のためにセクタマップドライバを使用している間は、RAM使用量を減らすように設計されています。両方のドライバが同じNORフラッシュデバイスをサポートするので、NORドライバの選択は、メモリ使用量と書き込みパフォーマンスとの間のトレードオフです。
動作
〈操作理論〉
このセクションを理解するには、「論理セクタ」または「ブロック」と「物理セクタ」を区別することが非常に重要です。論理セクタ/ブロックは、任意のファイルシステムの基本単位であり、通常のサイズは512バイトです。物理セクタは、一緒に消去される(通常2Kバイト〜128Kバイトの間の)フラッシュチップ上のバイトのアレイである。フラッシュ・チップ・ドライバは、これらの2つのタイプのセクタ間の抽象化層である。論理セクタが更新される度に、無効とマークされ、このセクタの新しい内容がフラッシュの別の領域に書き込まれる。物理アドレスと論理セクタの順序は、書き込みアクセスごとに変わる可能性があります。したがって、論理セクタインデックスとその物理的位置との間には直接の関係は存在し得ない。フラッシュドライバは、論理セクタインデックスを特別なヘッダに書き込むことによって管理します。論理セクタが格納されているか、フラッシュメモリがどれだけバッファとして使用されているかは、上位レイヤには関係ありません。すべての論理セクタ(セクタインデックス0から始まる)は常に存在し、ユーザアクセスのために常に利用可能である。
〈ウェアレベリング〉
NORドライバは、NORフラッシュデバイスの寿命を延ばすためにウェアレベリングをサポートしています。摩耗平準化は、各NOR物理セクタについて消去サイクルの数がほぼ等しいままであることを保証する。NORドライバは、最小消去カウントを有する物理セクタを追跡し、その消去カウントと消去されるように選択された物理セクタの消去カウントとの間の差異をチェックする。その差が設定された値を超える場合は、消去回数が最も少ない物理セクタが代わりに使用されます。この方法では、定数データを含むNOR物理セクタも均等に消去されます。
〈フェールセーフ動作〉
emFile NORドライバはフェールセーフです。つまり、ドライバはアトミックなアクションのみを行い、ファイルシステムによって管理されるデータが常に有効であるという責任を負います。書き込み動作中に停電や電源リセットが発生した場合、有効なデータのみがフラッシュに保存されていることが常に保証されます。電力損失によって書き込み操作が中断された場合、古いデータは保持され、破損しません。
フェールセーフ動作は、予期しないリセット前にNORフラッシュデバイスがCPUから受信した最後の書き込み動作を完全に完了できる場合にのみ保証されます。これは、NORフラッシュデバイスの電源電圧が、CPUがリセットに入ってから数百マイクロ秒間有効でなければならないことを意味します。書き込み動作の正確なタイミングは、NORフラッシュデバイスのデータシートから取得することができる。NORフラッシュセクタの消去動作は、予期せぬリセットによって中断される可能性がある。NORドライバは、NORフラッシュセクタが完全に消去されていない低レベルのマウントを決定することができる。影響を受けるNORフラッシュセクタは後で再び消去されます。
〈ガベージコレクション〉
ドライバは、書き込み操作中に自動的にガベージコレクションを実行します。空の論理セクタがデータを格納するために利用可能でない場合、無効とマークされた論理セクタのデータを消去することによって新たな論理セクタが作成される。これには、NORフラッシュの特性に応じて、潜在的に完了までに長い時間を要することがあるNOR物理セクタ消去動作が含まれ、そのために書き込みレイテンシが低減される。最小の書き込み待ち時間を必要とするアプリケーションでは、ファイルシステムがアイドル状態のときにアプリケーションでガベージコレクションを実行できます。
〈コードとデータにNOR Flashを使用〉
ほとんどのNORフラッシュは、プログラム、消去、または動作の識別中に読み出すことはできません。これは、プログラムまたは消去操作中にNORフラッシュからコードを読み取ることができないことを意味します。プログラムまたは消去中にデータ記憶に使用された同じNORフラッシュにあるコードが実行されると、プログラムのクラッシュはほとんど確実です。これを解決する複数のオプションがあります:
・ 複数のNORフラッシュデバイスを使用します。コード用とデータ用の1つのデバイスを使用します。
・ 複数のバンクを持つNORフラッシュデバイスを使用すると、バンクBのプログラム中にバンクAを読み取ることができます。
・ NORフラッシュをプログラム、消去、または識別するハードウェア・ルーチンがRAMにあり、割り込みが無効であることを確認してください。
〈NORフラッシュデバイスの識別〉
NORフラッシュデバイスの識別は、NORフラッシュデバイスに格納された情報を使用して実行される。これにより、NORフラッシュ装置自体から識別情報を読み取ることによって、異なるNORフラッシュ装置に同じドライバを使用することが可能になる。識別方法は、使用されるNORフラッシュデバイスのタイプ(パラレルまたはシリアル)によって異なります。
CFI(Common Flash Interface)は、通常、並列NORフラッシュデバイスに実装され、NORドライバは、この情報を使用してメモリサイズ、バイト/ワード構成、ブロック構成などを決定することができる.FIFIは、自社のデバイスのフラッシュメモリベンダーが自由に使用できます。
シリアルNORフラッシュデバイスは、シリアルフラッシュ検出可能パラメータ(SFDP)情報を介して、またはこの情報がデバイスIDを介して利用可能でないときに識別されます。SFDPはまた、シリアルNORフラッシュデバイスがメモリサイズ、物理セクタサイズ、シングル、デュアルまたはクワッドモードでの読み出しのためのコマンドコードに関する情報を提供することを可能にするオープン仕様でもある。
〈設定例〉
次のサンプルは、シリアルNORフラッシュデバイスにアクセスできるブロックマップNORドライバを構成する方法を示しています。NORドライバは、ドライバタイプをFS_NOR_BM_Driverに設定してFS_AddDevice()関数を呼び出すことによって、ファイルシステムに追加されます。 FS_X_AddDevices()関数は、ファイルシステムの初期化時に呼び出されると、すべてのファイルシステムの構成は、ここで場所を取るために持っています。ストレージとして使用されるNORフラッシュデバイスの領域は、FLASH_BASE_ADDR、FLASH_START_ADDR、およびFLASH_SIZEによって構成されます定義する。このサンプルでは、NORフラッシュデバイス全体がストレージとして使用されていますが、ブートローダなどの他の目的のために領域を予約することは可能です。このサンプルの論理セクタは512バイト(BYTES_PER_SECTOR)で構成されていますが、他のセクタサイズもNORドライバでサポートされています。