以下、本発明の実施の形態について、図面を参照しながら説明する。
本発明は、図1に示す構成のメモリカードシステム1に適用される。メモリカードシステム1は、ホストコンピュータ10とメモリカード20により構成される。
上記ホストコンピュータ10は、具体的には図1に示すように、静止画像や音声等の様々なファイルや各ファイルをまとめて管理するディレクトリ等を記憶するハードディスク11と、ハードディスク11等からのファイル等を一旦記憶するRAM(Random Access Memory)12と、3本のラインを介してメモリカード20とのデータの送受信を行う第1のシリアルインターフェース(以下、「第1のシリアルI/F」という。)13と、各回路を制御するCPU(Central Processing Unit)14とを備え、例えばハードディスク11に記憶されている画像や音声等のファイルをディレクトリを用いた階層構造によって管理することができる。
RAM12は、例えばハードディスク11に記憶されているファイルを一旦記憶し、必要に応じてこのファイルをバスを介して第1のシリアルI/F13に供給する。
第1のシリアルI/F13は、3本のラインを介して、メモリカード20にデータを送信したり、メモリカード20に記憶されているデータを受信する。具体的には、第1のシリアルI/F13は、第1のラインを介して、上記制御データやファイルの送信の際のシリアルクロックSCKを送信する。第1のシリアルI/F13は、第2のラインを介して、第1のラインでのファイル又は制御データ等のシリアルデータの切り換えに応じて、そのときの状態を示すチップセレクト信号CSを出力する。さらに、第1のシリアルI/F13は、第3のラインを介して、メモリカード20に書き込むためのファイルや制御データを送信したり、メモリカード20から読み出されたファイルを受信する。
CPU14は、RAM12やハードディスク11のファイルを読み出したり、RAM12等にファイルを書き込むことを制御したり、メモリカード20とファイル等の送受信の制御も行う。例えば、CPU14は、メモリカード20の図示しない誤消去防止スイッチのライトプロテクトがオンになっているかを判定するためのレジスタ命令を発行したり、メモリカード20に対してアドレスを指定して所定のファイルの書込み命令を発行する。
ここで、メモリカード20は、図1に示すように、上記ホストコンピュータ10からのファイルや制御データをシリアルで送受信する第2のシリアルI/F21と、ファイルやディレクトリを記憶するフラッシュメモリ22と、フラッシュメモリ22に記憶されているファイル等の読出し又は書込みを制御するコントローラ23とを備える。
上記フラッシュメモリ22は、例えばNAND型のものであり、図2に示すように、ホストコンピュータ10から送信されたファイルを、消去単位となるブロック(例えば8kバイト又は16kバイト)毎に分割して記憶する。各ブロック0,1,2,・・・,nは、ファイル等を512バイト記憶するデータエリアと16バイトの冗長エリアとによってなる1ページ(=512バイト+16バイト)が集合して構成される。上記冗長エリアには、当該ブロックのデータエリアにあるデータを管理するための分散管理情報が記憶されている。なお、これらの分散管理情報が集合すると集合管理情報(集合管理ファイル)が構成される。集合管理ファイルは、数ブロックで構成されて、全てのブロックのデータの記録状態を一括して管理するものであり、例えばフラッシュメモリ22内の各ブロックの分散管理情報の一部をまとめて管理するビットマップテーブルを備える。
ここで、ファイルは、画像や音声等に用いるユーザファイル形式のものと、システム管理のためのシステムファイル形式のものとがあり、全てに対して所定の論理アドレスが与えられて、フラッシュメモリ22の1以上のブロックのデータエリアにおいて記憶される。
ユーザファイル形式のファイルは、図3に示すように、当該ファイルの属性情報である512バイトのヘッダ部と主情報であるデータ部によって構成される。ヘッダ部は、当該ファイルをメモリカード20内で管理するための情報である128バイトのOSヘッダと、通常のパーソナルコンピュータ等で取扱い可能な汎用的ものであり、必要不可欠な管理情報である240バイトのファイルヘッダと、144バイトのエントリエリアとからなる。また、データ部は、テーブルデータ領域と、4つのエントリデータとを有する。なお、上述の図3に示すデータ部では、4つまでのエントリデータが格納される。すなわち、ユーザファイル形式のファイルは、最大で4つのエントリデータから構成される。また、図3では、エントリデータとして、インデックス,画像データ,2つの補助データを例に挙げたが、特に限定されるものではなく、その他音声データ等であってもよい。
上記OSヘッダは、具体的には図4に示すように、「ファイルID」(2バイト),「ファイルバージョン」(2バイト),「ファイルサイズ」(4バイト),「使用ブロック数」(2バイト),「リンク数」(1バイト),「日付」(8バイト),「メーカー/機種コード」(4バイト),「初期登録ディレクトリ番号」(2バイト),「アプリケーションカテゴリー」(1バイト),「ファイル名」(11バイト),「キーワード登録数」(1バイト),「キーワード文字コード」(1バイト),「キーワード文字列」(32バイト),「0リセットリザーブ」(4バイト),「個別データ」(32バイト)、さらに未使用領域「リザーブ」を有する。
「ファイルID」は、ファイルの種別(用途)を表すものであり、ファイルヘッダにも同様のものがある。「ファイルバージョン」は、いわゆるバージョンナンバーを示すものであり、ホストコンピュータ10やメモリカード20においてこのファイルを処理することができるかを判定するために用いられる。「ファイルサイズ」は、ヘッダ部及びデータ部からなる当該ファイルの全体の大きさをバイト数で示すものである。「使用ブロック数」は、フラッシュメモリ22で当該ファイルを使用しているブロック数を示すものである。「リンク数」は、当該ファイルを参照しているディレクトリ又はファイルの数を示すものである。なお、「リンク数」には、当該ファイルの属するディレクトリも含まれる。例えば、他のディレクトリから参照されていないファイルは、その属するディレクトリのみとリンクしているので、「リンク数」は1である。「日付」は、ファイルを作成した日付又は更新した日付を示すものである。「メーカー/種別コード」は、メモリカード20にファイルを書き込んだ機器のメーカー名及びその機種を示すものである。「初期登録ディレクトリ番号」は、最初に登録したディレクトリ番号を示すものであり、ファイルが別のディレクトリに移った場合でも更新されるものではない。「アプリケーションカテゴリー」は、このファイルが用いられるアプリケーションのカテゴリーを示すものである。「ファイル名」は、ホストコンピュータ10でファイルを管理するときに用いられるファイル名であり、メモリカード20内では特に使用されない。「キーワード登録数」は、登録されたキーワードの数を示すものである。「キーワード文字コード」は、キーワードの文字コードを示したものである。「キーワード文字列」は、キーワード,セパレータを決めて複数指定をすることもできるものである。「0リセットリザーブ」は、書換えの際に必ず0にしておくものである。「個別データ」は、ファイルID毎に管理するためのもので、例えばファイルIDによって決められる用途で用いられるデータであり、利用者が自由に用いることができる。
上記ファイルヘッダは、具体的には図5に示すように、「規格識別データ」(8バイト),「ファイル規格識別データ」(8バイト),「ファイルID」(2バイト),「ファイルバージョン」(2バイト),「アプリケーション作成日付」(8バイト),「アプリケーション更新日付」(8バイト),「作成メーカー/機種コード」(4バイト),「更新メーカー/機種コード」(4バイト),「0リセットリザーブ」(16バイト),「データエントリ数」(1バイト),「テーブル数」(1バイト),「文字コード」(1バイト),「タイトル文字列」(128バイト)、さらに未使用領域「リザーブ」を有する。
「規格識別データ」は、当該フラッシュメモリ22が所定の規格に沿ってファイルを記憶していることを示すものである。「ファイル規格識別データ」は、当該ファイルが上記所定の規格に沿って作成されたことを示すものである。「ファイルID」は、ファイルの種別を表すものであり、OSヘッダにも同様のものがある。「ファイルバージョン」は、バージョンナンバーを示すものである。「アプリケーション作成日付」は、アプリケーションを作成した日付を示すものであり、「アプリケーション更新日付」は、アプリケーションを更新した日付を示すものである。「作成メーカー/種別コード」は、ファイルを作成したメーカー及びその機種名を示すものであり、「更新メーカー/種別コード」は、そのファイルを更新したメーカー及びその機種名を示すものである。「データエントリ数」は、後述のエントリデータの数を示すものである。「テーブル数」は、テーブルデータ領域のデータ数を示すものである。「文字コード」は、入力文字を所定のコード番号で示したものである。「タイトル文字列」は、タイトル文字を示したものである。
エントリエリアは、データ部の4つのエントリデータを管理するためのデータ(以下、「エントリ」という。)がそれぞれ記憶されている。
上記エントリエリア内の各エントリは、4つのエントリデータに対応して設けられ、図5に示すように、4つのエントリデータ毎に、「開始アドレス」(4バイト),「データサイズ」(4バイト),「データ種別ID」(1バイト),「リザーブ」(1バイト),「個別データ」(26バイト)がある。例えば、エントリ1の「開始アドレス」は図3に示す「エントリデータ1 インデックス」の先頭論理アドレスを示し、エントリ2の「開始アドレス」は「エントリデータ2画像データ」の先頭論理アドレスを示す。
一方、システムファイル形式のファイルとしては、例えばディレクトリファイルが該当し、ユーザファイル形式のものと比べて、ヘッダ部の構成が異なっている。
ここで、1つのディレクトリは、1つのファイル、すなわち1つのディレクトリファイルによって構成され、最大8kバイトの大きさとする。ディレクトリファイルは、ヘッダ部とデータ部とから構成され、主にヘッダ部のディレクトリインフォメーションとデータ部のディレクトリエントリリストとによって各ファイルを管理する。
上記ディレクトリファイルのヘッダ部は、図6に示すように、「OSヘッダ」(128バイト),「ファイルヘッダ」(240バイト),「システムエントリエリア」(48バイト),「ディレクトリインフォメーション」(96バイト)を有する。なお、「OSヘッダ」と「ファイルヘッダ」は、上述したユーザファイル形式のものと同様である。
「システムエントリエリア」は、ユーザファイル形式のものとほとんど同じであるが、各エントリに個別データが設けられていない。具体的には図7に示すように、各エントリ毎に、「開始アドレス」(4バイト),「データサイズ」(4バイト),「データ種別ID」(1バイト),「リザーブ」(3バイト)がある。例えば一のエントリの「開始アドレス」は後述のグループインフォメーションの先頭論理アドレスを示し、他のエントリの「開始アドレス」は後述のディレクトリエントリの先頭論理アドレスを示す。
「ディレクトリインフォメーション」は、ディレクトリの情報を管理するものであり、図8に示すように、「ディレクトリID」(2バイト),「対象ファイルID」(1バイト),「グループ数」(1バイト),「親ディレクトリ」(2バイト),「ディレクトリ数」(2バイト),「ファイル数(全ファイル)」(2バイト),「対象ファイル数」(2バイト),「アクセスポイント」(2バイト),「ディレクトリエントリ数」(2バイト),「システム用ディレクトリエントリ数」(2バイト),「使用システムディレクトリエントリ数」(2バイト),「確保ブロック数」(2バイト),「使用ブロック数」(2バイト),さらに未使用領域「リザーブ」(72バイト)を有する。
「ディレクトリID」はディレクトリの種別を表し、「対象ファイルID」は対象とするファイルIDを示すものである。すなわち、これらは、ディレクトリ自身又はファイル自身の名前を示すものではなく、例えば画像やオーディオ等の用途を示すものである。なお、「対象ファイルID」は、当該ディレクトリの対象となるファイルの「ファイルID」の上位1バイトが記述される。これにより、「対象フラグ」で識別するためのファイルIDを指定することができる。「対象ファイルID」だけを変えれば、当該ディレクトリのファイルの種別も容易に変えることができる。「グループ数」は、ディレクトリ内の複数のファイルをグループ分けする場合に、登録されたグループの数である。「親ディレクトリ」は、親ディレクトリ、すなわち1つ上の階層のディレクトリ番号を示すものである。「ディレクトリ数」は含まれるディレクトリの総数を示し、「ファイル数(全ファイル)」は当該ディレクトリに含まれる全ファイルの数を示す。「対象ファイル数」は、そのディレクトリ内で取り扱うことができるファイルの数、すなわち含まれる対象ファイル数を示す。「アクセスポイント」は、当該ディレクトリにアクセスを開始したときの、最初にアクセスするディレクトリエントリを示すものである。「ディレクトリエントリ数」は、後述のユーザエリアのディレクトリエントリ数を示す。「システム用ディレクトリエントリ数」は、システム用ディレクトリエリアのディレクトリエントリの数を示す。具体的には図9に示すように、各ディレクトリファイルには、システム用ディレクトリエリアと、ユーザエリアとが設けられている。なお、これらのエリアは、ディレクトリ毎に設定することができる。システム用ディレクトリエリアは、管理ファイル等のそのシステムに必要な特別ファイルを取り扱うためのエリアであり、ディレクトリエントリによってそのエリアは固定される。すなわち、ディレクトリエントリの最初から所定番目まではシステム用ディレクトリエリアに対応し、その他のディレクトリエントリはユーザエリアに対応している。そこで、「システム用ディレクトリエントリ数」は、かかるシステム用のディレクトリエントリの数を示すものである。なお、ルートディレクトリは、256のシステム用ディレクトリを設けている。一方、ユーザエリアでは、各ディレクトリエントリは当該エリアの開始位置から隙間なく並べられる。「使用システムディレクトリエントリ数」は、システム用ディレクトリエリアで実際に使用されているディレクトリエントリ数を示す。「確保ブロック数」はアプリケーションで確保したいフラッシュメモリ22のブロック数を示し、「使用ブロック数」はアプリケーションで使用したブロック数を示す。
また、上記ディレクトリファイルのデータ部は、上述の図6に示すように、エントリデータ1として「グループインフォメーション」(可変長),エントリデータ2として「ディレクトリエントリリスト」(可変長)を有する。
「グループインフォメーション」は、図10に示すように、「グループ番号」(1バイト),「グループインフォメーションサイズ」(1バイト),「ディレクトリID」(2バイト),「0リセットリザーブ」(1バイト),「リザーブ」(3バイト),「日付」(8バイト),「個別データ」(8バイト),「タイトル」(可変長)とを有する。
「グループインフォメーション」は、ディレクトリ内で所望のファイルのグループ分けを行うための情報であり、詳しくは後述するが、実質的にはディレクトリの下の階層に疑似ディレクトリを設けるものである。「グループインフォメーションサイズ」は、グループインフォメーションの大きさを示すものであり、固定長24バイト+「タイトル」の任意バイト数の大きさになる。「ディレクトリID」はディレクトリ種別毎に付けられるIDであり、「0リセットリザーブ」は修正する場合は必ず0に設定するものである。「リザーブ」は当該ファイル作成時に0に設定するものである。「日付」は当該ファイルの作成日付を示し、これは使用者により変更可能である。「個別データ」は特に定められたものでなく、「タイトル」はディレクトリファイルのタイトルを示すものである。
「ディレクトリエントリリスト」は、ディレクトリに属する要素を示すものであり、図11に示すように、ディレクトリエントリが複数集合して構成される。なお、1つのディレクトリエントリは4バイトである。ディレクトリエントリは、「ファイル番号」(2バイト),「属性情報」(1バイト),「グループ番号」(1バイト)で構成される。
「ファイル番号」は、図12に示すように、2バイト中の最初のビットには「0」があり、残りの15ビットにおいてファイル又はディレクトリの先頭論理アドレスが示されている。なお、「0xffff」が示されている時は、未使用を意味する。
「属性情報」は、図13に示すように、「ディレクトリ/ファイル」(1ビット),「対象フラグ」(1ビット),「マーク1」(1ビット),「マーク2」(1ビット),「連続記録」(2ビット),「リザーブ」(2ビット)の情報を有する。「ディレクトリ/ファイル」は、1のときは当該ディレクトリの下にさらにディレクトリがあることを示し、0のときはファイルがあることを示す。「対象フラグ」は、1のときは上述のディレクトリインフォメーションで指定した対象ファイルIDのファイルであることを示し、0のときはそれ以外のファイルであることを示す。例えば、当該ファイルが画像であるか、又は画像以外のものであるか等を判定する場合に用いられるのものである。「マーク1」は、1のときはマーク1の指定があることを示し、0のときはかかる指定がないことを示す。「マーク2」については、「マーク1」と同様である。なお、「マーク1」及び「マーク2」は、利用者が指定できるマーキングフラグである。「連続記録」は、連写・簡易動画等の何かしらの連続した集合を示すときに利用される。なお、この連続記録は、ディレクトリエントリが隣合っていること、すなわちファイルが連続していることが必要である。具体的には、「00」のときは通常のファイル,「11」のときは連続ファイルの先頭,「10」のときは連続指定されたファイルであることを示す。例えば図14において、各2ビットずつの数字は各ディレクトリエントリの示すファイルの「連続記録」の値を示す。例えばファイル2〜ファイル5、ファイル6〜ファイル9は連続記録されている。なお、連続記録としてまとめられた各ファイルは、親ディレクトリのディレクトリエントリが連続していて、同じ「グループ番号」であることを要する。そして、各ファイルに2ビットの情報を持たすことによって、ディレクトリ内の一群のファイルを連続記録されているものとして識別することができる。なお、連続記録されているファイルの1つが削除されたり、新たなファイルが挿入されたときの説明については後に詳述する。
「グループ番号」は、図15に示すように、8ビットで示され、1階層の疑似ディレクトリを示すグループ番号である。これにより、同じディレクトリ内で同じグループ番号を有するファイルは、1つのグループとして取り扱われる。なお、グループ番号0のファイルは、何もグループ分けされていないものであり、ここでは上記ディレクトリの直下のものとして取り扱う。
ここで、同一のディレクトリ内に、ファイル1〜ファイル9の9つのファイルが存在していたとする。さらに、ファイル1,5,7はグループ1に属し、ファイル2,4はグループ2に属し、ファイル3,6はグループ3に属し、ファイル8,9はグループ0に属するものとする。
このとき、グループ1〜グループ3は、図16に示すように、上記ディレクトリの下の階層に位置し、疑似的にディレクトリの役割を果たす。また、グループ0に属するファイル8,9は、上記ディレクトリの直下のものとして取り扱われる。
すなわち、1エントリにつき1バイトだけの「グループ番号」を設けることによって、親ディレクトリの下にさらにディレクトリを設けたようなグループ機能を発揮することができる。また、ディレクトリファイルにはグループインフォメーションを設けてもよいので、各グループに名前を付けることも可能であり、グループ機能は通常のディレクトリに匹敵する機能を有する。
なお、例えば図17に示すように、各グループを、疑似ディレクトリのように取り扱わなくてもよく、単にグループ関係のあるファイルを示すものとして取り扱ってもよい。
また、図16及び図17に示すようなグループ分け機能は、グループを取り扱うことができるホストコンピュータと取り扱うことができないホストコンピュータとの間でも互換性を備えている。すなわち、グループ分け機能を有するホストコンピュータ(以下、「ホストコンピュータ10A」という。)に記憶されているファイルやディレクトリを、グループ分け機能のないホストコンピュータ(以下、「ホストコンピュータ10B」という。)に送信しても何等問題が生じない。かかる互換性について、用途がカメラである「カメラディレクトリ」の場合を挙げて以下に説明する。なお、ホストコンピュータ10Aは、図11に示すディレクトリエントリリストの各ディレクトリエントリを並び変える機能を有するものとその機能を有しないものとがあり、それぞれについて説明する。
例えば図18(A)に示すように、カメラディレクトリにおいて、ファイル1〜ファイル9の9つのファイルがあり、各ファイルはグループ0〜グループ3に分類されているものとする。ファイル1,5,7は家族の写真としてグループ1に分類され、ファイル2,4は趣味の写真としてグループ2に分類され、ファイル3,6は会社関係としてグループ3に分類され、ファイル8,9は未分類としてグループ0に分類されている。なお、グループ0は、カメラディレクトリ直下のものとして取り扱われる。このとき、上述の図11に示すディレクトリエントリリストでは、ファイル1,ファイル2,ファイル3・・・の順に各ディレクトリエントリが配列されている。すなわち、上記ディレクトリエントリリストでは、図18(A)に示す順番で、各ファイルのディレクトリエントリが配列されている。
ここで、ホストコンピュータ10Aにおいて、CPU14は、RAM12に格納されている上記カメラディレクトリ用のディレクトリファイルに対して、各ディレクトリエントリを図18(B)に示すように並び変えることができる。すなわち、CPU14は、ディレクトリエントリ内で、同じグループが連続して並ぶようにディレクトリエントリを並べ変える。これにより、ファイル1〜ファイル9は、図19に示すように、家族の写真,趣味の写真等のグループ毎にグループ分けされて並べられる。
そして、ホストコンピュータ10Aが、上記カメラディレクトリのディレクトリファイル及びファイル1〜ファイル9の各ファイルをホストコンピュータ10Bに送信すると、ホストコンピュータ10Bは、図20に示すように、カメラディレクトリの下の階層に各ファイルを配列する。具体的には、ホストコンピュータ10Bは、カメラディレクトリ用のディレクトリファイルにおけるディレクトリエントリの並びに従ってファイルを並べるので、ホストコンピュータ10Aにおけるファイルの並び順と同じ順で各ファイルを並べることができる。したがって、ホストコンピュータ10Bにおいても、グループ分けされて各ファイルが並べられる。
このように、ホストコンピュータ10Aがグループ分け機能を備え、かつ、グループ毎にディレクトリエントリリストを並び変える機能を有する場合は、グループ分け機能を備えていないホストコンピュータ10Bもグループ分けをして各ファイルを並べることができる。
一方、グループ毎にディレクトリエントリを並び変える機能を有しないホストコンピュータ10Aにおいても、図19に示すように、カメラディレクトリの各ファイルをグループ分けすることができる。
しかし、ホストコンピュータ10Aが、カメラディレクトリ用のディレクトリファイル及びファイル1〜ファイル9をホストコンピュータ10Bに送信すると、ホストコンピュータ10Bは、図21に示すように、そのまま各ファイルを並べる。すなわち、ホストコンピュータ10Bは、カメラディレクトリ用のディレクトリファイルにおけるディレクトリエントリの並びに従ってファイルを並べ、ファイル1,2,3・・・の順に各ファイルを並べている。
以上のように構成されるメモリカードシステム1において、ホストコンピュータ10のCPU14は、メモリカード20のフラッシュメモリ22から論理アドレス0のルートディレクトリのディレクトリファイル(以下、「ルートディレクトリファイル」という。)、その他のディレクトリファイル、さらに、必要なファイルのヘッダ部を読み出して、各ファイルを管理することができる。具体的には、立上げ開始すると、CPU14は、図22に示すステップS1の処理を開始する。
ステップS1において、CPU14は、論理アドレス0のファイルを読み出すことを指示するコマンドを、第1のシリアルI/F13を介して、メモリカード20に送信する。メモリカード20では、コントローラ23は、上記コマンドに従ってフラッシュメモリ22から論理アドレス0のファイルを読み出し、第2のシリアルI/F21を介して、ホストコンピュータ10に送信する。CPU14は、第1のシリアルI/F13で受信したファイルをRAM12に格納し、これがルートディレクトリファイルであるか確認して、ステップS2に進む。
ステップS2において、ルートディレクトリファイルがフラッシュメモリ22に存在しているかを判定し、存在しているときはステップS3に進み、存在していないときはステップS7に進む。
ステップS3において、自分のアプリケーションディレクトリをチェックして、ステップS4に進む。例えば、ホストコンピュータ10が図示しない撮像部を備えるカメラ機器である場合には、ルートディレクトリの所定の位置に「カメラ」のディレクトリが存在しているかをチェックする。存在しているときは、このメモリカード20はカメラ機器で用いられるものであることが分かり、ステップS4及び後述のステップS5の処理を行う。すなわち、ルートディレクトリには、アプリケーションのカテゴリ毎に決められたディレクトリが設けられていて、例えばカメラの場合は「カメラ」というディレクトリが所定の位置に設けられている。
ステップS4において、自分のアプリケーションディレクトリ、例えば「カメラ」ディレクトリが存在するかを判定し、存在するときはステップS5に進み、存在しないときはステップS9に進む。
ステップS5において、上記アプリケーションディレクトリの内容を読み出して、ステップS6に進む。
ステップS6において、上記アプリケーションディレクトリのディレクトリファイルのディレクトリエントリを調べて、アルバム画像一覧や曲目一覧等のアプリケーションに必要なファイルとアクセスして、アプリケーション処理を開始する。
一方、ステップS2でルートディレクトリファイルが存在しないと判定したときのステップS7において、ルートディレクトリファイルを作成するか判定し、作成するときはステップS8に進み、作成しないときは立ち上げを中止する。ここで、ルートディレクトリを作成しない場合としては、例えばメモリカード20がライトプロテクトされている場合が該当する。
ステップS8において、論理アドレス0のルートディレクトリファイルを作成して、ステップS9に進む。
ステップS9において、自分のアプリケーションディレクトリを作成するかを判定し、作成するときはステップS10に進み、作成しないときはかかる処理を中止する。すなわち、「カメラ」ディレクトリがないときは、後述のステップS10の処理のように「カメラ」ディレクトリを作ったり、又は、処理を一旦中止して利用者が他のメモリカード20に交換することを要する。
ステップS10において、ルートディレクトリファイル内にアプリケーションディレクトリを作成して、ステップS5に進む。そして、ステップS5及びステップS6の処理を経て、アプリケーションの処理を開始する。
以上のように、例えば図示しない撮像部を備えるホストコンピュータ10は、立ち上げを開始すると、最初にルートディレクトリの存在を確認してから所定のアプリケーションディレクトリ、ここでは「カメラ」ディレクトリをチェックしてから、そのディレクトリの内容の処理を行っている。
つぎに、ディレクトリの作成処理を行うときのCPU14の動作について説明する。ホストコンピュータ10のCPU14は、ディレクトリファイルの作成が指示されると、図23に示すステップS11の処理を開始する。
ステップS11において、CPU14は、空いている論理アドレスを調べて、ステップS12に進む。
ステップS12において、空いている論理アドレスがないかを判定し、空きがないときはディレクトリを作成することができないのでエラーが発生し、空きがあるときはステップS13に進む。
ステップS13において、作成するディレクトリファイルのディレクトリインフォメーションを初期値に設定する。さらに、ディレクトリエントリの全てを初期化し、グループインフォメーションを準備する場合はそのエリアを全てクリアして、ステップS14に進む。
ステップS14において、メモリカード20が備えるフラッシュメモリ22内の各ブロックに、ディレクトリファイルを記憶することができる容量の空きがあるかを調査して、ステップS15に進む。
ステップS15において、上記ブロックの空きがあるかを判定し、空きがないときはエラーが発生し、空きがあるときはステップS16に進む。
ステップS16において、CPU14は、上記ディレクトリファイルと共にこの内容を書き込むことを指示するコマンドをメモリカード20に送信して、ステップS17に進む。このとき、メモリカード20では、コントローラ23は、上記コマンドに従ってディレクトリファイルをフラッシュメモリ22に書き込む。
ステップS17において、RAM12に格納されている集合管理ファイルのビットマップテーブルを更新して、ステップS18に進む。
ステップS18において、作成されたディレクトリの1つ上の階層である親ディレクトリに、当該作成されたディレクトリを登録して、ステップS19に進む。例えば、親ディレクトリのディレクトリファイルにおいて、ディレクトリインフォメーションの「ディレクトリ数」を更新したり、作成されたディレクトリに関するディレクトリエントリを作成したりする。
ステップS19において、CPU14は、所定の演算処理が終了したとき等の切りの良いタイミングで、上記集合管理ファイルの更新を指示するコマンドをメモリカード20に送信して、処理を終了する。このとき、メモリカード20では、コントローラ23は、上記コマンドに従ってフラッシュメモリ22に集合管理ファイルの更新された部分の書き込みを行う。
以上のように、ディレクトリを作成するときは、ディレクトリ名を作るのではなく、空きのある論理アドレスを付けている。
つぎに、ファイルを作成してその親ディレクトリに登録するときのCPU14の動作について説明する。ホストコンピュータ10のCPU14は、ファイルの作成が指示されると、図24に示すステップS21の処理を開始する。
ステップS21において、CPU14は、新たに作成されるファイルの親ディレクトリのディレクトリエントリに空きがあるかをチェックして、ステップS22に進む。
ステップS22において、上記親ディレクトリにディレクトリエントリの空きがあるかを判定し、空きがあるときはステップS23に進み、空きがないときはエラーが発生してディレクトリへのファイルの登録処理を中止する。
ステップS23において、作成されるファイルのヘッダ部を作成してRAM12に格納し、ステップS24に進む。
ステップS24において、当該ファイルを各ブロックに書き込むことを指示するコマンドをメモリカード20に送信して、ステップS25に進む。したがって、メモリカード20では、コントローラ23は、このコマンドに従ってフラッシュメモリ22に新たなファイルを書き込む。2以上のブロックに上記ファイルを書き込むときは、各ブロック間の連結状態を示す連結アドレスを、各ブロックの分散管理情報として書き込む。
ステップS25において、上記ファイルのフラッシュメモリ22への書き込みが完了したかを判定し、書き込みが完了したときはステップS26に進み、書き込みができないときはエラーが発生してディレクトリへのファイルの登録を中止する。
ステップS26において、CPU14は、上記ファイルの親ディレクトリのディレクトリファイルに対して、空いているディレクトリエントリに上記ファイルの先頭論理アドレスを書き込む。また、このディレクトリエントリに、必要に応じて「グループ番号」や、「属性情報」を書き込んで、ステップS27に進む。
ステップS27において、上記ディレクトリファイルのディレクトリインフォメーションを更新して、ステップS28に進む。
ステップS28において、CPU14は、メモリカード20に対して上記ディレクトリファイルの書き込みを指示するコマンドを送信して、処理を終了する。このとき、メモリカード20では、コントローラ23は、上記コマンドに従ってディレクトリファイルをフラッシュメモリ22に書き込む。
以上のように、ディレクトリにファイルを登録する場合には、ディレクトリにそのファイル名を登録するのではなく、ファイル番号(先頭論理アドレス),属性情報,グループ番号からなる4バイトのディレクトリエントリを登録している。これにより、ディレクトリに多くの情報が集中するのを回避することができ、多くのファイルを登録する場合であってもディレクトリの情報量が多くなり過ぎるのを防止して、フラッシュメモリ22内のデータ記録領域を有効に活用することができる。
つぎに、ファイルがその親ディレクトリの用途にあっているかを調べるとき、すなわち図13に示す「対象フラグ」によってファイルの用途を調べるときのCPU14の動作について説明する。ホストコンピュータ10のCPU14は、あるディレクトリに属するファイルの用途調査の指示が出されると、図25に示すステップS31の処理を開始する。
ステップS31において、CPU14は、親ディレクトリのディレクトリファイルに対して、調べたいディレクトリエントリの用途情報の「対象フラグ」をチェックして、ステップS32に進む。
ステップS32において、上記「対象フラグ」が「1」であるかを判定し、「1」であるときはステップS33に進み、「1」でないときはステップS34に進む。
ステップS33において、この「対象フラグ」の示すファイルは当該ディレクトリの用途と一致するので、CPU14は、このファイルに対して所定の処理を行う。
ステップS34において、この「対象フラグ」の示すファイルは当該ディレクトリの用途と一致しないので、CPU14は、このファイルを処理の対象外とみなして処理を終了する。
このように、CPU14は、単に1ビットの「対象フラグ」を見ることによって、ファイルとその親ディレクトリとの用途が一致するかを容易に判別することができ、高速に所定のファイルにアクセスすることができる。
また、「対象フラグ」がないときは、CPU14は、図26に示すステップS41の処理を開始する。
ステップS41において、CPU14は、上記親ディレクトリのディレクトリファイルに対して、調べたいディレクトリエントリの「ファイル番号」を調べて、ステップS42に進む。
ステップS42において、「ファイル番号」すなわち先頭論理アドレスの示すファイルの内、ヘッダ部のみを読み出す指示をメモリカード20に送信し、そして、メモリカード20から送信されるヘッダ部のデータをRAM12に格納して、ステップS43に進む。
ステップS43において、読み出したヘッダ部の「ファイルID」と、上記親ディレクトリのディレクトリインフォメーションの図8に示す「対象ファイルID」とを比較して、ステップS44に進む。
ステップS44において、読み出した「ファイルID」の上位1バイトと「対象ファイルID」とが一致するかを判定し、一致するときはステップS45に進み、一致しないときはステップS46に進む。
ステップS45において、このファイルは当該ディレクトリの用途と一致するので、CPU14は、このファイルに対して所定の処理を行う。
ステップS46において、このファイルは当該ディレクトリの用途と一致しないので、CPU14は、このファイルを処理の対象外とみなして処理を終了する。
このように、CPU14は、「対象フラグ」がない場合であっても、ファイルとその親ディレクトリとの用途が一致するかを判別することができる。
つぎに、ディレクトリのn番目の画像ファイルを読み込むときのCPUの処理について説明する。ホストコンピュータ10のCPU14は、n番目の画像ファイルの読み込みの指示が出されると、図27に示すステップS51の処理を開始する。
ステップS51において、CPU14は、メモリカード20のコントローラ23に対して目的のディレクトリファイルを読み出すコマンドを送信する。具体的には、指定した番号の論理アドレスに該当するブロックからデータを読み出すコマンドを送信して、ステップS52に進む。
ステップS52において、コントローラ23は、フラッシュメモリ22から目的とするディレクトリファイルが記憶されているブロックからデータを読み出してホストコンピュータ10に送信する。ホストコンピュータ10では、CPU14は、送信されたデータをRAM12に格納して、図6に示すディレクトリインフォメーション,グループインフォメーション,ディレクトリエントリリスト等を格納して、ステップS53に進む。
ステップS53において、上記ディレクトリファイルの図9に示すディレクトリエントリリスト内のユーザエリアの先頭のディレクトリエントリへ行って、ステップS54に進む。
ステップS54において、上記ディレクトリエントリの図13に示す「対象フラグ」をチェックして、ステップS55に進む。
ステップS55において、CPU14は、「対象フラグ」に基づいて、先頭のディレクトリエントリの示すファイルが画像であるか又は画像でないかを判定し、画像であるときはステップS56に進み、画像でないときはステップS61に進む。
ステップS56において、上記ディレクトリエントリの示すファイル番号が指定したファイル番号nであるかを判定し、指定したファイル番号であるときはステップS57に進み、指定した番号でないときはステップS60に進む。
ステップS57において、CPU14は、上記ファイル番号の獲得の処理を行って、ステップS58に進む。
ステップS58において、CPU14は、獲得したファイル番号(先頭論理アドレス)に基づいて、当該ファイルの512バイトのヘッダ部を読み出すコマンドをメモリカード20に送信する。そして、CPU14は、メモリカード20から送信されるヘッダ部のエントリリストに基づいて、インデックス,画像等の各エントリデータの「開始アドレス」,「データサイズ」を調べて、ステップS59に進む。
ステップS59において、CPU14は、上記「開始アドレス」,「データサイズ」に基づいて、インデックス,画像等の各エントリデータを読み出すコマンドをメモリカード20に送信する。メモリカード20では、コントローラ23は、上記コマンドに従って各エントリデータを読み出してホストコンピュータ10に送信する。なお、エントリデータが複数のブロック内に記憶されているときは、「連結アドレス」に基づいて各ブロックからエントリデータを読み出す。
一方、ステップS56でディレクトリエントリの示すファイル番号が目的のファイル番号nでないと判定したときのステップS60において、CPU14は、ディレクトリエントリの数を1つカウントアップして、ステップS61に進む。
ステップS61において、CPU14は、つぎの順番のディレクトリエントリの処理に移行して、ステップS62に進む。
ステップS62において、CPU14は、最後のディレクトリエントリの処理が終了したかを判定し、終了したと判定したときは該当するファイルがないものとして一連の処理を終了し、終了しないときはステップS54に戻って、上記ステップS61における次のディレクトリエントリの処理を行う。
以上のように、上記メモリカードシステム1において、ホストコンピュータ10は、各ファイルにファイル名を設けらてていなくても、フラッシュメモリ22から所望のファイルを読み出すことができる。具体的には、上記ホストコンピュータ10のCPU14は、各ディレクトリに設けられたディレクトリエントリリストを順番に調べる。そして、所望のファイルを示すディレクトリエントリを見つけたときは、それが示す論理アドレスに従って上記所望のファイルを読み出すコマンドをメモリカード20に送信し、ファイルの読み出し処理を行っている。これにより、ファイル名やディレクトリ名による文字列処理が不要になるので、文字列格納のためのエリアを各ディレクトリに設けないで済み、ディレクトリ管理エリアを小さくして、フラッシュメモリ22により多くのデータを記憶させることができる。
つぎに、ディレクトリのn番目の画像ファイルを削除するときのCPUの処理について説明する。ホストコンピュータ10のCPU14は、n番目の画像ファイルの削除の指示が出されると、図28に示すステップS71の処理を開始する。
ステップS71において、CPU14は、メモリカード20のコントローラ23に対して目的のディレクトリファイルを読み出すコマンドを送信する。具体的には、指定した番号の論理アドレスに該当するブロックを読み出すコマンドを送信して、ステップS72に進む。
ステップS72において、コントローラ23は、フラッシュメモリ22から目的とするディレクトリファイルが記憶されているブロックからデータを読み出してホストコンピュータ10に送信する。ホストコンピュータ10では、CPU14は、送信されたデータをRAM12に格納して、ステップS73に進む。よって、RAM12には、図6に示すディレクトリインフォメーション,グループインフォメーション,ディレクトリエントリリスト等が格納される。
ステップS73において、上記ディレクトリファイルの図9に示すディレクトリエントリリスト内のユーザエリアの先頭のディレクトリエントリへ行って、ステップS74に進む。
ステップS74において、上記ディレクトリエントリの図13に示す「対象フラグ」をチェックして、ステップS75に進む。
ステップS75において、CPU14は、「対象フラグ」に基づいて、先頭のディレクトリエントリの示すファイルが画像であるか又は画像でないかを判定し、画像であるときはステップS76に進み、画像でないときはステップS83に進む。
ステップS76において、上記ディレクトリエントリの示すファイル番号が指定したファイル番号nであるかを判定し、指定したファイル番号であるときはステップS77に進み、指定したファイル番号でないときはステップS82に進む。
ステップS77において、CPU14は、上記ファイル番号の獲得の処理を行って、ステップS78に進む。
ステップS78において、CPU14は、指定されたファイル番号のファイル削除処理を示すコマンドをメモリカード20に送信して、ステップS79に進む。一方、メモリカード20では、コントローラ23は、上記コマンドに従って指定されたファイルが記憶されているブロックをクリアする。
ステップS79において、CPU14は、上記目的のディレクトリのディレクトリエントリリストから削除したファイルに関するディレクトリエントリを削除する。このとき、CPU14は、削除したディレクトリエントリの分を詰めてディレクトリエントリリストを更新して、ステップS80に進む。
ステップS80において、CPU14は、上記ディレクトリエントリが削除されたのに伴ってディレクトリインフォメーションの更新処理を行う。例えば、「ファイル数(全ファイル)」,「対象ファイル数」,「ディレクトリエントリ数」等を更新して、ステップS81に進む。
ステップS81において、上述のようにディレクトリファイルのヘッダ部を構成するディレクトリエントリリスト及びディレクトリインフォメーションが変更されたので、CPU14は、上記ディレクトリファイルの新たなヘッダ部を書き込むことを示すコマンドをメモリカード20に送信する。メモリカード20では、コントローラ23は、上記コマンドに従ってフラッシュメモリ22に対して上記ディレクトリファイルヘッダ部の更新処理を行う。
一方、ステップS76でディレクトリエントリの示すファイル番号が目的のファイル番号nでないと判定したときのステップS82において、CPU14は、ディレクトリエントリの数を1つカウントアップして、ステップS83に進む。
ステップS83において、CPU14は、つぎの順番のディレクトリエントリの処理に移行して、ステップS84に進む。
ステップS84において、CPU14は、最後のディレクトリエントリの処理が終了したかを判定し、終了したと判定したときは該当するファイルがないものとして一連の処理を終了し、終了てないと判定したときはステップS74に戻って、上記ステップS83における次のディレクトリエントリの処理を行う。
以上のように、上記メモリカードシステム1において、ホストコンピュータ10は、各ファイルにファイル名を設けらてていなくても、フラッシュメモリ22に記憶されている所望のファイルを削除することができる。すなわち、上記ホストコンピュータ10のCPU14は、各ディレクトリに設けられたディレクトリエントリリストを順番に調べて所望のファイルを示すディレクトリエントリを見つけ出し、その論理アドレスに従って上記所望のファイルを削除するコマンドをメモリカード20に送信する。これにより、フラッシュメモリ22に記憶されているファイルの削除処理を行っている。したがって、ファイル名やディレクトリ名による文字列処理が不要になるので、文字列格納のためのエリアを各ディレクトリに設けないで済み、ディレクトリ管理エリアを小さくして、フラッシュメモリ22により多くのデータを記憶させることができる。
つぎに、ディレクトリを削除するときのCPUの処理について説明する。ホストコンピュータ10のCPU14は、削除するディレクトリが指示されると、図29に示すステップS91の処理を開始する。
ステップS91において、CPU14は、削除指定されたディレクトリのディレクトリファイルをフラッシュメモリ22からの読み出しを指示するコマンドをメモリカード20に送信して、ステップS92に進む。メモリカード20において、コントローラ23は、上記コマンドに基づいて、フラッシュメモリ22からディレクトリファイルを読み出し、これを第2のシリアルI/F21を介して上記ホストコンピュータ10に送信する。
ステップS92において、CPU14は、メモリカード20からのディレクトリファイルをRAM12に格納し、ディレクトリエントリリストの各ディレクトリエントリを調べて、ステップS93に進む。
ステップS93において、CPU14は、ファイルやディレクトリを指定するディレクトリエントリがあるか、すなわち下の階層にファイルや他のディレクトリが存在しているかを判定する。ファイル等を指定するディレクトリエントリがあるときはエラーが発生したものとしてこのディレクトリの削除処理を終了し、ないときはステップS94に進み、ステップS94において、CPU14は、この削除の対象となっているディレクトリをその親ディレクトリから削除することを指示するコマンドを、メモリカード20に送信して、ステップS95に進む。
ステップS95において、メモリカード20のコントローラ23は、削除対象のディレクトリファイルを格納しているフラッシュメモリ22のブロック内のデータを消去して、ステップS96に進む。なお、上記ブロックの分散管理情報に「消去済み」のフラグを立てて、所定の処理が終了してから上記ブロック内のデータを消去しても良い。
ステップS96において、消去が正常に終了したかを判定し、正常に終了したときはステップS97に進み、正常に終了していないときはエラーが発生したものとして、ディレクトリ削除の処理を中止する。
ステップS97において、CPU14は、RAM12に格納している集合管理ファイルに対してディレクトリ削除によって変更が生じた部分を更新して、ステップS98に進む。
ステップS98において、CPU14は、所定の演算処理の終了した後等の切りのよい時に、上記集合管理ファイルをメモリカード20に送信すると共にこのファイルを書き込むことを指示するコマンドを送信する。したがって、メモリカード20では、コントローラ23は、上記コマンドに従って集合管理ファイルをフラッシュメモリに書き込む処理を行う。
以上のように、上記メモリカードシステム1において、ホストコンピュータ10は、各ファイルにファイル名を設けられていなくても、フラッシュメモリ22に記憶されている所望のディレクトリファイルを削除することができる。すなわち、上記ホストコンピュータ10のCPU14は、削除されるディレクトリがその下にあるファイルのファイル名等情報を有していなくても、当該ディレクトリに設けられたディレクトリエントリリストによって、削除されるディレクトリの下にファイル等がないかを調べることができる。これにより、ファイル名やディレクトリ名による文字列処理が不要になるので、文字列格納のためのエリアを各ディレクトリに設けないで済み、ディレクトリ管理エリアを小さくして、フラッシュメモリ22により多くのデータを記憶させることができる。
つぎに、連続記録編集されているときの変更処理を行うときのCPU14の動作について説明する。ホストコンピュータ10のCPU14は、ディレクトリエントリの属性情報の「連続記録」の変更処理が指示されると、図30に示すステップS101の処理を開始する。
ステップS101において、CPU14は、連続記録されているファイルの削除処理が指示されたかを判定し、ファイルの削除処理のときはステップS102に進み、ファイルの削除処理でないときはステップS106に進む。
ステップS102において、指定されたファイルの削除処理のコマンドをメモリカード20に送信することによって当該ファイルの削除処理を実行して、ステップS103に進む。
ステップS103において、親ディレクトリのディレクトリエントリリストから、当該削除したファイルのディレクトリエントリの「連続記録」が「11」であるかを判定する。「連続記録」が「11」であるときはステップS104に進み、「11」でないときは処理を終了する。
ステップS104において、当該削除したファイルのディレクトリエントリの次のディレクトリエントリの「連続記録」が「10」であるかを判定し、「10」であるときはステップS105に進み、「10」でないときは処理を終了する。
ステップS105において、上記次のディレクトリエントリの「連続記録」を「11」に変更して、上記次のディレクトリエントリの示すファイルを連続記録の先頭にして、処理を終了する。
したがって、上述の図14に示すように、ファイル2〜ファイル5が連続記録の場合においては、ファイル2を削除すると、ステップS102〜ステップS105の処理によって、図31に示すように、ファイル3を示すディレクトリエントリの連続記録が「11」に変更される。すなわち、連続記録の先頭のファイルを削除する場合であって、かつ、削除するファイルの次のファイルが連続記録の途中である場合に限り、当該次のファイルの「連続記録」を「11」に変更する。これにより、連続記録のファイルを削除する場合であっても、削除されていない各ファイルの連続記録の状態を維持することができる。
一方、ステップS101で削除処理でないと判定したときのステップS106において、連続記録されているファイル間に新たなファイルの挿入処理が指示されたかを判定し、ファイルの挿入処理のときはステップS110に進み、ファイルの挿入処理でないときはステップS107に進む。
ステップS107において、上述の図19等に示すグループの変更処理が指示されたかを判定し、グループの変更処理のときはステップS108に進み、グループの変更処理でないときは処理を終了する。
ステップS108において、親ディレクトリのディレクトリエントリリストから、当該グループ変更を行うファイルを示すディレクトリエントリリストの「グループ番号」を変更して、ステップS109に進む。
ステップS109において、上記ディレクトリエントリの「連続記録」が「00」であるかを判定し、「00」であるときは処理を終了し、「00」でないときはステップS104に進む。そして、上述のステップS104,S105の処理を行う。
したがって、グループ変更があったファイルは、「連続記録」が「00」の通常のファイルを除いてその連続記録の状態から外れるので、その直後のファイルの「連続記録」が「10」ならば、その直後のファイルのディレクトリエントリの「連続記録」を「11」にする。これにより、グループ変更のあったファイルの直後のファイルを連続記録の先頭にすることができ、グループ変更のない各ファイルの連続記録の状態を維持することができる。
一方、ステップS106で挿入処理を行うと判定したときのステップS110において、挿入の対象となるファイルを実際に挿入して、ステップS111に進む。
ステップS111において、挿入されたファイルの次のファイルに対応するディレクトリエントリの「連続記録」が「10」であるかを判定し、「10」であるときはステップS112に進み、「10」でないときはステップS113に進む。
ステップS112において、挿入したファイルの「連続記録」を「10」にして、処理を終了する。
ステップS113において、挿入したファイルの「連続記録」を「00」にして、処理を終了する。
例えば、上述の図14において、ファイル5とファイル6の間にファイル5.5を挿入すると、図32に示すように、その次のファイル6の「連続記録」は「11」であるので、ステップS111,S113の処理によって、挿入されたファイルの「連続記録」は「00」になる。また、ファイル7とファイル8の間にファイル7.5を挿入すると、その次のファイル8の「連続記録」は「10」であるので、ステップS111,S112の処理によって、挿入されたファイルの「連続記録」は「10」になる。
したがって、各ファイルの連続記録の直前にファイルが挿入された場合は、当該ファイルを通常の状態にし、また、連続記録の途中にファイルが挿入されたときは当該ファイルを連続記録の状態にしている。
以上詳細に説明したように、本発明は、ファイル名やディレクトリ名を使うことなくファイルの読み出し、書き込み、消去等を行うことができ、また、より少ないデータ量でディレクトリやファイルの管理を行うことができるので、例えばフラッシュメモリ22のように比較的記憶容量の少ない記録媒体にファイル等を記録するときに好適なものである。
なお、本実施の形態では、記録媒体の一例としてフラッシュメモリを備えるメモリカードを例に挙げて説明したが、本発明はこれに限定されるものではなく、例えば磁気ディスクや光ディスク等の媒体にも適用可能であるのは勿論である。
1 メモリカードシステム、10 ホストコンピュータ、11 ハードディスク、12 RAM、13 第1のシリアルI/F、14 CPU、20 メモリカード、21 第2のシリアルI/F、22 フラッシュメモリ、 23 コントローラ