以下、本発明の実施形態を図面に基づいて説明する。
図1は、本発明の一実施形態による通信システムの一構成例を示すブロック図であり、各機能ブロックの電気的接続構成をも示している。図1において、100はプリンタ、200は電子スチルカメラであり、IEEE1394シリアルバスのケーブル(以下、「1394ケーブル」とも称す。)10を介して通信可能なように接続されている。
各機器の構成について説明する。プリンタ100は、通信部101、通信補助部102、画像処理部103、着脱可能記録部104、表示部105、制御部106、操作部107、メモリ108および印刷出力部109により構成され、各ブロックは制御を行うためのコントロールバス110とデータを伝送するためのデータバス111とにより接続されている。
通信部101は、IEEE1394規格に準拠した通信方式により1394ケーブル10を介して外部の機器(例えば、電子スチルカメラ200)等との間で通信を行うためのものである。通信補助部102は、IEEE1394規格準拠の通信方式にプリンタ100内部の情報を変換するためのものである。
画像処理部103は、1394ケーブル10を介してプリンタ100に送られてきたデータや、着脱可能記録部104に記録されているデータを印刷出力できるように、上記データに画像処理を施す。着脱可能記録部104は、プリンタ100に限らず、別の機器に接続してデータを記録したり、読み出したりすることも可能であり、表示部105は、ユーザーがプリンタ100を操作する際に操作の補助になる情報を提示する。
制御部106は、プリンタ100全体の制御を行う。操作部107は、ユーザーがプリンタ100を実際に操作するためのものであり、メモリ108は画像処理部103にて印刷出力用に画像処理が施されたデータを一時的に記録しておき、印刷出力部109は、画像処理が施されたデータを印刷出力する。
電子スチルカメラ200は、通信部201、通信補助部202、画像処理部203、着脱可能記録部204、表示部205、制御部206、操作部207、メモリ208および撮像部209により構成され、各ブロックは制御を行うためのコントロールバス210とデータを伝送するためのデータバス211とにより接続されている。
通信部201は、IEEE1394規格に準拠した通信方式により1394ケーブル10を介して外部の機器(例えば、プリンタ100)等との間で通信を行うためのものである。通信補助部202は、IEEE1394規格準拠の通信方式に電子スチルカメラ200内部の情報を変換するためのものである。
画像処理部203は、撮像部209によって得られたデータに画像処理を施し、画像として認識できる状態にする。着脱可能記録部204は、電子スチルカメラ200に限らず、別の機器に接続してデータを記録したり、読み出したりすることが可能であり、表示部205は、ユーザーが電子スチルカメラ200を操作する際に操作の補助になる情報を提示する。
制御部206は、電子スチルカメラ200全体の制御を行う。操作部207は、ユーザーが電子スチルカメラ200を実際に操作するためのものであり、メモリ208は画像処理が施されたデータを一時的に記録するためのものである。撮像部209は、被写体像を撮影し電気的信号として得るためのものである。
次に、1394シリアルバスを介して電子スチルカメラ200からプリンタ100に画像データを転送し、プリンタ100にて印刷出力する際の各機器の動作について説明する。
電子スチルカメラ200にて、ユーザーが表示部205で被写体像を確認しながら操作部207によって撮影を促す操作を行うと、制御部206は被写体像を撮影するように撮像部209を制御する。撮像部209により得られた画像データは、データバス211を介してメモリ208に一時的に記録される。さらに、メモリ208に記録された画像データは、画像処理部203にて画像処理が施された後、データバス211を介して着脱可能記録部204にファイルとして記録される。
着脱可能記録部204に記録された画像データに係る画像は、ユーザーが操作部207により再生操作を行うことで表示部205に表示することも可能であるし、電子スチルカメラ200から着脱可能記録部204を切り離してPC等に接続することで再生(表示)することも可能である。
また、着脱可能記録部204に記録された画像データは、通信部201を介して1394シリアルバス経由でプリンタ100に送信して印刷出力することも可能である。この場合には、電子スチルカメラ200は、データ伝送を保証するためにIEEE1394規格に準拠した通信方式で通信を行わなければならない。本実施形態では、AV/C Compatible Asynchronous Serial Bus Connections規格(1394 Trade Association)、およびAV/C Commands for Management of Asynchronous Serial Bus Connections規格(1394 Trade Association)を利用してデータ転送を行う。以下、上記二つの転送方法(規格)を総称して「アシンクロナスコネクション(Asynchronous Connection)」と称す。通信部201は、上記アシンクロナスコネクションを行う手段を有しており、これによりデータ転送が保証される。
プリンタ100に転送し印刷する画像の画像データは、電子スチルカメラ200の表示部205に表示される着脱可能記録部204に記録された画像データの中から操作部207を用いて選択される。選択された画像データは、1394シリアルバス経由でプリンタ100に伝送されるが、画像データを伝送する前に、プリンタ100を制御するためのコマンドが電子スチルカメラ200からプリンタ100に送信される。
送信されたコマンドは、プリンタ100の通信部101を介して制御部106に転送され、制御部106はプリンタ100をデータ受信待ち状態に制御する。その後、選択された画像データが電子スチルカメラ200の通信部201を介してアシンクロナスコネクションによりプリンタ100に伝送される。データ受信待ち状態のプリンタ100は、電子スチルカメラ200から送信されてくる画像データを受信すると、データバス111を介してメモリ108に一時的に記録する。メモリ108に記録された画像データは、画像処理部103にて印刷出力用に画像処理が施され、印刷出力部109によって出力される。
上述した説明は、電子スチルカメラ200からプリンタ100に画像データを伝送して印刷するプッシュモデルである。
以下に、プリンタ100が電子スチルカメラ200に記録された画像を選択して、1394シリアルバス経由で取得し印刷する際の動作について説明する。
電子スチルカメラ200の通信補助部202は、着脱可能記録部204にファイルとして記録されている画像データに関するファイル情報を読み出し、所定のファイルシステムにマッピングを行う。通信補助部202により表現される上記ファイルシステムは、1394シリアルバスを介して外部の機器から参照することができる。すなわち、1394シリアルバスを介して接続された各機器は、通信補助部202を各機器に実装しておくことで、各機器における記録媒体の記録方式が異なっていたとしても1394シリアルバス上では同様のファイルシステムとして取り扱うことが可能になる。
図2は、本実施形態における上記ファイルシステムの構成例を示す図である。なお、この図2において、図1に示したブロック等と同一の機能を有するブロック等には同一の符号を付し、重複する説明は省略する。
電子スチルカメラ200にて撮影された画像が、上記図1に示した着脱可能記録部204に記録形式A2−1で記録されている。通信補助部202は、記録形式A2−1で記録されているファイル情報を、図2に示すような予め定められた形式の情報形態(ファイルフォーマット)に変換して、変換により得られたファイル情報2−5を内部メモリ2−6に一時的に記録しておく。
そして、プリンタ100の操作部107にて所定の操作を行い、電子スチルカメラ200が有するファイル情報を取得するためのコマンドをプリンタ100から電子スチルカメラ200に送信する。これにより、プリンタ100は、通信補助部202の内部メモリ2−6に保持するファイル情報2−5を1394シリアルバス経由で取得することができる。また、仮に記録形式A2−1とは異なる記録形式B2−2、記録形式C2−3、もしくは記録形式D2−4で電子スチルカメラ200の着脱可能記録部204にファイル情報が記録されていたとしても、プリンタ100は同一のファイルフォーマットのファイル情報2−5として認識することができる。
上述のようにして取得したファイル情報は、プリンタ100の表示部105に表示され、ユーザーは操作部107を用いて印刷したい画像を選択する。上記選択に応じて、プリンタ100は、選択された画像の画像データを取得するためのコマンドを電子スチルカメラ200に送信する。同時に、プリンタ100内部では、1394シリアルバス経由で画像データを受信し印刷するためにデータ受信待ち状態になる。
電子スチルカメラ200は、上記画像データの取得を要求するコマンドを受信すると、アシンクロナスコネクションによりプリンタ100に対して画像データの伝送を行う。プリンタ100は、電子スチルカメラ200からの画像データを受信すると、当該画像データをメモリ108に一時的に記録し、画像処理部103にて印刷出力用に画像処理を施した後、印刷出力部109によって出力する。
次に、上記図1に示した着脱可能記録部104、204のような記録デバイス(記録媒体)に記録されたファイルヘのアクセス手段について説明する。
<ファイルシステムのデータ構造>
本実施形態における記録デバイスでは、指定されたファイルにアクセスする際にファイルパス(file_path)を用いる。上記ファイルパスは、可変長のデータであり、例えば、ルートディレクトリからのフルパス名である。また、上記ファイルパスでは、例えば、ディレクトリのデリミタとして”/”の文字(“5C16”)(下付の添え字“16”は16進数表記であることを示す。以下についても同様である。)を用いるとともに、ターミネータとしてNULL(ヌル)文字(“0016”)を用いる。
上記ファイルパスのデータ長は、ファイルパス長(file_path_length)により示され、当該ファイルパス長には、最後のNULL文字の長さは含まれない。
上記ファイルパスデータおよびファイルパス長データは、後述するファイルアクセスコマンドセットにて使用される。
本実施形態における記録デバイスからファイルの情報を取得する側のデバイス(以下、「コントローラ」と称す。)は、ファイルの情報を取得するために、記録デバイスに対してファイルリストを要求する。上記ファイルリストは、上記ファイルリストを要求するコマンドのレスポンスとして、記録デバイスからコントローラに転送される。ここで、ファイルリストは、複数のディレクトリエントリと、各ディレクトリエントリが保持しているファイルあるいはディレクトリの情報とを含む。また、ファイルリストのディレクトリエントリは、例えばサイズが20バイトであり、図3に示すようなデータ構造を有する。
図3は、本実施形態におけるディレクトリエントリのデータ構造の一例を示す図である。図3に示したディレクトリエントリの各フィールドは、例えば、DOS(disk operating system)−FAT(file allocation table)システムとして知られているデータ構造と同様のデータ構造を有している。しかしながら、上記図3に示したディレクトリエントリでは、DOS−FATシステムのようなカレントディレクトリおよび親ディレクトリ情報は保持していない。
図3において、最初の11バイト(アドレスオフセット値“0016”〜“0A16”)のフィールドは、名前(name)フィールド301および拡張子(extension)フィールド302であり、ファイルの名前を示す。上記2つのフィールド301、302により、例えば、上述したDOS−FATシステムにおけるファイル名8文字と拡張子3文字とを形成することができる。上記記録デバイスに保持されているファイルの名前または拡張子が、上記2つのフィールド長よりも小さい場合には、例えば、パディングバイト(padding byte)が詰められる。上記パディングバイトの値は、例えば“2016”である。
次の1バイト(アドレスオフセット値“0B16”)のフィールドは、属性(attribute_byte)フィールド303であり、ファイルの属性情報を示す。属性フィールド303は、図4に示すようなビットフィールドを含む。
図4は、属性フィールド303の構成を示す図であり、ディレクトリ(directory)ビット401は、当該ディレクトリエントリがサブディレクトリか否かを示す。例えば、ディレクトリビット401が“1”にセットされている時には、当該ディレクトリエントリはサブディレクトリである。また、リード・オンリ(read_only)ビット402は、当該ディレクトリエントリ内のファイルに対して読み出しのみが可能であり、書き込み/消去が不可能であるか否かを示す。例えば、リード・オンリビット402が“1”にセットされている時には、ファイルは読み出し専用である。なお、図4において、複数のイグノア(ignored)ビットは、当該記録デバイスがいかなる値を書き込んでも、コントローラに無視されるようになっている。
図3に戻り、更新時間(modification_time)フィールド304(アドレスオフセット値“0C16”、“0D16”)、および更新日付(modification_date)フィールド305(アドレスオフセット値“0E16”、“0F16”)は、ファイルの最新更新日時を示す。また、ファイルサイズ(file_size)フィールド306(アドレスオフセット値“1016”〜“1316”)は、ファイル長(単位はバイト)を示す。
本実施形態においては、複数の記録メディアと、当該記録メディア上の複数に分割されたいわゆるパーティションとを取り扱うことができる。上記記録メディアを、例えば「物理ボリューム」と称すると共に、上記パーティションを、例えば「論理ボリューム」と称する。
本実施形態では、上記物理ボリュームの指定を物理ボリューム番号(physical_volume_number)データにて行い、上記論理ボリュームの指定を論理ボリューム番号(logical_volume_number)データにて行う。コントローラは、上記物理ボリューム番号および論理ボリューム番号により記録デバイス上の特定エリアを指定することができる。上記物理ボリューム番号および論理ボリューム番号は、後述するファイルアクセスコマンドセットにて使用される。
上記物理ボリューム番号データは、例えば“0016”から“FE16”の値をとり、最初の物理ボリューム番号は“0016”の値をとる。“FF16”の値は、例えば特別であり、上記物理ボリューム番号値は後述するファイルアクセスコマンドセットに応じて意味付けが異なる。
上記論理ボリューム番号データは、例えば“0016”から“FE16”の値をとり、最初の論理ボリューム番号は“0016”の値をとる。“FF16”の値は、例えば特別であり、上記論理ボリューム番号値は後述するファイルアクセスコマンドセットに応じて意味付けが異なる。
なお、本実施形態では、上記物理ボリューム番号および論理ボリューム番号の値が“FF16”の場合を例外としているが、“0016”から“FF16”の値をとるように構成しても良い。
本実施形態の記録デバイスでは、記録メディアの交換を通知するのにメディア・カウント(media_generation_count)を用い、記録メディアが記録デバイスに挿入された時に、メディア・カウントの値が“1”だけ増加される。なお、記録デバイスが複数の物理ボリュームをサポートしている場合には、各物理ボリュームに対して固有のメディア・カウントを有する。
電源投入等により記録デバイスが初期化された時には、上記メディア・カウントは初期化される。なお、メディア・カウントの初期値は、記録デバイスに固有の値であり、例えば、零であっても良く、乱数であっても良い。また、記録デバイスが、電源切断時等にフラッシュメモリやその他の不揮発性メモリ等にメディア・カウントの値を記憶させることができる場合には、次の初期化の際の初期値として記憶したメディア・カウントの値を使用するようにしても良い。本実施形態では、上記メディア・カウントは1バイトのデータであり、バスリセットが発生した場合にはメディア・カウントの値は保持されるようになっている。
コントローラは、記録デバイスに記録メデイアが挿入され、メディア・カウントの値が増加したことを検出すると、上述したファイルリストを再取得する。本実施形態における記録デバイスでは、記録メデイアの抜去によりメディア・カウントの値が増加することがないので、記録メディアの抜去により新たなファイルリストの取得を行う必要がなく、不要なトランザクションを発生させることがない。
<ファイルアクセスコマンドセット>
次に、本実施形態のファイルシステムに関するコマンドについて説明する。本実施形態では、コマンドを用いることで、ファイル属性の取得やファイルの転送などのファイルに関する様々な制御を行うことが可能である。
本実施形態のファイルシステムに関するコマンドは、例えば、IEEE1394規格で定義されているFCP(Function Control Protocol)を用いている。
以下、図5を参照してFCPについて説明する。
図5は、FCPを説明するための概念図である。FCPは、1394シリアルバスを介して接続されたデバイスを制御するためにIEEE1394規格に基づいて設計されており、種々のコマンドセットとコマンドトランザクションとが、FCP上で利用可能である。また、FCPではコマンドおよびレスポンスを送信する際に、IEEE1394規格のアシンクロナスパケット(Asynchronous packet)が用いられる。
FCPにおいて、他の(複数の)ノードを制御するノードを“コントローラ”と呼び、制御されるノードを“ターゲット”と呼ぶ。図5においては、500はコントローラ、510はターゲットとして動作するようになっている。
また、FCPにおいては、コントローラからターゲットに送られるFCPフレームを“コマンドフレーム”と呼び、ターゲットからコントローラに送られるFCPフレームを“レスポンスフレーム”と呼ぶ。上記コマンドフレームを受け取る準備をしたレジスタを“コマンドレジスタ”と呼び、上記レスポンスフレームを受け取る準備をしたレジスタを“レスポンスレジスタ”と呼ぶ。図5においては、501および502は、コントローラ500上のコマンドレジスタおよびレスポンスレジスタであり、511および512は、ターゲット510上のコマンドレジスタおよびレスポンスレジスタである。
FCPフレームを用いて送出されるアシンクロナスパケットのデータ構造を図6に示す。
図6において、601はデスティネーションIDフィールド、602はトランザクション・ラベル(tl)フィールド、603はリトライコード(rt)フィールド、604はトランザクション・コード(tcode)フィールド、605はプライオリティ(pri)フィールド、606はソースIDフィールド、607はデスティネーションオフセットフィールド、608はデータ長フィールド、609は拡張トランザクション・コードフィールド、610はヘッダCRC(header_CRC)フィールド、611はデータフィールド(FCPフレーム)、612はデータCRC(data_CRC)フィールドである。上記アシンクロナスパケットは、例えば4バイト(32ビット、以下「クアッドレッド」と称す。)を単位とするデータパケットである。
図6に示したアシンクロナスパケットにおいて、最初の16ビットのフィールドが、デスティネーションIDフィールド601であり、受信側(送信先)のノードIDを示す。次の6ビットのフィールドが、トランザクション・ラベルフィールド602であり、各トランザクション固有のタグである。次の2ビットのフィールドが、リトライコードフィールド603であり、パケットがリトライを試みるか否かを指定する。
次の4ビットのフィールドが、トランザクション・コードフィールド604であり、パケットのフォーマットや実行しなければならないトランザクションのタイプを指定する。本実施形態では、例えば、このフィールドの値が“00012”(下付の添え字“2”は2進数表記であることを示す。以下についても同様である。)である、データブロックの書き込みリクエストのトランザクションを用いる。
次の4ビットのフィールドが、プライオリティフィールド605であり、優先順位を指定する。本実施形態ではアシンクロナスパケットを用いているので、このフィールドの値は、例えば“00002”である。
次の16ビットのフィールドが、ソースIDフィールド606であり、送信側(送信元)のノードIDを示す。次の48ビットのフィールドが、デスティネーションオフセットフィールド607であり、パケットの受信側ノードアドレスの下位48ビットがこのフィールドによって指定される。
次の16ビットのフィールドが、データ長フィールド608であり、後述するデータフィールド611の長さをバイト単位で示す。次の16ビットのフィールドが、拡張トランザクション・コードフィールド609であり、本実施形態にて用いられるデータブロックの書き込みリクエストのトランザクションにおいては、この値は、例えば“000016”である。
次の32ビットのフィールドが、ヘッダCRCフィールド610であり、パケットヘッダ(上述したデスティネーションIDフィールド601から拡張トランザクション・コードフィールド609まで)のエラー検出に用いられる。
次の可変長のフィールドが、データフィールド611であり、後述するCTS(Command/Transaction Set)にて用いられるコマンドフレームおよびレスポンスフレームが詰められる。上記データフィールド611を「ペイロード」と称する。本実施形態では、上記データフィールド611にてクアッドレットの倍数に満たないビットには、“0”の値が詰められるようになっている。つまり、上記データ長フィールド608に格納されるデータ長がバイト(8ビット)単位で示されるとき、当該データ長フィールド608の値が“4”の倍数でない場合には、上記データフィールドは、クアッドレットを満たすまで“0016”の値のデータによって埋められる。
最後の32ビットのフィールドが、データCRCフィールド612であり、上述したヘッダCRCフィールド610と同様に、上記データフィールド611のエラー検出に用いられる。
FCPにおいて、データブロックの書き込みリクエスト(“Write request for data block packet”)のペイロードであるデータフィールド611は、“FCPフレーム”と呼ばれ、コマンドフレームは、ターゲット上のコマンドレジスタに書き込まれるとともに、レスポンスフレームは、コントローラ上のレスポンスレジスタに書き込まれる。ここで、コマンドレジスタとレスポンスレジスタとは切り離されており、これらのレジスタのデスティネーションオフセットアドレスは、図7に示すようにFCPで規定されている。
本実施形態においては、デスティネーションオフセットアドレスとして、“FFFF F000 0B0016”、および“FFFF F000 0D0016”を含むライトトランザクション(Write transaction)のみが許されている。
CTSは、コマンドセット、コマンドフィールドとレスポンスフィールドとの構造、およびコマンドとレスポンスとを送出する際に用いられるトランザクションの規則を指定したFCPフレームの一つのコンポーネントである。
CTSで用いられるFCPフレームのデータ構造を図8に示す。
図8において、801はCTSフィールドである。CTSフィールド801は、4ビットのフィールドであり、CTSフィールド801の符号化の一例を図9に示す。本実施形態において、CTSフィールド801の値は、例えば“00002”を用いる。
図10は、本実施形態におけるコマンドフレームおよびレスポンスフレームのデータ構造を示す図である。
図10(a)は、コマンドフレームのデータ構造を示しており、図10(a)において、1001はコマンドタイプ(ctype)フィールド、1002はサブユニットタイプ(subunit_type)フィールド、1003はサブユニットID(subunit_ID)フィールド、1004はオペコード(opcode)である。また、図10(a)において、オペコード1004以降は、1バイト毎に(n+1)個(nは整数)のオペランド(operand[0]、operand[1]、…、operand[n])が続く。
4ビットからなるコマンドタイプフィールド1001は、コマンドのタイプを示す。
図11は、コマンドタイプフィールド1001の値とコマンドタイプとの関係の一例を示す図である。
図11に示すように、コマンドタイプフィールド1001の値が“00002”(コマンドタイプが“CONTROL”)のコマンドフレームは、コントローラが、ターゲットの制御を行うために用いる。制御内容は、後述するオペコードやオペランドによって指定される。また、コマンドタイプフィールド1001の値が“00012”(コマンドタイプが“STATUS”)のコマンドフレームは、コントローラが、ターゲットの現在の状態を問い合わせるために用いる。状態の指定は、後述するオペコードやオペランドによって行う。
また、上記コマンドタイプフィールド1001の値が“00112”(コマンドタイプが“NOTIFY”)のコマンドフレームは、コントローラが、ターゲットの状態が変化したことをターゲットから通知させるために用いる。後述するオペコードやオペランドによって状態の指定を行うことは、上述した“STATUS”コマンドと同様である。
さらに、コマンドタイプフィールド1001の値が“00102”あるいは“01002”(コマンドタイプが“SPECIFIC INQUIRY”あるいは“GENERAL INQUIRY”)のコマンドフレームは、同じオペコードを有する“CONTROL”コマンドが、ターゲットに実装されているか否かを確認するために用いる。ここで、“SPECIFIC INQUIRY”コマンドの場合には、オペコードと全てのオペランドとを指定しなければならないが、“GENERAL INQUIRY”コマンドの場合には、オペコードのみを指定する。これが、“SPECIFIC INQUIRY”コマンドと“GENERAL INQUIRY”コマンドとの相違点である。
5ビットからなるサブユニットタイプフィールド1002と、3ビットからなるサブユニットIDフィールド1003とで、コマンドフレームが送られるサブユニット(subunit)を識別する。サブユニットは、AV/C Digital Interface Command Set General Specification(March 1998, 1394 Trade Association)規格(以下、「AV/Cコマンドセット規格」と称す。)等で定義されており、AVユニット(以下、単に「ユニット」とも称す。)の中で唯一つに識別されるとともに、首尾一貫した機能のセットを提供する仮想的なエントリーである。上記ユニットも、AV/Cコマンドセット規格にて同様に、定義されている。AVユニットは、1394シリアルバスに対して接続されているノードを有する電子デバイスを示す。
上記AV/Cコマンドセット規格によれば、ユニットは、複数のサブユニットを有することができるようになっている。そこで、サブユニットタイプフィールド1002とサブユニットIDフィールド1003とは、1394インターフェースに接続されるユニット中のサブユニットを識別するためのアドレスを示すようになっている。サブユニットタイプフィールド1002の値とサブユニットのタイプとの関係の一例を図12に示す。
上記サブユニットタイプフィールド1002とサブユニットIDフィールド1003とを総合して、「サブユニットアドレス」または「AV/Cアドレス」と称す。なお、上記サブユニットタイプフィールド1002の値が“111112”で、かつサブユニットIDフィールド1003の値が“0112”の場合には、サブユニットアドレスは、ユニットを示すようになっている。
本実施形態において、プリンタ100にコマンドフレームを送信する場合には、例えば、サブユニットタイプフィールド1002に“000102”の値を、サブユニットIDフィールド1003に“0002”の値を指定する。また、本実施形態において、電子スチルカメラ200のカメラサブユニットにコマンドフレームを送信する場合には、例えば、サブユニットタイプフィールド1002に“001112”の値を、サブユニットIDフィールド1003に“0002”の値を指定する。
さらに、本実施形態において、電子スチルカメラ200のファイルシステムを形成する通信補助部202は、図12におけるカメラ・ストレージ・サブユニット(Camera Storage Subunit)として動作する。このため、当該サブユニットにコマンドフレームを送信する場合には、例えば、サブユニットタイプフィールド1002に“010112”の値を、サブユニットIDフィールド1003に“0002”の値を指定する。
オペコード1004は、制御内容や後述するレスポンスフレームによって返される状態を定義する。オペコード1004の後に続く、オペランドの数と意味付けは、上述したコマンドタイプ、サブユニットタイプ、あるいはオペコードに応じて異なる。
図10(b)は、レスポンスフレームのデータ構造を示す図である。図10(b)において、図10(a)に示したフィールドと同一の機能を有するフィールドには同一の符号を付し、重複する説明は省略する。図10(b)において、1005はレスポンス(response)フィールドであり、レスポンスのタイプを示す。
図13は、レスポンスフィールド1005の値とレスポンスタイプとの関係の一例を示す図である。
本実施形態では、ターゲットとなるサブユニットは、コマンドタイプ、サブユニットアドレス、オペコード、およびオペランドにより構成されるコントローラから送出されたコマンドフレームに対して、適切なレスポンスフレームを発生させてコントローラに返すようになっている。上記レスポンスフレームは、受信したコマンドフレームに応じたレスポンスタイプ、サブユニットアドレス、オペコード、およびオペランドにより構成される。
次に、本実施形態におけるカメラ・ストレージ・サブユニットのコマンドについて説明する。図14は、カメラ・ストレージ・サブユニットのコマンドと、カメラ・ストレージ・サブユニットのオペコード値との関係の一例を示す図である。
カメラ・ストレージ・サブユニットのコマンドは、コントローラからコマンドフレームとして発行される時、およびレスポンスフレームとしてコントローラに返される時に、共通のヘッダ領域(“common frame header”、以下、「共通フレームヘッダ」と称す。)を有する。制御コマンド(control command)(以下、単に「コマンド」とも称す。)における共通フレームヘッダのフォーマットを図15に示す。なお、図15においては、コマンドフレーム(command frame)における共通フレームヘッダのフォーマットを一例として示している。
図15において、オペコード(opcode)には、上記図14に示したオペコード値が入力される。また、レスポンスフレーム(response frame)におけるオペコードには、コマンドフレームのオペコードの値と同じ値が入力される。
第0のオペランド(operand[0])は、1バイトのサブファンクション(subfunction)フィールドであり、制御コマンドの動作モードを指定する。上記制御コマンドの動作モードとサブファンクションフィールド値との関係を図16に示す。カメラ・ストレージ・サブユニットが無効なサブファンクションフィールド値が入力されたコマンドフレームを受信した場合には、“NOT IMPLEMENTED”のレスポンス値(レスポンスフィールドの値が“10002”)を有するレスポンスフレームを返す。また、レスポンスフレームにおける第0のオペランドには、コマンドフレームの第0のオペランドの値と同じ値が入力される。
第1のオペランド(operand[1])は、1バイトのフィールドであり、固定値“FF16”が入力される。また、レスポンスフレームにおける第1のオペランドには結果コード(result code)が入力されて返される。上記結果コードの符号化の一例を図17に示す。ここで、カメラ・ストレージ・サブユニットが複数の理由により“REJECTED”レスポンスフレーム(レスポンスフィールドの値が“10102”)を返す場合には、図17に示した最も小さい値のデータが上記結果コードとして第1のオペランドに入力される。また、カメラ・ストレージ・サブユニットが“INTERIM”レスポンスフレーム(レスポンスフィールドの値が“11112”)を返す場合には、コントローラが発行した固定値と同じ“FF16”が結果コードとして入力される。
第2のオペランド(operand[2])は、物理ボリューム番号フィールドであり、物理ボリュームの指定を行う。第3のオペランド(operand[3])は、論理ボリューム番号フィールドであり、論理ボリュームの指定を行う。また、上述したようにコントローラがこれらのフィールドを用いないことを示す場合には、値“FF16”が入力される。
ここで、コマンドフレーム内の物理ボリューム番号フィールドの値または論理ボリューム番号フィールドの値が無効な場合には、カメラ・ストレージ・サブユニットは“REJECTED”レスポンスフレームあるいは“NOT IMPLEMENTED”レスポンスフレームを返す。このとき本実施形態では、例えば、以下のように動作する。
・コマンドフレームで指定された物理ボリューム番号(物理ボリューム番号フィールド値)の記録メディアが存在しない場合には、カメラ・ストレージ・サブユニットは、結果コードとして“no media”(A016)の値が第1のオペランドに入力された“REJECTED”レスポンスフレームを返す。
・コマンドフレームで指定された論理ボリューム番号(論理ボリューム番号フィールド値)が物理ボリューム内に存在しない場合には、カメラ・ストレージ・サブユニットは、結果コードとして“invalid volume number”(9116)の値が第1のオペランドに入力された“REJECTED”レスポンスフレームを返す。
・カメラ・ストレージ・サブユニット内に存在しない物理ボリューム番号がコマンドフレームにより指定された場合には、カメラ・ストレージ・サブユニットは“NOT IMPLEMENTED”レスポンスフレームを返す。
第4のオペランド(operand[4])は、メディア・カウントフィールドであり、記録メディアの交換を通知するために用いられる。コントローラが上記図14に示したメディア情報(“MEDIA INFO”)コマンドフレームおよびボリューム情報(“VOLUME INFO”)コマンドフレーム以外のコマンドフレームを発行する場合には、コントローラが保持しているメディア・カウントの値が上記メディア・カウントフィールドに設定される。また、コントローラがメディア情報コマンドフレーム、あるいはボリューム情報コマンドフレームを発行する場合には、上記メディア・カウントフィールドに“FF16”の値が設定される。
カメラ・ストレージ・サブユニットは、上記メディア情報コマンドフレーム以外のコマンドフレームに対し、自らが保持しているメディア・カウント値を第4のオペランドに設定したレスポンスフレームを返す。このとき、受信したコマンドフレームがメディア情報コマンドフレーム、ボリューム情報コマンドフレーム以外のコマンドフレームであった場合には、カメラ・ストレージ・サブユニットは、自らが保持しているメディア・カウント値とコマンドフレーム内のメディア・カウント値とを比較する。その結果、メディア・カウント値が異なる場合には、カメラ・ストレージ・サブユニットは、結果コードとして“invalid generation count”(9016)の値が第1のオペランドに入力された“REJECTED”レスポンスフレームを返す。
また、通常は、コントローラがカメラ・ストレージ・サブユニットに任意の制御コマンドフレームを最初に送信する以前に、コントローラはボリューム情報コマンドフレームを発行して現在のメディア・カウント値を取得する。
図18は、ファイルリストコマンド(FILE LIST control command)フレームのフォーマットを示す図である。
ファイルリストコマンドフレームにおいて、最初の6バイトのフィールドは、上述した共通フレームヘッダである。
第5のオペランド(operand[5])は、ファイルタイプ(file_type)フィールドであり、取得するディレクトリエントリのファイル型を指定する。ファイルタイプフィールド値の定義を図19に示す。ファイルタイプフィールド値が“0016”(ファイルタイプ“any”)の場合には、返されるディレクトリエントリは任意のファイルあるいはディレクトリを含む。また、ファイルタイプフィールド値が“0116”(ファイルタイプ“still image”)の場合には、返されるディレクトリエントリは静止画像ファイルのみを含む。
第6のオペランド(operand[6])の下位2ビットは、属性(attribute)フィールドであり、取得するディレクトリエントリの型を指定する。属性フィールドの定義を図20に示す。
属性フィールドの下位ビット(“bit0”)が“1”に設定されている時には、カメラ・ストレージ・サブユニットはサブディレクトリを含んだディレクトリエントリを返す。一方、属性フィールドの下位ビットが“0”にクリアされている時には、カメラ・ストレージ・サブユニットはサブディレクトリを含んだディレクトリエントリを返さない。
また、属性フィールドの上位ビット(“bit1”)が“1”に設定されている時には、カメラ・ストレージ・サブユニットはファイルを含んだディレクトリエントリを返す。一方、属性フィールドの上位ビットが“0”にクリアされている時には、カメラ・ストレージ・サブユニットはファイルを含んだディレクトリエントリを返さない。
さらに、属性フィールドの双方のビットがともに“1”に設定されている時には、カメラ・ストレージ・サブユニットはファイルとサブディレクトリとを含んだディレクトリエントリを返す。
第7および第8のオペランド(operand[7]およびoperand[8])は、開始番号(start_number)フィールドを構成し、開始番号フィールドは、取得するディレクトリエントリの開始位置を指定する。開始番号フィールド値は、“0”から始まり、開始番号フィールド値により後述するページングパラメータを指定する。
第9のオペランド(operand[9])の最上位ビット(MSB)は、エンド・オブ・リスト(“eol”:end of list)ビットである。レスポンスフレーム内のエンド・オブ・リストビットは、レスポンスフレーム内の最後のディレクトリエントリが、コマンドフレームで指定されたディレクトリの中の最後のディレクトリエントリであるか否かを示す。
具体的には、レスポンスフレームのエンド・オブ・リストビットの値が“0”にクリアされている場合には、レスポンスフレーム内の最後のディレクトリエントリが、コマンドフレームで指定されたディレクトリの最後のディレクトリエントリでないことを示す。一方、レスポンスフレームのエンド・オブ・リストビットの値が“1”に設定されている場合には、レスポンスフレーム内の最後のディレクトリエントリがコマンドフレームで指定されたディレクトリの最後のディレクトリエントリであることを示す。
また、コントローラは、エンド・オブ・リストビットを“0”にクリアしてコマンドフレームを発行する。
第9のオペランドの下位5ビットは、エントリ数(number_of_entries)フィールドであり、コマンドフレームでは取得するディレクトリエントリ数を指定し、レスポンスフレームではレスポンスフレーム内に実際に含まれるディレクトリエントリ数を示す。コマンドフレーム内のエントリ数フィールド値と、その応答としてのレスポンスフレーム内のエントリ数フィールド値とは一致しないことがあり得るが、レスポンスフレーム内のエントリ数フィールド値は、それに対応するコマンドフレーム内のエントリ数フィールド値以下になることが保証されている。
上記開始番号フィールド、エンド・オブ・リストビット、およびエントリ数フィールドの値に基づいて、ページング機構が提供される。ここで、ページングは、カメラ・ストレージ・サブユニットがレスポンスフレームにより一度に返すことが可能なデータ長に制限があるため、複数のコマンド、レスポンストランザクションによりデータを授受する仕組みである。
図21は、ページング動作を示すフローチャートである。なお、図21においては、コントローラにおけるファイルリスト取得時のページング動作の一例を示している。
図21において、ステップstep1にて、本実施形態におけるページング動作が開始されると、ステップstep2にて、コントローラは、上記開始番号の値を初期化する(例えば、開始番号の値に“0”を入力する)。
次のステップstep3にて、コントローラは、上記エントリ数の値を初期化する。ここで、エントリ数の初期値は、コマンドフレームおよびレスポンスフレームの最大バイト数に応じて十分大きな値が入力される。例えば、コマンドフレームおよびレスポンスフレームの最大バイト数が256バイトの場合には、エントリ数の初期値として“128”等が入力される。
次に、コントローラは、ステップstep4にて、ファイルリストコマンドフレームを送信し、ステップstep5にて、カメラ・ストレージ・サブユニットからのレスポンスフレームを受信する。コントローラは、レスポンスフレーム内の開始番号フィールド、エンド・オブ・リストビット、およびエントリ数フィールドの値をそれぞれ解析して、後に続く動作を決定する。
まずステップstep6にて、エンド・オブ・リストビットが検査される。エンド・オブ・リストビットの値が“0”のときには、上述したようにディレクトリエントリが最後に達していないので、さらにディレクトリエントリを取得するために次のステップstep7に進む。ステップstep7では、開始番号フィールドの値と、レスポンスフレーム中のエントリ数フィールドの値とを加算して、新たな開始番号値を生成する。
次のステップstep8にて、レスポンスフレームから抽出したエントリ数フィールドの値をコマンドフレーム中のエントリ数フィールドに入力する。上述したように、レスポンスフレーム内のエントリ数フィールドの値は、それに対応するコマンドフレーム内のエントリ数フィールドの値以下となることが保証されているとともに、上記ステップstep3ではコマンドフレーム中のエントリ数フィールドの値に十分に大きな値が入力されているので、ステップstep8にてエントリ数フィールドに入力される値はレスポンスフレームにて返すことができる最大エントリ数である確率が高い。
上記ステップstep4〜step8はループを構成しており、全てのディレクトリエントリを取得するまでステップstep4〜step8が実行される。一方、ステップstep6にて、エンド・オブ・リストビットの値が“1”のときには、ディレクトリエントリが最後に達しているので、ステップstep9に進み、ディレクトリエントリ取得動作を終了する。
上述したページング動作により、コントローラは着目したディレクトリに対して効率良くディレクトリエントリを取得することができる。
図18に戻り、第10および第11のオペランド(operand[10]およびoperand[11])は、リザーブ(reserved)フィールドであり、当該フィールドにいかなる値を設定してもカメラ・ストレージ・サブユニットに無視される。コントローラは、当該フィールドに、例えば“FF16”の値を設定してコマンドフレームを送信する。
第12のオペランド(operand[12])は、リクエストパス長(request_path_length)フィールドであり、後に続くリクエストパス(request_path)フィールドのバイト長を示す。第13のオペランド(operand[13])以降は、可変長のリクエストパスフィールドであり、所望のディレクトリまたはファイルのパス名を指定する。上記リクエストパス長およびリクエストパスは、上述したファイルパス長およびファイルパスにそれぞれ相当する。
上述したファイルリストコマンドフレームに対する応答としてのレスポンスフレームにおいては、ファイルリスト(file_list)フィールドが上述したリクエストパスフィールドの領域に設定される。ファイルリストフィールドは、可変長フィールドであり、上述したディレクトリエントリが保持されている。ファイルリストフィールドには複数のディレクトリエントリを含むことが可能であり、ファイルリストフィールドに含まれるディレクトリエントリ数は、上述したレスポンスフレーム内のエントリ数フィールドにより指示される。また、図3に示したように、各ディレクトリエントリのサイズは20バイトである。
図22は、メディア情報コマンド(MEDIA INFO control command)フレームのフォーマットを示す図である。メディア情報コマンドは、カメラ・ストレージ・サブユニット内の記録メディアの情報を取得するために使用される。
メディア情報コマンドフレームにおいて、最初の6バイトのフィールドは、上述した共通フレームヘッダであり、物理ボリューム番号フィールド、論理ボリューム番号フィールド、およびメディア・カウントフィールドには固定値“FF16”をそれぞれ指定する。
図23は、メディア情報コマンドフレームに対するレスポンスフレームのフォーマットを示す図であり、最初の6バイトのフィールドは共通フレームヘッダに対する応答部分である。
第5のオペランド(operand[5])は、物理ボリューム数(number_of_physical_volume)フィールドであり、カメラ・ストレージ・サブユニット内の記録メディア数、すなわち物理ボリューム数が入力される。なお、記録メディアが着脱可能であって記録メディアが挿入されていない時にも、当該記録メディアが物理ボリューム数に加えられている。
第6のオペランド(operand[6])以降は、論理ボリューム数(number_of_logical_volume)フィールドであり、物理ボリューム毎の論理ボリューム数が入力される。論理ボリューム数フィールドの総数は、上記物理ボリューム数フィールドの値に応じて異なり、物理ボリューム数フィールドの値がn(nは自然数)の場合には、第0の論理ボリューム数フィールド(number_of_logical_volume[0])から第(n−1)のボリューム数フィールド(number_of_logical_volume[n-1])までのn個の論理ボリューム数フィールドが存在する。なお、記録メディアが着脱可能であって記録メディアが挿入されていない時には、当該記録メディアに関連付けられている論理ボリューム数フィールドには“0016”の値が入力される。
図24は、ファイル受信コマンド(RECEIVE FILE control command)フレームのフォーマットを示す図である。ファイル受信コマンドは、カメラ・ストレージ・サブユニット内の記録メディアにサブユニット・デスティネーションプラグ(subunit destination plug)から受信したファイルを記録するために使用される。
ファイル受信コマンドフレームにおいて、最初の6バイトのフィールドは、上述した共通フレームヘッダであり、物理ボリューム番号フィールドおよび論理ボリューム番号フィールドには記録される受信ファイルのボリュームを指定する。コントローラは、当該フィールドに“FF16”(“any available volume”)の値を設定して、カメラ・ストレージ・サブユニットが選択した任意の記録可能な物理ボリュームおよび論理ボリュームにファイルを記録することができる。そして、カメラ・ストレージ・サブユニットは、記録時に選択した物理ボリューム番号および論理ボリューム番号を、上記物理ボリューム番号フィールドおよび論理ボリューム番号フィールドにそれぞれ設定してレスポンスフレームを返す。
なお、コントローラがコマンドフレームの物理ボリューム番号フィールドに“FF16”の値を設定した場合には、カメラ・ストレージ・サブユニットは、コマンドフレーム内のメディア・カウントフィールドを無視するととも、選択した物理ボリュームのメディア・カウント値をメディア・カウントフィールドに設定したレスポンスフレームを返す。
第5〜第8のオペランド(operand[5]〜operand[8])の4バイトは、受信サイズ(receive_size)フィールドであり、記録するファイルのバイト数を指定する。コントローラが、記録するファイルのバイト数を予め決定できない場合には、コントローラは受信サイズフィールドに零(“00 00 00 0016”)の値を設定して、カメラ・ストレージ・サブユニットにファイルを記録させることができる。
第9のオペランド(operand[9])は、デスティネーションプラグ(destination_plug)フィールドであり、ファイルデータを入力するためのサブユニット・デスティネーションプラグを指定する。通常、コントローラは、ファイル受信コマンドフレームを発行するのに先立ち、カメラ・ストレージ・サブユニットのサブユニット・デスティネーションプラグと、ユニットプラグ(unit plug)または同じユニット内の他のサブユニットのサブユニット・ソースプラグ(subunit source plug)とのコネクションを確立する。
ここで、コントローラがデスティネーションプラグフィールドにて指定するサブユニット・デスティネーションプラグが既に使用されている場合には、カメラ・ストレージ・サブユニットは、結果コードとして“busy”(“8016”)の値が第1のオペランドに入力された“REJECTED”レスポンスフレームを返す。
第10のオペランド(operand[10])は、受信モード(receive_mode)フィールドであり、第13のオペランド(operand[13])以降のファイルパスフィールドで指定されたファイルパス名と同じファイルパス名のファイルが既に存在するときの動作を指定する。受信モードフィールドの符号化の一例を図25に示す。
第11のオペランド(operand[11])は、ファイルタイプフィールドであり、受信されるファイルの型を指定する。ファイルタイプフィールドの符号化の一例を図26に示す。
ファイル受信コマンドフレームに対する応答としてのレスポンスフレームでは、例えば、上記受信サイズフィールド、デスティネーションプラグフィールド、受信モードフィールド、およびファイルタイプフィールドには、コマンドフレームと同じ値が入力されて返される。
第12のオペランド(operand[12])は、ファイルパス長フィールド、第13のオペランド以降は可変長のファイルパスフィールドであり、上述したファイルパス長およびファイルパスに相当する。上述したように記録された結果のファイルパス名は、上記ファイルパスフィールドに設定され、レスポンスフレームによりコントローラに返される。なお、ファイル受信コマンドフレームに対して“REJECTED”レスポンスフレームが返されるときは、ファイルパスフィールドには零の値が設定される。
図27は、ファイル送信コマンド(SEND FILE control command)フレームのフォーマットを示す図である。ファイル送信コマンドフレームは、ファイルデータの送信トリガとして使用される。
ファイル送信コマンドフレームにおいて、最初の6バイトの領域は、上述した共通フレームヘッダである。また、第5〜第8のオペランド(operand[5]〜operand[8])には固定値“FF16”が設定される。
第9のオペランド(operand[9])は、ソースプラグ(source_plug)フィールドであり、ファイルデータの送信に使用されるサブユニット・ソースプラグを指定する。通常、コントローラは、ファイル送信コマンドフレームを発行するのに先立ち、カメラ・ストレージ・サブユニットのサブユニット・ソースプラグと、ユニットプラグまたは同じユニット内の他のサブユニットのサブユニット・デスティネーションプラグとのコネクションを確立する。
ここで、カメラ・ストレージ・サブユニットがファイル送信コマンドフレームを受信したとき、当該コマンドフレームのソースプラグフィールドで指定されたサブユニット・ソースプラグが既に使用されている場合には、カメラ・ストレージ・サブユニットは、結果コードとして“busy”(“8016”)の値が第1のオペランドに入力された“REJECTED”レスポンスフレームを返す。
また、ファイル送信コマンドで指定されたサブユニット・ソースプラグに接続されているユニットプラグまたは同じユニット内の他のサブユニットのサブユニット・デスティネーションプラグが指定されたファイルを受信できない場合には、カメラ・ストレージ・サブユニットは、結果コードとして“invalid file type”(“A616”)の値が第1のオペランドに入力された“REJECTED”レスポンスフレームを返す。
上述したファイル受信コマンドフレームと同様に、第12のオペランド(operand[12])はファイルパス長フィールド、第13のオペランド(operand[13])以降は可変長のファイルパスフィールドであり、上述したファイルパス長およびファイルパスに相当する。上述したように記録された結果のファイルパス名は、上記ファイルパスフィールドに設定され、レスポンスフレームによりコントローラに返される。なお、ファイル送信コマンドフレームに対して“REJECTED"レスポンスフレームが返されるときは、ファイルパスフィールドには零の値が設定される。
図28は、ボリューム情報コマンド(VOLUME INFO control command)フレームのフォーマットを示す図であり、図29は、ボリューム情報コマンドフレームに対するレスポンスフレームのフォーマットを示す図である。ボリューム情報コマンドは、指定されたボリュームの情報を取得するために使用される。
上記図28に示したボリューム情報コマンドフレームにおいて、最初の6バイトのフィールドは、上述した共通フレームヘッダであり、物理ボリューム番号フィールドおよび論理ボリューム番号フィールドには、情報を取得する物理ボリュームおよび論理ボリュームをそれぞれ指定する。
第4のオペランド(operand[4])は、ボリューム情報コマンドフレームにおいては固定値“FF16”が設定され、レスポンスフレームにおいてはメディア・カウント値が設定される。
第5のオペランド(operand[5])は、ボリューム情報コマンドフレームにおいては固定値“FF16”が設定され、レスポンスフレームにおいては属性(attributes)フィールドである。属性フィールドは、指定されたボリュームの状態を示す属性がビットアサインされる。
属性フィールドのフォーマットを図30に示す。図30において、最上位ビットから6ビットのフィールドは、リザーブビットであり、当該領域に指定した値はカメラ・ストレージ・サブユニットにて無視される。最下位ビットから2ビット目のビット(“bit1”)は、書き込み禁止指示(write_protected)ビットであり、指定されたボリュームが書き込み禁止の場合には“1”に設定される。最下位ビット(“bit0”)は、読み出し専用指示(read_only_media)ビットであり、指定されたボリュームが読み出し専用の場合には、“1”に設定される。
ボリューム情報コマンドフレームにおいて、第9〜第16のオペランド(operand[9]〜operand[16])および第17〜第24のオペランド(operand[17]〜operand[24])には、固定値“FF FF FF FF FF FF FF FF16”が設定される。
ボリューム情報コマンドフレームに対するレスポンスフレームにおいて、第9〜第16のオペランド(operand[9]〜operand[16])は、最大容量(maximum_capacity)フィールドであり、指定されたボリュームの最大容量がバイト単位で設定される。また、第17〜第24のオペランド(operand[17]〜operand[24])は、空き容量(free_space)フィールドであり、指定されたボリュームの現在の空き容量がバイト単位で設定される。
<ファイル転送>
次に、コントローラとカメラ・ストレージ・サブユニットとの間での標準的な通信手順について説明する。図31は、コントローラとカメラ・ストレージ・サブユニットとの間でのコマンドの発行手順の概要を示す図である。
まず、コントローラは、カメラ・ストレージ・サブユニットに対してメディア情報コマンドを発行して、カメラ・ストレージ・サブユニットが有する記録メディアのボリューム数の情報を取得する(S11)。コントローラは、メディア情報コマンドによりボリューム数の情報を取得した後、1つのボリュームを選択する。
コントローラは、選択したボリュームにアクセスする前にボリューム情報コマンドを発行して、カメラ・ストレージ・サブユニットから現在のメディア・カウント値を取得する(S12)。当該ボリューム情報コマンドにより取得した値は、コントローラが選択したボリュームにアクセスするための各コマンドのコマンドフレームを発行する際に、メディア・カウントフィールドに設定される。
その後、コントローラは、ファイルリストコマンドを発行して、カメラ・ストレージ・サブユニットからファイルリストを取得する(S13)。コントローラは、ファイルリストを取得した後、ファイル送信コマンドあるいはファイル受信コマンドを発行し、コントローラとカメラ・ストレージ・サブユニットとの間でのファイル転送を開始させる(S14)。
次に、カメラ・ストレージ・サブユニットからのファイル(データ)転送手順について説明する。上記図31に示した通信手順により、ファイルリストを取得したコントローラは、ファイル送信コマンドを発行してデータ送信要求を行う。
このとき、コントローラは、ファイル送信コマンドの発行に先立って、カメラ・ストレージ・サブユニットのサブユニット・ソースプラグと、送信先(受信側)の装置であるデスティネーションとの間に、例えば上述したアシンクロナスコネクション(Asynchronous Connection)により、コネクションを確立する。なお、上記デスティネーションはコントローラであっても良いし、他の装置であっても良い。
図32は、カメラ・ストレージ・サブユニットからファイルを転送させる際のコマンドフローの一例を示す図であり、縦方向(T軸方向)は概念的な時間経過を示している。
図32において、例えばコントローラとカメラ・ストレージ・サブユニットとの間に、アシンクロナスコネクションによりコネクションを確立する(S21)。次に、コントローラは、カメラ・ストレージ・サブユニットに対してファイル送信コマンドを発行して(S22)、カメラ・ストレージ・サブユニットからのデータの転送(S23)を開始させる。本実施形態では、コントローラは、図32に示したように上記コネクションが確立されている間において、複数のファイル送信コマンドを発行して、複数のトランザクションを発生させることが可能である(S24、S25)。コントローラは、データ転送が終了すると上記ステップS21にて確立したコネクションを切断する(S26)。
次に、カメラ・ストレージ・サブユニットにファイルを受信させる手順について説明する。図33は、カメラ・ストレージ・サブユニットにファイルを受信させる際のコマンドフローの一例を示す図であり、上記図32と同様に縦方向(T軸方向)は概念的な時間経過を示している。上記図31に示した通信手順により、ボリュームに関する情報を取得したコントローラは、ファイル受信コマンドを発行してファイルデータの受信要求を行う。
このとき、コントローラは、ファイル受信コマンドの発行に先立って、カメラ・ストレージ・サブユニットのサブユニット・デスティネーションプラグと、送信元(送信側)の装置であるソースとの間にアシンクロナスコネクションによりコネクションを確立する(S31)。なお、上記ソースは、コントローラであっても良いし、他の装置であっても良く、例えば図33においては、コントローラをソースとしてコネクションを確立している。
次に、コントローラは、カメラ・ストレージ・サブユニットに対してファイル受信コマンドを発行して(S32)、カメラ・ストレージ・サブユニットにファイルデータの受信(S33)を開始させる。図33に示したように上記コネクションが確立している間において、コントローラは、複数のファイル受信コマンドを発行して、複数のファイルを受信させることが可能である(S34、S35)。コントローラは、ファイルデータ転送が終了すると上記ステップS31にて確立したコネクションを切断する(S36)。
上述したファイル転送の手順において、コネクションは確立されているが、コントローラからファイル転送のトリガになるコマンド、例えばファイル送信コマンドあるいはファイル受信コマンドが発行されていないにもかかわらずファイルデータが送受信された場合には、カメラ・ストレージ・サブユニットは当該ファイルデータを破棄する。
以上説明したように、データの送信側であるプロデューサノード(以下、「プロデューサ」と称す。)と、データの受信側であるコンシューマノード(以下、「コンシューマ」と称す。)とのコネクションを管理するコントローラノード(以下、「コントローラ」と称す。)が、プロデューサとコンシューマとを制御する場合には、コントローラは次の手順に従ってコマンドを発行する。
1)コントローラは、コネクションを確立するコマンドをコンシューマおよびプロデューサに発行する。
2)コントローラは、トリガコマンド(例えば、ファイル受信コマンド)をコンシューマに発行する。
3)コントローラは、コンシューマからのレスポンスを受け取った後、トリガコマンド(例えば、ファイル送信コマンド)をプロデューサに発行する。
<アシンクロナスコネクション(Asynchronous Connection)>
上述したように本実施形態におけるファイルシステムでは、アシンクロナスコネクションにより、ファイルデータの転送およびファイル属性データの転送が行われる。アシンクロナスコネクションによりデータを送受信する通信システムは、例えば図34に示すように、データの送信側であるプロデューサ3401、データの受信側であるコンシューマ3402、およびプロデューサとコンシューマとのコネクションを管理するコントローラ3403から構成される。なお、図34においては、プロデューサ3401、コンシューマ3402、およびコントローラ3403をそれぞれ異なるノードとして示しているが、コントローラ3403を設けずに、プロデューサ3401がコントローラ3403の機能を有するようにしても良いし、コンシューマ3402がコントローラ3403の機能を有するようにしても良い。
プロデューサ3401およびコンシューマ3402は、データの送受信を行うためのアシンクロナスプラグレジスタ(Asynchronous Plug Register)をそれぞれ所有する。上記アシンクロナスプラグレジスタは、図35に示すように構成されており、1つのアシンクロナス入力ポートレジスタ(iAPR:input Asynchronous Port Register)と、複数のアシンクロナス出力ポートレジスタ(oAPR:output Asynchronous Port Register)(図35に示した例においては、第1〜第14のアシンクロナス出力ポートレジスタ(oAPR[1]〜oAPR[14]))とで構成される。また、1つのアシンクロナス入力ポートレジスタおよび複数のアシンクロナス出力ポートレジスタは、IEEE1394インターフェースのアドレス空間にそれぞれ割り当てられる。
ここで、プロデューサとしての機能のみを有するノードは、アシンクロナス出力ポートレジスタだけを備え、コンシューマとしての機能のみを有するノードは、アシンクロナス入力ポートレジスタとデータ受信用のセグメントバッファ(segment buffer)とを備える。また、プロデューサおよびコンシューマの双方の機能を有するノードは、アシンクロナス入力ポートレジスタとアシンクロナス出力ポートレジスタとセグメントバッファとを備える。
ここで、プロデューサは、1つのコネクションで複数のコンシューマに対してデータを送信することができる場合には、そのデータ送信能力に応じて複数のアシンクロナス出力ポートレジスタを備え、1つのコンシューマにのみデータを送信することができない場合には、1つのアシンクロナス出力ポートレジスタだけを備えていれば良い。
また、複数のコネクションを同時に形成することができるノードは、上記図35に示したアシンクロナスプラグレジスタを複数備える。このようにノードによっては複数のアシンクロナスプラグを有する場合もあり、各アシンクロナスプラグはプラグID(plug_id)により識別される。
例えば、プロデューサ3401がライトトランザクションによりコンシューマ3402が備えるセグメントバッファに画像データ等を書き込むとする。このとき、書き込まれるデータをフレームと呼び、フレームのサイズがセグメントバッファのサイズより大きい場合には、複数回のセッションに分けて書き込みが行われる。この1回のセッションで書き込まれるデータをセグメントと呼ぶ。
コントローラ3403は、コンシューマ3402のノードID、コネクションに使用するコンシューマ3402のプラグアドレス、プラグ番号等の情報をプロデューサ3401に対して送信する。同様に、コントローラ3403は、プロデューサ3401のノードID、コネクションに使用するプロデューサ3401のプラグアドレス、プラグ番号等の情報をコンシューマ3402に対して送信する。コントローラ3403からの情報を受信したプロデューサ3401およびコンシューマ3402は、受信した情報に基づいてデータの通信を開始し、プロデューサ3401からコンシューマ3402にデータが送信される。
上述したコントローラ3403からプロデューサ3401あるいはコンシューマ3402に対しての通信、およびプロデューサ3401とコンシューマ3402との間でのデータの通信は、アシンクロナストランザクションを用いて行われる。このアシンクロナストランザクションに用いられるパケットフォーマットは、上記図6に示したデータ構造と同様である。
上記アシンクロナスコネクションに用いられるコマンドフレームのフォーマットは、例えば図36に示すように構成されている。なお、コントローラ3403からプロデューサ3401あるいはコンシューマ3402に送信されるコマンドフレームと、プロデューサ3401あるいはコンシューマ3402からコントローラ3403に送信されるレスポンスフレームとは、同じフォーマットである。
オペコード(opcode)3601は、コマンドの種類を示しており、アシンクロナスコネクションのコマンドフレームであることを示すコード値“2616”が設定される。
サブファンクションフィールド3602は、当該コマンドによりプロデューサやコンシューマが行う動作(プラグリソースの確保、コネクションの設定/解除等)を指定する。サブファンクションフィールドの符号化について図37に示す。
なお、以下の説明では、アシンクロナスコネクションコマンド(ASYNCHRONOUS CONNECTION control command)フレームは、サブファンクションフィールドに基づいて呼称する。例えば、アシンクロナスコネクションコマンドフレームのサブファンクションフィールドの値が“E116”(EX_ALLOCATE)の場合には、“EX_ALLOCATE”コマンドフレームと称する。
ステータス(status)フィールド3603は、コマンド実行結果の状態を表すフィールドであり、レスポンスフレームにおいてデータが設定され、コントローラに状態が通知される。
プラグID(plug_id)フィールド3604は、コネクションに使用するプラグ番号を指定する。プラグIDフィールドの符号化の一例を図38に示す。図38において、値“BF16”は特別であり、コントローラが、カメラ・ストレージ・サブユニットのようなアシンクロナスコネクションをサポートしたデバイスに対して、現在使用していないプラグIDを用いてコネクションを確立するように指示するために使用される。
プラグオフセット(plug_offset)フィールド3605は、42ビットのフィールドであり、プラグの先頭アドレス(図35に示したアシンクロナス入力ポートレジスタに相当するアドレス)が設定される。
ポートID(port_id)フィールド3606は、プラグ内のどのポートが選択されているかを示す。ポートIDフィールドの符号化の一例を図39に示す。図39において、コンシューマポート(Consumer Port[0])は、図35に示したアシンクロナス入力ポートレジスタ(iAPR)に対応し、第1〜第14のプロデューサポート(Producer Port[1]〜Producer Port[14])は、図35に示した第1〜第14のアシンクロナス出力ポート(oAPR[1]〜oAPR[14])にそれぞれ対応する。また、値“0F16”は特別であり、コントローラが、カメラ・ストレージ・サブユニットのようなアシンクロナスコネクションをサポートしたデバイスに対して、現在使用していないプロデューサポートを用いてコネクションを確立するように指示するために使用される。
したがって、コネクションに使用されるポートレジスタのオフセットアドレスは、例えば次式(1)により計算される。
(オフセットアドレス)=(plug_offset)≪6|(port_id)≪2 …(1)
ここで、上記式(1)において、“≪”は左ビットシフト演算を示し、“|”はビット毎の論理和(OR)演算を示す(以下についても同様である。)。
ポートビット(port_bits)フィールド3607は、選択されているポートの能力を示す。ポートビットフィールドの符号化の一例を図40に示す。なお、図40において“X”は、考慮しないビット(Don't Care)であることを示す。
接続ノードID(connected_node_id)フィールド3608は、コネクションを設定する相手のノード(以下、「接続ノード」と称す。)を示す。コントローラは、コンシューマに対しては接続されるプロデューサのノードIDを設定してコマンドフレームで通知し、プロデューサに対しては接続されるコンシューマのノードIDを設定してコマンドフレームで通知する。
接続プラグオフセット(connected_plug_offset)フィールド3609は、接続ノードが有するプラグのアドレスを示す。
接続ポートID(connected_port_ID)フィールド3610は、コネクションに使用する接続ノードのポート番号を示す。
したがって、接続ノードのポートレジスタのオフセットアドレスは、次式(2)により計算される。
(オフセットアドレス)
=(connected_plug_offset)≪6|(connected_port_id)≪2 …(2)
接続ポートビット(connected_port_bits)フィールド3611は、接続ノードのポートの能力を示す。
接続プラグID(connected_plug_id)フィールド3612は、コネクションに使用される接続ノードのプラグ番号を示す。
排他制御(ex:exclusive)ビット3613は、コントローラが、内部コネクションとユニットから他のユニットへの接続との双方の制御に関して、他のコントローラを排除することを指定するビットである。
具体的には、排他制御ビット3613が“1”に設定されたアシンクロナスコネクションコマンドフレームを受け入れたターゲットノード(コントローラからのコマンドフレームを受信するノード)は、その後に発行され、受信したアシンクロナスコネクションコマンドフレームを調べ、受信したアシンクロナスコネクションコマンドフレームを発行したコントローラのノードIDと、排他制御ビット3613が“1”に設定されたアシンクロナスコネクションコマンドフレームを発行したコントローラのノードIDとが一致するか否かを検出する。その結果、ノードIDが不一致の場合には、ターゲットノードは受信したコマンドフレームに対して“REJECTED”レスポンスフレームを返す。
また、排他制御ビット3613が“1”に設定されたアシンクロナスコネクションコマンドフレームは、次の場合にターゲットノードに受けつけられる。
・指定されたプラグがコンシューマのプラグの場合
・指定されたプロデューサのプラグが使用されていない場合
上述の場合には、ターゲットノードは、当該アシンクロナスコネクションコマンドフレームを発行したコントローラに対して、“ACCEPTED”レスポンスフレームを返す。
コネクションカウント(connection_count)フィールド3614は、コンシューマのポートがいくつのプロデューサポートに接続されているかを示す。
ライトインターバル(write_interval)フィールド3615は、プロデューサがコンシューマのセグメントバッファにライトトランザクションを行う際のトランザクションの最小間隔を示す。
リトライカウント(retry_count)フィールド3616は、シリアルバストランザクションに失敗した場合に必要になるリトライ(再実行)回数の値を示す。リトライカウントフィールドの値は、コンシューマからのレスポンスフレームで設定される。
サブユニットタイプ(subunit_type)フィールド3617とサブユニットID(subunit_id)フィールド3618とで、ソースまたはデスティネーションになるサブユニットを指定する。サブユニットタイプフィールド3617とサブユニットIDフィールド3618の定義は、上述したサブユニットアドレスと同様である。
サブユニットプラグ(subunit_plug)フィールド3619は、データを授受するための入出力プラグであるサブユニットプラグ番号を指定する。
次に、上述したアシンクロナスコネクションにおけるコネクション確立手順について説明する。図41は、アシンクロナスコネクションにおけるコネクション確立手順を示す図である。
図41において、4100はプロデューサ、4101はプロデューサ4100が有する第1のサブユニット、4102はソースプラグ、4103はプロデューサポート、4110はコントローラ、4120はコンシューマ、4121はコンシューマ4120が有する第2のサブユニット、4122はデスティネーションプラグ、4123はコンシューマポートである。
図41に示すように、本実施形態では、コントローラ4110は、まず、“EX_ALLOCATE”コマンド(EX_ALLOCATE control command)フレームをコンシューマ4120に対して発行する(1a)。このとき、図41に示した例では、コンシューマ4120内における第2のサブユニット4121のデスティネーションプラグ4122とコンシューマポート4123との内部コネクションが確立される。
なお、デスティネーションプラグ4122とコンシューマポート4123との内部コネクションは、最初の“EX_ALLOCATE”コマンドフレームの発行後、後述する“EX_ATTACH”コマンド(EX_ATTACH control command)フレームが発行されるまでの間、当該内部コネクションが変更されないように排他的にロックされる。
上記図37に示したように、“EX_ALLOCATE”コマンドフレームは、アシンクロナスコネクションにおけるコンシューマポートの取得要求、サブユニット・デスティネーションプラグの取得要求、およびコンシューマポートとサブユニット・デスティネーションプラグとの間の接続要求を行う。コンシューマ4120は、サブユニットプラグIDとコンシューマポートのアドレスとを、上記“EX_ALLOCATE”コマンドフレームに対する“EX_ALLOCATE”レスポンスフレームとしてコントローラ4110に返す(1b)。
次に、コントローラ4110は、“EX_ALLOCATE_ATTACH”コマンド(EX_ALLOCATE_ATTACH control command)フレームをプロデューサ4100に対して発行し(2a)、サブユニット・ソースプラグの取得要求、プロデューサポートの取得要求、およびサブユニット・ソースプラグとプロデューサポートとの接続要求を行う。
これにより、プロデューサ4100内における第1のサブユニット4101のソースプラグ4102とプロデューサポート4103との内部コネクションが確立される。また、プロデューサ4100は、上記“EX_ALLOCATE_ATTACH”コマンドフレームに対する“EX_ALLOCATE_ATTACH”レスポンスフレームをコントローラ4110に返す(2b)。
さらに、コントローラ4110は、“EX_ATTACH”コマンド(EX_ATTACH control command)フレームをコンシューマ4120に対して発行し(3a)、プロデューサポート4103とコンシューマポート4123との接続要求を行う。コンシューマ4120は、上記“EX_ATTACH”コマンドフレームに対する“EX_ATTACH”レスポンスフレームをコントローラ4110に返す(3b)。
コンシューマ4120は、プロデューサ4100内のアシンクロナス出力ポートレジスタを更新して受信準備が終了したことを示す(4)。なお、プロデューサポート4103は、コンシューマ4120がプロデューサ4100内のアシンクロナス出力ポートレジスタを更新するまでの間、インアクティブ状態(非動作状態)に留まる。
上述のようにしてコネクションの確立手順に従って動作することにより、本実施形態では、第1のサブユニット4101と第2のサブユニット4121との間でのアシンクロナスコネクションが確立される。
次に、上述したアシンクロナスコネクションにおけるコネクション切断手順について説明する。図42は、アシンクロナスコネクションにおけるコネクション切断手順を示す図である。なお、この図42において、図41に示したブロック等と同一の機能を有するブロック等には同一の符号を付し、重複する説明は省略する。
図42に示すように、まず、コントローラ4110が“EX_DETACH”コマンド(EX_DETACH control command)フレームをコンシューマ4120に対して発行し(1a’)、コネクション切断手順が開始される。当該“EX_DETACH”コマンドフレームは、コネクションカウント値を減少させる。
コンシューマ4120が、上記“EX_DETACH”コマンドフレームに対する応答として、コントローラ4110に返す“EX_DETACH”レスポンスフレーム(1b’)にて通知されるコネクションカウント値が零であるときには、コンシューマ4120が滞りなくコネクション切断手順に入ったことを示す。
一方、上記“EX_DETACH”レスポンスフレームにて通知されるコネクションカウント値が零でないときには、コンシューマ4120は、まだ少なくとも1つのコネクションを有していることを示す。コネクションカウント値が零でない場合には、コントローラ4110は、後述する“EX_DETACH_RELEASE”コマンド(EX_DETACH_RELEASE control command)フレームを発行しないようになっている。
上述のように、上記“EX_DETACH”レスポンスフレームにて通知されるコネクションカウント値が零のとき、コンシューマ4120内の第2のサブユニット4121のデスティネーションプラグ4122とコンシューマポート4123とがインアクティブ状態になったままである。このインアクティブ状態のとき、コンシューマポート4123は、プロデューサ4100からのレジスタ更新、およびセグメントバッファへの書き込みを受け付ける。
次に、コントローラ4110は、“EX_DETACH_RELEASE”コマンドフレームをプロデューサ4100に対して発行し、(2a’)、プロデューサ4100内の第1のサブユニット4101のソースプラグ4102とプロデューサポート4103とのコネクションが切断される。また、プロデューサ4100は、上記“EX_DETACH_RELEASE”コマンドフレームに対する“EX_DETACH_RELEASE”レスポンスフレームをコントローラ4110に返す(2b’)。
最後に、コントローラ4110は、“EX_RELEASE”コマンド(EX_RELEASE control command)フレームをコンシューマ4120に対して発行し(3a’)、コンシューマ4120内における内部コネクションが切断される。コンシューマ4120は、上記“EX_RELEASE”コマンドフレームに対する“EX_RELEASE”レスポンスフレームをコントローラ4110に返す(3b’)。
上述のようにしてコネクションの切断手順に従って動作することにより、本実施形態では、第1のサブユニット4101と第2のサブユニット4121との間でのアシンクロナスコネクションが切断される。
以上、説明したように本実施形態によれば、アシンクロナスコネクションによりコネクションを確立するための既存のコマンドに加え、ユニット(プロデューサやコンシューマ)内のサブユニットプラグ(サブユニット・ソースプラグ、サブユニット・デスティネーションプラグ)を指定するためのフィールドを拡張して追加する。これにより、ユニット間におけるアシンクロナスコネクション、およびユニット内でのサブユニットプラグとユニットが備えるポートとの間におけるコネクションを単一のコマンドにより、同時に接続あるいは切断することができ、簡単な接続手順で、高速なデータ転送が可能であるとともに、データ転送の確実性が保証できる通信システムを実現することができる。
また、アシンクロナスコネクションにおける排他制御ビットを設けることで、当該排他制御ビットの値に応じて、ユニット内部でのコネクションと、ユニットから他のユニットへの接続との双方の制御に関して他のコントローラを排除し、効率良く排他制御を行うことができる。
なお、上述したアシンクロナスコネクションコマンドにおいては、AV/C Commands for Management of Asynchronous Serial Bus Connection規格と同じオペコード値(“2616”)を用いているが、他の任意の値を用いても良い。
[他の実施形態]
本発明は、単一の機器からなる装置にも適用可能であるとともに、例えば、ホストコンピュータ、インターフェース機器、リーダ、プリンタなどの複数の機器から構成されるシステムにも適用可能である。
また、上述した実施形態の機能を実現するべく各種のデバイスを動作させるように、該各種デバイスと接続された装置あるいはシステム内のコンピュータに対し、上記実施形態の機能を実現するためのソフトウェアのプログラムコードを供給し、そのシステムあるいは装置のコンピュータ(CPUあるいはMPU)に格納されたプログラムに従って上記各種デバイスを動作させることによって実施したものも、本発明の範疇に含まれる。
また、この場合、上記ソフトウェアのプログラムコード自体が上述した実施形態の機能を実現することになり、そのプログラムコード自体、およびそのプログラムコードをコンピュータに供給するための手段、例えばかかるプログラムコードを格納した記録媒体は本発明を構成する。かかるプログラムコードを記憶する記録媒体としては、例えばフレキシブルディスク、ハードディスク、光ディスク、光磁気ディスク、CD−ROM、磁気テープ、不揮発性のメモリカード、ROM(プログラムROM、EPROM、EEPROMなど)等を用いることができる。
また、コンピュータが供給されたプログラムコードを実行することにより、上述の実施形態の機能が実現されるだけでなく、そのプログラムコードがコンピュータにおいて稼働しているOS(オペレーティングシステム)あるいは他のアプリケーションソフト等と共同して上述の実施形態の機能が実現される場合にもかかるプログラムコードは本発明の実施形態に含まれることは言うまでもない。
さらに、供給されたプログラムコードがコンピュータの機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに格納された後、そのプログラムコードの指示に基づいてその機能拡張ボードや機能拡張ユニットに備わるCPU等が実際の処理の一部または全部を行い、その処理によって上述した実施形態の機能が実現される場合にも本発明に含まれることは言うまでもない。