(57)【要約】【課題】プリンタの資源が少なくても済む全２重通信路を提供する。【解決手段】プリンタからホストコンピュータへの送信データが発生した場合には、まずそのデータサイズが２４バイトを越えているか判定し（Ｓ１８０１）、越えていなければそのデータをダイレクトステータスに収めて（Ｓ１８０８）、アンソリシテッドレジスタに書き込む（Ｓ１８０６）。２４バイトを越えている場合には、ReadRequestStatusを作成して、そこにデータを格納したアドレスを収め（Ｓ１８０３）、アンソリシテッドレジスタに書き込む（Ｓ１８０６）。この場合には、ホストコンピュータからの書き込み命令により、プリンタは指定されたアドレスのデータをホストコンピュータに書き込むことで、データを送信する。【選択図】図１７
2006345547.tif 000002
【特許請求の範囲】
【請求項１】
イニシエータとターゲットとの間のデータを通信する通信制御方法であって、
ターゲットは、送信しようとするデータのサイズが所定サイズを越えるか判定し、越える場合には、イニシエータの記憶領域に対する書き込みの命令を発行するようイニシエータに対して要求し、越えない場合には、当該データをイニシエータに対して送信し、
イニシエータは、前記ターゲットから前記書き込みの命令を発行する要求を受信した場合には前記書き込みの命令を発行することを特徴とする通信制御方法。
【請求項２】
イニシエータとターゲットとの間でデータを通信する通信システムであって、
ターゲットは、送信しようとするデータのサイズが所定サイズを越えるか判定し、越える場合には、イニシエータの記憶領域に対する書き込みの命令を発行するようイニシエータに対して要求し、越えない場合には、当該データを前記イニシエータに対して送信し、
イニシエータは、前記ターゲットから前記書き込みの命令を発行する要求を受信した場合には前記書き込みの命令を発行することを特徴とする通信システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、例えばホストコンピュータとプリンタ等、機器同士を接続する通信制御方法及び通信システムに関する。
【背景技術】
【０００２】
近年、ＩＥＥＥ１３９４インターフェースが、コンピュータと周辺機器、あるいは周辺機器同士の接続に用いられつつある。ＩＥＥＥ１３９４インターフェースは、セントロニクスインターフェースなどのハンドシェイク方式に比べて高速で、しかも双方向通信が可能である。また、メモリバスモデルのインターフェースであり、ＩＥＥＥ１３９４インターフェースで接続された機器は、相手の機器に対して指定したアドレスのデータを読み書きすることができる。
【０００３】
このＩＥＥＥ１３９４は、広範囲に応用するための物理層及びリンク層のプロトコルを定めたもので、機器ごとの詳細なプロトコルは定められていない。そのため、物理・リンク層としてＩＥＥＥ１３９４を利用したＳＢＰ(Serial Bus Protocol)−２などのトランスポート層のプロトコルが提案されている。トランスポート層はアプリケーションに対してデータ転送機能を提供する層であり、この層を利用するアプリケーションは、互いにデータの交換が可能となる。
【０００４】
このＳＢＰ−２なるプロトコルは、ＩＥＥＥ１３９４のメモリバスモデルとしての特徴を活かしたプロトコルであり、データの受信側が自身の都合に応じてデータを受信することができる。
【０００５】
ＳＢＰ−２では、データを転送する場合に、まず送信側でログインという操作を行って通信相手との間のチャネルを確立する。この際、ログインされた側がイニシエータ、相手側がターゲットと呼ばれる。データ転送は、イニシエータからの指示に応じて、ターゲットからイニシエータにデータを読み書きすることで行われる。この方式においては、イニシエータは、ログイン後、送信するデータを格納したアドレスやサイズ等が書かれたＯＲＢ(Operation Request Block)を作成し、そのＯＲＢのアドレスをターゲットに知らせる。ターゲットでは自分の都合に合わせてＯＲＢに書かれたアドレスやサイズに基づいてイニシエータからデータを読み出して処理し、あるいはデータを書き込み、それらの処理後ステータスブロックを作成して、処理の状態をイニシエータに知らせることになる。
【発明の開示】
【発明が解決しようとする課題】
【０００６】
このＩＥＥＥ１３９４の上に構築されるＳＢＰ−２プロトコルを利用して通信を行う場合、特に、ホストコンピュータ等のデータ源をイニシエータとし、それからターゲットであるプリンタ装置などの周辺機器へのデータ転送に応用する場合、次のような問題点があった。
【０００７】
(1)全２重通信のために手順が複雑である。
ＳＢＰ−２では、基本的にデータの転送はイニシエータによって管理され、ターゲットはイニシエータへの非同期のデータ転送を行うことができない。すなわち、ＳＢＰ−２では、ターゲットがイニシエータへのデータ転送を行いたい時には、イニシエータに対してアンソリサイテドステータスでデータリード要求を送り、イニシエータはそれに応じてＯＲＢ生成し、ペンディング中のＯＲＢ（イニシエータからターゲットへのデータ転送要求などが含まれている）のリストの末尾にその生成したＯＲＢをつける。このＯＲＢは先頭から順番に処理されるため、ターゲットがイニシエータにリード要求を発行したタイミングではなく、イニシエータ側のＯＲＢの処理が進み、ターゲットからのデータリード要求によるＯＲＢが処理されたときに初めてターゲットからイニシエータにデータが転送されることになる。すなわち、双方向の非同期なデータ転送が行えず、ターゲットからイニシエータに転送すべきデータが非同期に発生する場合、例えばターゲットがプリンタであれば、そのプリンタでエラーが発生する場合など、直ちにイニシエータに伝達すべきデータを即時に伝達できない。
【０００８】
このため、例えばプリンタで非同期に発生するデータを即時的にホストに転送するためには、プリンタをイニシエータとしてログイン手続きを行い、ホストコンピュータをターゲットとするデータ転送を行わねばならない。
【０００９】
このようにホストコンピュータとプリンタで互いにログインしてそれぞれがイニシエータでありターゲットであるような状況では、ホストコンピュータ及びプリンタの双方にイニシエータとしてのプロセスとターゲットとしてのプロセスを備えなければならない。また、ログインの操作もプリンタから行わねばならない。
【００１０】
プリンタのような画像を扱う周辺装置では、画像処理のために大量のメモリ資源やプロセッサ資源を消費する。そのために、装置の構成を簡略化して原価を節減したり、処理を迅速に行うため画像処理用途以外に用いられる資源をできるだけ節約しなければならないが、上述のように多くのプロセスを稼働することになればその分多くの資源を消費することになり、原価低減・処理の効率化という目的に反することになる。
【００１１】
また、ホストコンピュータとプリンタとの関係であれば、各方向に流れるデータは、印刷データとそれに対する処理状況といったように、互いに関連付けられるものであるが、各方向について独立したログインによりチャネルを設定すると、それらデータとレスポンスとを関連づけなければならず、そのための処理手順を新たに追加する必要がある。
【００１２】
このようにＩＥＥＥ１３９４及びＳＢＰ−２をそのままホストコンピュータ−プリンタ装置間の通信に適用することは適切でなく、各装置における必要な資源を減らすことや効率を向上させることが難しかった。
【００１３】
(2)マルチチャネルを実現できない。
最近、周辺装置として種々の機能を複合させた複合機が利用されつつある。例えば、ファクシミリ装置を、スキャナ単体，プリンタ単体，ファクシミリとしてホストコンピュータ等から利用できるデジタル複合機などがある。このような装置を利用する際には、各単体機能ごとに独立した複数のチャネルを介して通信を行えば、同時に複数の機能を利用することができる。
【００１４】
しかしながら、ＳＢＰ−２では、マルチチャネルを提供できないため、そのように単体機能を同時に利用することが難しい。
【００１５】
(3)ＳＢＰ−２以外のプロトコルを採用すれば非同期に発生するデータの転送が可能となるものも、マルチチャネルが実現できるものもあるが、そのようなプロトコルではＩＥＥＥ１３９４のメモリバスモデルとしての特徴を活かすことができない。すなわち、ホストとプリンタの通信であれば、プリンタ側の都合に応じてデータ転送を行うことができず、ホストがプリンタの状態を監視しながらデータ転送を行わねばならないことになる。
【００１６】
本発明は上記従来例に鑑みてなされたもので、１回のログインで全２重通信（互いに非同期な双方向通信）を可能とし、また、データの交換に必要なプロセスやメモリといった資源を効率的に利用できる通信制御方法及び通信システムを提供することを目的とする。
【課題を解決するための手段】
【００１７】
上記目的を達成するために本発明は次のような構成から成る。すなわち、イニシエータとターゲットとの間でデータを通信する通信制御方法であって、
ターゲットは、送信しようとするデータのサイズが所定サイズを越えるか判定し、越える場合には、イニシエータの記憶領域に対する書き込みの命令を発行するようイニシエータに対して要求し、越えない場合には、当該データをイニシエータに対して送信し、
イニシエータは、前記ターゲットから前記書き込みの命令を発行する要求を受信した場合には前記書き込みの命令を発行することを特徴とする。
【００１８】
また他の側面によれば、本発明は、イニシエータとターゲットとの間でデータを通信する通信システムであって、
ターゲットは、送信しようとするデータのサイズが所定サイズを越えるか判定し、越える場合には、イニシエータの記憶領域に対する書き込みの命令を発行するようイニシエータに対して要求し、越えない場合には、当該データをイニシエータに対して送信し、
イニシエータは、前記ターゲットから前記書き込みの命令を発行する要求を受信した場合には前記書き込みの命令を発行することを特徴とする。
【発明の効果】
【００１９】
本発明によれば、ターゲットがイニシエータに送信しようとするデータサイズが、所定サイズを超えている場合には、イニシエータに対して書き込みの命令の発行を要求するので、そのようなサイズのデータをイニシエータからの書き込みの命令に従って送信することが可能となる。
【発明を実施するための最良の形態】
【００２０】
［第１の実施の形態］
本発明の第１の実施の形態として、ホストコンピュータとプリンタとを、ＩＥＥＥ１３９４で接続し、その上に構築されたＳＢＰ−２プロトコルを用いた、本発明に係るプロトコル（以下ＨＰＴと呼ぶ）に従ってデータ転送を行うプリンタシステムを説明する。図４０は、そのプリンタシステムにおけるハードウエア構成図である。
【００２１】
＜システムのハードウエア構成＞
図４０において、ホストコンピュータ２００は、ＲＯＭ３のプログラム用ＲＯＭに記憶された文書処理プログラム等に基づいて、図形，イメージ，文字，表（表計算等を含む）等が混在した文書処理を実行するＣＰＵ１を備える。ＣＰＵ１はシステムデバイス４に接続される各デバイスをＣＰＵ１が総括的に制御する。また、ＲＯＭ３のプログラム用ＲＯＭには、ＣＰＵ１の制御プログラム等が記憶され、ＲＯＭ３のフォント用ＲＯＭには上記文書処理の際に使用するフォントデータ等が記憶され、ＲＯＭ３のデータ用ＲＯＭは上記文書処理等を行う際に使用する各種データが記憶される。ＲＡＭ２は、ＣＰＵ１の主メモリ，ワークエリア等として機能する。プログラムはＲＡＭ２に格納されても良い。また、ＲＡＭ２には、送信データバッファやＯＲＢを格納するシステムメモリが確保される。
【００２２】
キーボードコントローラ（ＫＢＣ）５は、キーボード９や不図示のポインティングデバイスからのキー入力を制御する。ＣＲＴコントローラ（ＣＲＴＣ）６は、ＣＲＴディスプレイ（ＣＲＴ）１０の表示を制御する。メモリコントローラ（ＭＣ）７は、プートプログラム，種々のアプリケーション，フォントデータ，ユーザファイル，編集ファイル等を記憶するハードディスク（ＨＤ）、フレキシブルディスク（ＦＤ）等の外部メモリ１１とのアクセスを制御する。１３９４インターフェース８は、ＩＥＥＥ１３９４規格に従ってプリンタ１００に接続されて、プリンタ１００との通信制御処理を実行する。なお、ＣＰＵ１は、例えばＲＡＭ２上に設定された表示情報ＲＡＭへのアウトラインフォントの展開（ラスタライズ）処理を実行し、ＣＲＴ１０上でのＷＹＳＩＷＹＧを可能としている。また、ＣＰＵ１は、ＣＲＴ１０上の不図示のマウスカーソル等で指示されたコマンドに基づいて登録された種々のウィンドウを開き、種々のデータ処理を実行する。
【００２３】
プリンタ１００において、プリンタＣＰＵ１２は、ＲＯＭ１３のプログラム用ＲＯＭに記憶された制御プログラム等或いは外部メモリ１４に記憶された制御プログラム等に基づいてシステムバス１５に接続される各種のデバイスとのアクセスを総括的に制御し、印刷部インタフェース１６を介して接続される印刷部（プリンタエンジン）１７に出力情報としての画像信号を出力する。また、このＲＯＭ１３のプログラムＲＯＭには、後述する各種エージェントた画像処理を実現するＣＰＵ１２の制御プログラム等が記憶される。ＲＯＭ１３のフォント用ＲＯＭには上記出力情報を生成する際に使用するフォントデータ等が記憶され、ＲＯＭ１３のデータ用ＲＯＭには、ハードディスク等の外部メモリ１４が無いプリンタの場合には、ホストコンピュータ上で利用される情報等が記憶されている。ＣＰＵ１２は１３９４インターフェース１８を介してホストコンピュータとの通信処理が可能となっており、プリンタ内の情報等をホストコンピュータ２００に通知可能に構成されている。
【００２４】
ＲＡＭ１９は、ＣＰＵ１２の主メモリ、ワークエリア等として機能するＲＡＭで、図示しない増設ポートに接続されるオプションＲＡＭによりメモリ容量を拡張することができるように構成されている。なお、ＲＡＭ１９は、出力情報展開領域、環境データ格納領域、ＮＶＲＡＭ等に用いられる。
【００２５】
前述したハードディスク（ＨＤ）、ＩＣカード等の外部メモリ１４は、メモリコントローラ（ＭＣ）２０によりアクセスを制御される。外部メモリ１４は、オプションとして接続され、フォントデータ、エミュレーションプログラム、フォームデータ等を記憶する。また、操作パネル１８には、操作のためのスイッチおよびＬＥＤ表示器等が配されている。また、前述した外部メモリは１個に限らず、少なくとも１個以上備え、内蔵フォントに加えてオプションフォントカード，言語系の異なるプリンタ制御言語を解釈するプログラムを格納した外部メモリを複数接続できるように構成されていても良い。さらに、図示しないＮＶＲＡＭを有し、操作パネル１０１２からのプリンタモード設定情報を記憶するようにしても良い。
【００２６】
＜イニシエータの構成＞
上述したハードウエア構成において、プリンタ１００をターゲットとし、ホストコンピュータ２００をイニシエータとした通信システムを、図１及び図２に示す。本実施形態に置いては、これら構成は、それぞれホストコンピュータ及びプリンタにおけるＣＰＵによりプログラムを実行することで実現される。まず、図２のイニシエータから説明する。
【００２７】
図２において、イニシエータであるホストコンピュータにおいては、アプリケーションであるプリンタドライバ２０９はＨＰＴ処理部２０３を介してプリンタに対するデータ転送要求を発行するとともに、プリンタからの応答を受ける。
【００２８】
ＨＰＴ処理部２０３はＯＲＢ管理部２０６を含んでおり、システムメモリ２０８に生成されるＯＲＢを管理している。ＯＲＢはホストコンピュータからプリンタへ、あるいはプリンタからホストコンピュータへ転送されるデータバッファのアドレスやサイズ等を格納したブロックであり、先頭のＯＲＢから順次リンクされている。このＯＲＢについては、次のような処理の原則がある。
【００２９】
(1)リンクの先頭のＯＲＢから順次処理される。完了通知（ステータスブロック）を受信するとリンクからはずされる。
(2)新たに生成されたＯＲＢはリンクの末尾につながれる。
(3)リンクされるＯＲＢの数の上限は後述するプリンタにおける２つのキューの容量の合計と同一である。
【００３０】
この(3)項を実現するために、ＯＲＢ管理部２０６は、プリンタの２つのキューそれぞれについて２つのカウンタを用意している。ひとつはCurrentQuedQUEというカウンタであり、後述するプリンタのプリフェッチキューの現在の空き数を示している。また、もうひとつはCurrentImmediateQUEというカウンタである。こちらのカウンタが対応するキューの容量は本実施形態では１であり、処理されているエントリのみがキューに入っているということができる。これらカウンタは、ＯＲＢの生成と削除に合わせて増減される。
【００３１】
また、ＯＲＢを生成した際には、プリンタ側のドアベルレジスタと呼ばれるレジスタに書き込むことにより、ＯＲＢが発生したことをプリンタに知らせる。この手続きはＳＢＰ−２で規定されているもので、その規格書等に記載されている。
【００３２】
また、ＨＰＴ処理部２０３は、ステータスキュー２０４及びキュー処理部２０５を含む。１３９４インターフェース２０１を介して受信されたステータスは、ステータス識別部２０２により識別され、ステータスの種類に応じて直接ＯＲＢ管理部２０６に送り付けられるか、あるいはステータスキュー２０４に入れられ、先入先出順にキュー処理部２０５で処理される。
【００３３】
ステータスの種類には２種類ある。
(1)ノーマルステータス…ホストコンピュータ−プリンタ間のデータ転送の結果を通知するステータスブロックであり、直接ＯＲＢ管理部に送られる。
(2)アンソリサイテド(Unsolicited)ステータス…プリンタからホストコンピュータに対して転送すべき非同期データが発生したことを示すステータスブロックであり、ステータスキューに入れられる。これは通常プリンタから自発的に発行される。これらの区別はステータスブロックに書き込まれた値によってなされる。
【００３４】
また、ステータスレジスタ２１０はプリンタから書き込まれるレジスタであり、ホストコンピュータが読むべきデータがプリンタがあることを示す。イニシエータたるホストコンピュータは以上のような機能的な構成からなっている。
【００３５】
＜ターゲットの構成＞
図１は、ターゲットたるプリンタの機能上の構成を示すブロック図である。図１において、ドアベルレジスタ１０８はホストコンピュータによって書き込まれるレジスタであり、ＯＲＢが新たに生成されたことを示す。コマンドフェッチエージェント１０３は、１３９４インターフェース１０１を介してＯＲＢを読み込み、その種類に応じてプリフェッチキュー１０４に入れるか、あるいは即時実行エージェント１０６に送りつける。このコマンドの種類は、即時実行か順次実行かを示すフィールドを基準にして判定される。しかし、実質的にはこのフィールドはコマンドの機能に対応しており、本実施形態ではターゲットからイニシエータへのデータ転送のためのコマンド（リード要求コマンド）や、ターゲットの状態を捕捉するためのコマンドは即時実行であり、イニシエータからターゲットへの印刷データの転送などは順次実行とされている。
【００３６】
順次実行エージェント１０５及び即時実行エージェント１０６は、ともにコマンドフェッチエージェント１０３によって読み込まれたＯＲＢを、その内容に応じて、ホストコンピュータのバッファからのデータの読み出しや、データ処理部７から与えられたデータの書込みなどを行う。その後、ホストコンピュータにノーマルステータスを返す。
【００３７】
さらに、即時実行エージェント１０６は、ＰＤＬを解釈実行してラスタデータを生成するラスタライズやデバイス管理を行うデータ処理部１０７からのデータ転送要求に応じて、アンソリサイテドステータスをホストコンピュータに送る。バスインターフェース１０２は、プリンタ１００からホストコンピュータ２００のシステムメモリ２０８の所望のメモリロケーションにアクセスするためのインターフェースである。
【００３８】
なお、本例のシステムでは、順次実行エージェントはホストコンピュータからプリンタへのデータ転送のＯＲＢのために用いられ、即時実行エージェントはプリンタからホストコンピュータへのデータ転送のＯＲＢのために用いられる。
【００３９】
以上、イニシエータ及びタ−ゲットの構成と動作を簡単に説明した。これらを更に詳しく説明する前に、まずＯＲＢの詳しい内容を説明する。
【００４０】
＜コマンドＯＲＢ(Operation Request Block)の内容＞
図３はＯＲＢ一般の構成を示す図である。図３（Ａ）において、"Next_ORB"（リンク）フィールド３０１は、次のＯＲＢへのリンクである。次のＯＲＢがない場合にはそれを表す所定の値が入れられる。なお、先頭のＯＲＢは、所定のアドレスレジスタにより示される。"data_descripter"（データアドレス）フィールド３０２は、データバッファのアドレスを示す。"d"（方向）フィールド３０３は、ホストコンピュータからプリンタへのデータ転送（０：ライト）か、プリンタからホストコンピュータへのデータ転送（１：リード）かを示す。"data_size"（データサイズ）フィールド３０４は、アドレスフィールド３０２で指し示されるデータバッファのサイズを示す。以上、図の点線よりも上のフィールドがＳＢＰ−２で規定されているフィールドであり、これから説明するフィールド３０５〜３０８が、ＨＰＴに固有の処理に用いられるフィールドである。
【００４１】
"i"フィールド（即時ビット）３０５は、ターゲットにおいて、即時実行エージェントか、順次実行エージェントかどちらで実行されるＯＲＢであるかを示している。値が０すなわち順次実行エージェントであればプリフェッチキューに入れられ、値が１であれば即時実行エージェントにより処理される。"function"（ファンクション）フィールド３０６は、図３（Ｂ）に示すようにＯＲＢの意味を示している。これについては、更に詳しく説明する。"command_block_length"（コマンド長）フィールド３０７は、"control_block"（コントロールブロック）フィールド３０８の長さを表している。コントロールブロックフィールド３０８には、ファンクションフィールド３０６の値に応じて様々な値が入れられる。
【００４２】
次に、機能ごとにＯＲＢの内容を説明する。
【００４３】
（キューデプスコマンド）
図４はファンクション＝０のキューデプスコマンドＯＲＢを示している。このコマンドは、ターゲットのプリフェッチキュー１０４の深さを得るためのコマンドである。即時ビットは１にセットされる。
【００４４】
このコマンドのコントロールブロックには、"source_ID"（ソースＩＤ）４０１と"status_queue_length"（ステータスキュー長）４０２の２つのフィールドが含まれている。ソースＩＤは、イニシエータにログインしたプロセスの識別子が入れられる。図２の例では、ログインしたプロセスはプリンタドライバとなる。これは、複数のプロセスがログインしている場合に、ターゲットが応答すべきプロセスを識別するために付加されている。また、ステータスキュー長４０２は、イニシエータの有するステータスキュー２０４の深さをターゲットに知らせるためのフィールドである。
【００４５】
ステータスキュー長は、ターゲットにおいてステータスキューにどれだけアンソリサイテドステータスがキューイングされているかを管理するために用いられる。ターゲットは、イニシエータがプリフェッチキューを管理するのと同様に、アンソリサイテドステータスの生成および処理済みの通知に従ってステータスキューの深さを管理している。
【００４６】
このコマンドを受けたターゲットは、ステータスキュー長をカウンタCurrentUnsolicitedQUEに格納するとともに、プリフェッチキュー長をイニシエータに返す。イニシエータでは、このコマンドによって得たプリフェッチキューのキューの深さを元にして、ＯＲＢの生成および消去という動作に応じて、ターゲットにキューされているＯＲＢの数を管理する。
【００４７】
（データ転送コマンド）
図５はファンクション＝１のデータ転送コマンドＯＲＢを示している。このコマンドは、イニシエータからターゲットにデータを転送するためのコマンドである。"page_table_present"ビット５０１は、ページテーブルの存在を示しており、ページテーブルがある場合には、"page_size"フィールド５０２にページテーブルにより参照されるページサイズをセットする。転送するデータバッファは、このページテーブルとアドレス５０３およびデータサイズ５０４によって示される。
【００４８】
このコマンドを受けたターゲットは方向フィールドの値に応じて、指定されたデータバッファへのデータのかき込みあるいはバッファからデータの読み出しを行う。
【００４９】
（リード要求コマンド）
図６はファンクション＝２のリード要求コマンドＯＲＢを示している。このコマンドは、ターゲットから「リード要求ステータス」、すなわちターゲットのプリンタからホストへのデータ転送要求が送られてきた場合に、プリンタにデータを書き込むべきデータバッファを提供するコマンドである。"sequence_number"（シーケンス番号）フィールド６０１は、このコマンドを発行するきっかけとなった対応するリード要求ステータスに付されているシーケンス番号と同一の値であり、リード要求ステータスとリード要求コマンドとを対応づけるための番号である。その他のフィールドの構成はデータ転送コマンドと同様である。ただし、即時ビットは１、方向ビットも１（リード）に設定される。即時ビットが１に設定されているのは、ターゲットから発行されるリード要求ステータスに対して直ちに対応するためである。また、バッファのサイズは、リード要求ステータスによって指定されている値を使用する。
【００５０】
このコマンドを受けたターゲットは、イニシエータのシステムメモリに確保された、指定されたデータバッファへとデータを書き込む。
【００５１】
（ダイレクトステータス応答コマンド）
図７はファンクション＝３のダイレクトステータス応答コマンドＯＲＢを示している。このコマンドは、ターゲットによりリード要求を破棄させる場合に、リード要求ステータスに対応して発行される。あるいは、ターゲットからのダイレクトステータスに対応したターゲットへの応答に用いられる。"sequence_number"（シーケンス番号）フィールド７０１は、このコマンドを発行するきっかけとなった対応するリード要求ステータスあるいはダイレクトステータスに付されているシーケンス番号と同一の値である。その他のフィールドの構成はデータ転送コマンドと同様である。ただし、即時ビットは１に設定される。
【００５２】
このコマンドを受けたターゲットは、対応するシーケンス番号を有するリード要求ステータスを発行していれば、それにかかるリード要求を破棄する。
【００５３】
（デバイス資源獲得コマンド）
図８はファンクション＝８のデバイス資源獲得コマンドＯＲＢを示している。"resource_ID"（リソースＩＤ）フィールド８０１は、図８（Ｂ）に示されている。値０は、使用するデバイスクラスおよび論理ユニット特性に依存した値であり、このシステムでは、０はデバイスクラスとしてプリンタ、論理ユニット特性として印刷サービスを示している。
【００５４】
このコマンドを受けたターゲットは、リソースＩＤで指定された資源を、このコマンドの送り手であるイニシエータに対して割り当てる。
【００５５】
（デバイス資源解放コマンド）
図９はファンクション＝９のデバイス資源解放コマンドＯＲＢを示している。"resource_ID"（リソースＩＤ）フィールド８０１は、図８（Ｂ）に示されている通りである。
【００５６】
このコマンドを受けたターゲットは、リソースＩＤで指定された資源を解放する。
【００５７】
（基本デバイスステータスコマンド）
図１０はファンクション＝Ａ(Hex)の基本デバイスステータスコマンドＯＲＢを示している。
【００５８】
このコマンドを受けたターゲットは、ターゲット自身の有する状態を基本デバイスステータスブロックにのせてイニシエータに応答する。イニシエータはこのコマンドを発行することで、ターゲットの状態を把握できる。プリンタにおいては、例えば用紙サイズやサポートするエミュレーション、その他のプリンタに関る様々な状態情報が基本ステータスとしてターゲットから返される。
【００５９】
＜ステータスブロックの内容＞
図１１は、ターゲットであるプリンタからイニシエータであるホストコンピュータに返されるステータスブロックを示している。ステータスブロックは、前述したコマンドＯＲＢに対応して用意されている。ステータスブロックは、ターゲットの順次実行エージェントおよび即時実行エージェントから発行される。
【００６０】
図１１（Ａ）において、右側の点線より上の部分はＳＢＰ−２により規定されたフィールドであり、ステータスに対応するコマンドＯＲＢを示すためなどのフィールドを含む。"i"（即時ビット）１１０１は、ステータスが順次実行エージェントと即時実行エージェントのいずれから発行されたかを示す。値が０であれば順次実行エージェントから、１であれば即時実行エージェントから発行されたことを示す。"hpt_status"（ｈｐｔステータス）フォールド１１０２は、図１１（Ｂ）に示したように、ステータスブロックの種類を示している。"hpt_status_dependent"フィールド１１０３は、ｈｐｔステータスに依存してその値が与えられる。"status_length"（ステータス長）フィールド１０４は、レスポンスブロック１１０５の長さを示している。次に、種類毎にステータスブロックを説明する。
【００６１】
（キューデプスステータスブロック）
図１２は、ｈｐｔステータス＝０のキューデプスステータスを示している。キューデプスステータスは、キューデプスコマンドに対するターゲットからの応答であり、ターゲットは"prefetch_queue_depth"フィールド１２０１にプリフェッチキュー１０４の深さをセットしてイニシエータに返す。これによりイニシエータはプリフェッチキューの容量を知ることができ、その容量にあわせて生成するＯＲＢの数を管理する。
【００６２】
（データ転送ステータスブロック）
図１３は、ｈｐｔステータス＝１のデータ転送ステータスを示している。データ転送ステータスは、データ転送コマンドに対するターゲットからの応答であり、データ転送コマンドＯＲＢの処理が終了した時点でターゲットから発行される。イニシエータはこのステータスを受けることで、ターゲットのキューから１つのＯＲＢが処理されて排出されたことを知ることができる。
【００６３】
（リード要求ステータスブロック）
このステータスはｈｐｔステータス＝２であり、そのフォーマットは特に図示しないが、レスポンスブロック内に、イニシエータに確保させるデータバッファのサイズを有している。このステータスは、コマンドＯＲＢに対して発行されるのではなく、通常ターゲットから自発的に発行される。イニシエータはこのリード要求ステータスに対して、前述したリード要求コマンドＯＲＢを発行する。この手順については後述する。
【００６４】
（ダイレクトステータスブロック）
このステータスはｈｐｔステータス＝３であり、そのフォーマットは特に図示しないが、レスポンスブロック内に、アプリケーションレベル（すなわちターゲットにおけるデータ処理部）のステータスを含んでいる。すなわち、通常はアプリケーションレベルのデータの交換はＯＲＢとそれにリンクしたデータバッファとを用いて行われる。しかし、データが非常に小さく、レスポンスブロックの上限（本例では２４バイト）内に治まる場合には、ＨＴＰレベルの応答にアプリケーションレベルの応答を重畳してしまう。イニシエータではこのステータスに対応してダイレクトステータス応答コマンドＯＲＢを発行する。
【００６５】
（デバイス資源獲得ステータスブロック）
このステータスはｈｐｔステータス＝８であり、そのフォーマットは特に図示しないが、デバイス資源獲得コマンドを受けてそれを処理したターゲットから発行される。
【００６６】
（デバイス資源解放ステータスブロック）
このステータスはｈｐｔステータス＝９であり、そのフォーマットは特に図示しないが、デバイス資源解放コマンドを受けてそれを処理したターゲットから発行される。
【００６７】
（基本デバイスステータスブロック）
このステータスはｈｐｔステータス＝Ａ(Hex)であり、そのフォーマットは特に図示しないが、基本デバイスステータスコマンドを受けた場合に、ターゲットから発行される。このステータスには、所定のデバイスステータスがセットされる。
【００６８】
以上、本実施形態の印刷システムにおいて用いられるコマンドおよびステータスについて説明した。次に、イニシエータおよびターゲットにおけるデータ交換の手順を説明する。
【００６９】
＜イニシエータからのデータ転送要求処理＞
図１４はホストコンピュータにおける、ホストコンピュータからプリンタあるいはプリンタからホストコンピュータへのデータ転送要求に応じて、プリンタにコマンドＯＲＢの生成を通知する手順を示している。
【００７０】
プリンタドライバ等のアプリケーションからデータの転送要求はステップＳ１４０１で監視されている。データ転送要求には、プリンタドライバ等のアプリケーションが転送すべきデータがあることを知らせてくる場合と、プリンタからのデータリード要求に応じて知らされる場合とがある。なおプリンタが主体的にホストコンピュータに送るステータスを、アンソリサイテドステータスと呼ぶ。一方、ホストコンピュータからのコマンドＯＲＢの処理完了通知として返すステータスをノーマルステータスと呼ぶ。
【００７１】
データ転送要求があると、ステップＳ１４０２で、それを順次実行とするか、即時実行とするか決定し、ＯＲＢの即時ビットにセットする。プリンタからのアンソリサイテドステータスによってＯＲＢを発行する場合は即時実行、ホストコンピュータのアプリケーションからのデータ転送要求による場合には順次実行としている。
【００７２】
順次実行の場合、ステップＳ１４０３においてカウンタCurrentQuedQUEが０でないか判定する。このカウンタCurrentQuedQUEの初期値としては、電源立ち上げ時やリセット時等、プリンタのプリフェッチキューの深さがキューデプスコマンドにより読取られて、それがセットされる。すなわち、カウンタCurrentQuedQUEにより、現在のプリフェッチキューの空きがカウントされる。ステップＳ１４０４において空きが０であれば、ターゲットのプリフェッチキューは空いていないので、空くまでまつ。空きがあればステップＳ１４０４でカウンタCurrentQuedQUEを１減らし、ステップＳ１４０７でデータ転送ＯＲＢを生成してリストにリンクする。このとき、アプリケーションによって作成されているデータバッファがＯＲＢにリンクされる。その後、ステップＳ１４０８で、プリンタのドアベルレジスタ１０８に書き込み、ＯＢＲが発生したことをターゲットに知らせる。
【００７３】
一方、ステップＳ１４０２で即時実行であると判定された場合、ステップＳ１４０６でカウンタCurrentImmediateQUEの値が０より大きいか判定する。なお、ターゲットの即時実行エージェントにはキューは用意されておらず、従ってこのカウンタの値は最大値が１であり、リセット時に１に設定されている。０より大きい場合には、ステップＳ１４０６でそのカウンタを１減らし、ＯＲＢを生成リンクにリストしてドアベルを書き込む。
【００７４】
以上のようにしてドアベルレジスタに書き込まれると、図１５の手順で、フェッチエージェントによってＯＲＢがターゲットに取り込まれる。
【００７５】
＜フェッチエージェントによる処理＞
図１５は、ドアベルレジスタ１０８に書き込みが行われた際のターゲットのフェッチエージェントによる処理手順である。
【００７６】
ドアベルレジスタ１０８に書き込まれると、ステップＳ１６０１においてリードポインタに、システムメモリ内でリンクされている先頭のＯＲＢのアドレスを設定する。
【００７７】
ステップＳ１６０２では、リードポインタで示されるＯＲＢの即時ビットをテストし、即時であるか順次であるか判定する。順次実行である場合には、ステップＳ１６０３でプリフェッチキュー１０４の最後尾のアドレス(NextWritePointer)を獲得する。ホストコンピュータはプリフェッチキューの空きを確認してドアベルをライトするので、キューの空きは保証されている。
【００７８】
次にステップＳ１６０４で、リードポインタで示されるＯＲＢをプリフェッチキューの最後尾にコピーし、ステップＳ１６０５で、順次実行エージェントに対してＯＲＢの受信を通知する。ステップＳ１６０６で、リードポインタで示されるＯＲＢの"Next_ORB"フィールド（次のＯＲＢへのリンクフィールド）がヌルではないか、すなわちリンクしているＯＲＢがあるか判定し、なければ終了するが、あれば、そのリンクされているＯＲＢのアドレスをリードポインタに設定してステップＳ１６０２からくり返す。
【００７９】
一方、ステップＳ１６０２で即時実行されるＯＲＢであると判定されると、ステップＳ１６０８では、そのＯＲＢを即時実行エージェントによって予め示されるアドレスへとコピーする。その後、ステップＳ１６０９で即時実行エージェントにＯＲＢの受信を通知し、ステップＳ１６０６に進む。
【００８０】
以上のようにしてＯＲＢがターゲットの取り込まれて各実行エージェントにＯＲＢの受信が通知され、図１６の手順でＯＲＢの処理が実行される。
【００８１】
＜実行エージェントによる処理＞
実行エージェントは、即時実行エージェントと順次実行エージェントがあるが、ＯＲＢの処理に関しては同じ手順であるので、図１６としてまとめて説明する。
【００８２】
実行エージェントは、フェッチエージェントからＯＲＢ受信の通知があると、ステップＳ１７０１においてNextreadpointerにより指し示されるＯＲＢのデータアドレスフィールド、方向ビット、データサイズフィールドの値を取り出す。なお、Nextreadpointerとは、キューに格納されている、実行エージェントがまさに処理するＯＲＢへのポインタである。順次実行エージェントにおいては、プリフェッチキューの先頭のＯＲＢが指し示される。
【００８３】
ステップＳ１７０２では、取り出したデータサイズが０であるか判定し、サイズが０でなければ、ステップＳ１７０３において方向ビット(Direction bit)がライトであるかリードであるか判定する。ライトである場合には、データアドレスとデータサイズで指定されるデータをイニシエータのシステムメモリから読み出し、データ処理部１０７に渡す。
【００８４】
データ処理部はステップＳ１７０５〜Ｓ１７０７で渡されたデータを処理する。例えば、プリンタではＰＤＬデータの解析やラスタライズなどが行われる。
【００８５】
データ処理部での処理終了が通知されると、ステップＳ１７０８で、当該ＯＲＢの処理が完了した旨通知するデータ転送ステータスブロック（ノーマルステータス）を生成し、ステップＳ１７０９でステータスをイニシエータにの通知するために、ステータスレジスタ２１０にその旨書き込む。
【００８６】
一方、ステップＳ１７０３でＯＲＢの方向ビットがリードであると判定されると、ステップＳ１７１０において、ＯＲＢのデータアドレスフィールドおよびデータサイズフィールドで指定されたデータバッファに、データを書き込む。このターゲットから書き込まれるデータをリバースデータと呼ぶ。書き込むリバースデータは、データ処理部などで作成、バッファに格納されているデータであり、例えば、プリンタの搭載フォントの列挙といった２４バイト以上のデータである。
【００８７】
ステップＳ１７１１では書き込みが済んだデータを格納してあったバッファを解放する。
【００８８】
処理が終了したなら、ステップＳ１７１３で処理完了通知のステータスブロック（ノーマルステータス）を作成し、ステップＳ１７１４でステータスレジスタに所定の値を書き込んでステータスブロックの通知をホストコンピュータに知らせる。
【００８９】
最後に、ステップＳ１７１５において、カウンタCurrentUnsolicitedQUEを１増やして終了する。このカウンタCurrentUnsolicitedQUEは、キューデプスコマンドを受信した際に、その"status_que_depth"フィールドに格納されている値が初期値として設定されている。このカウンタは、ステータスキュー２０４の空きを示すように、アンソリサイテドステータスブロックの送信と、その処理済みの通知に応じて増減される。カウンタCurrentUnsolicitedQUEのカウントは次の条件に従って行われる。
【００９０】
−カウントアップの条件
(1)アンソリサイテドステータスブロックを送信した場合１加算する。イニシエータではアンソリサイテドステータスのみがステータスキュー２０４にキューイングされる。
【００９１】
−カウントダウンの条件
(1)リード要求ＯＲＢの処理完了のステータスブロックを送信した場合に１加算する。イニシエータではこのステータスを受けてステータスキュー２０３から処理済みのステータスブロックをはずす。
(2)データサイズが０のＯＲＢの処理完了のステータスブロックを送信した場合に１加算する。すなわち、ダイレクトステータス応答のＯＲＢに対するステータスブロックを送信した場合に１加算する。イニシエータでは、このステータスを受けてステータスキュー２０３から処理済みのステータスブロック（ダイレクトステータス）をはずす。
【００９２】
また、ステップＳ１７０２でデータサイズが０であると判定されたなら、特に処理すべきデータはないので、何もせずに処理完了通知を送るべくステップＳ１７１３でステータスブロックを応答する。
【００９３】
以上の手順で、イニシエータによるＯＲＢの生成から、ターゲットによるその処理とステータスブロックの生成までの処理が行われる。次に、図１７，１８を参照して、プリンタからホストコンピュータへのアンソリサイテドステータスの送信をきっかけとするデータ転送を説明する。
【００９４】
＜ターゲットにおけるアンソリサイテドステータスの発行処理＞
プリンタに紙切れやジャム等のエラーが発生した場合など、プリンタからホストコンピュータに直ちに通知しなければならない情報がある。この場合にはプリンタが主体となって、データをプリンタに転送する。プリンタから送るべきデータがあると、データ処理部１０７はその旨即時実行エージェントに通知し、それにより図１７の処理が開始される。
【００９５】
ステップＳ１８０１では、ホストコンピュータに送信すべきデータが２４バイト超過であるか判定する。２４バイトとは、ステータスブロックのレスポンスブロックにいれられるデータ量の上限である。
【００９６】
上限値を越えている場合、ステップＳ１８０２でリード要求ステータスブロック（アンソリサイテドステータス）を生成し、ステップＳ１８０３でステータスブロックの"ORB_offset"フィールドにリバースデータが格納されたアドレスを設定する。このとき、リバースデータのサイズもステータスブロックに書き込まれる。
【００９７】
ステップＳ１８０４では、カウンタCurrentUnsolicitedQUEの値が０より大きい以下、すなわちステータスキューに空きがあるか判定する。空きがなければ空くまで待ってから、ステップＳ１８０５で、カウンタCurrentUnsolicitedQUEの値を１減らして、ステップＳ１８０６でステータスレジスタに適当な値を書き込む。
【００９８】
一方、データが２４バイト以下であれば、そのデータはステータスブロックに重畳してホストコンピュータに送れるため、ダイレクトステータス（アンソリサイテドステータス）を作成し、そのコマンドセット依存フィールドにリバースデータを格納する。その後ステップＳ１８０４に分岐する。
【００９９】
以上のようにして、アンソリサイテドステータスがイニシエータに送り付けられる。
【０１００】
ターゲットからステータスを受けたイニシエータは、図１８の手順でそれを処理する。
【０１０１】
＜イニシエータによるステータス処理＞
この処理は、ステータスレジスタに所定の値がセットされて生じる割り込みによって起動される。また、この割り込みとしては、ステータスレジスタに値がセットされるごとの多重割り込みを許している。
【０１０２】
まずステップＳ１５０１において、ステータスがノーマルステータスかアンソリサイテドステータスか判別する。アンソリサイテドステータスであれば、ステップＳ１５０２で、ステータスブロックをターゲットから読み出してステータスキューの末尾にコピーする。ステップＳ１５０３ではそのブロックがキューの先頭になったか判定し、キューの先頭になったなら、ステップＳ１５０４で、リバースデータの格納用のバッファを確保し、ステップＳ１５０５でそのステータスがリード要求ステータスかそれともダイレクトステータスか判定する。
【０１０３】
リード要求ステータスであれば、リード要求コマンドＯＲＢをステップＳ１５０６で作成する。作成されるＯＲＢは、即時フラグが「即時」であり、方向フラグがリードである。また、バッファのアドレスをＯＲＢに搭載する。この後、データ転送の必要事項が生じたことを図１４のプロセスに通知する。図１４のプロセスにより、ステップＳ１５０６で作成されたＯＲＢはターゲットに送られ、そのデータバッファにターゲットからデータが書き込まれてデータ転送が行われることになる。
【０１０４】
ステップＳ１５０５でダイレクトステータスと判定された場合、そのステータス内のリバースデータを確保したバッファにコピーし、ステップＳ１５０９で、アプリケーション等の上位プロセスにそのリバースデータを送る。その後、ダイレクトステータス応答ＯＲＢ（即時ビットは「即時」）をステップＳ１５１０で作成する。この時データサイズは０に指定する。
【０１０５】
一方、ステップＳ１５０１でノーマルステータスと判定されると、そのステータスに対応するＯＲＢの方向ビットがリードかライトかステップＳ１５１１で判定される。ライト、すなわちイニシエータからターゲットへのデータ転送であった場合、対応ＯＲＢをリストから削除し（ステップＳ１５１２）、それが使用していたデータバッファを解放し（ステップＳ１５１３）、プリフェッチキューの空き容量であるカウンタCurrentQuedQUEの値を１増やす。
【０１０６】
方向ビットがリード、すなわちターゲットからイニシエータへのデータ転送であれば、そのステータスはリード要求コマンドＯＲＢに対する応答であるので、ステップＳ１５１５で、プリンタドライバ等の上位プロセスにリード処理の終了を通知して、ステップＳ１５１６で対応ＯＲＢをリストから削除し、カウンタCurrentImmediateQUEを１増やす。すなわち、即時実行エージェントに次のＯＲＢを送ることができる状態にする。
【０１０７】
以上のようにして、ステータスレジスタへの書き込みが行われた場合に、ステータスを処理する。すなわち、アンソリサイテドステータスはキューするが、ノーマルステータスは直ちに処理される。アンソリサイテドステータスをキューイングする理由は、アンソリサイテドステータスはＯＲＢの生成を引き起こすが、生成されリストされるＯＲＢの数はプリフェッチキューの容量を上回らないように制限されているためである。ＯＲＢの数をこのように制限するのは、即時実行されるべきＯＲＢが、ＯＲＢ作成通知後直ちに処理されることを保証するためである。ＯＲＢが無制限に作られてしまうと、ＯＲＢリスト自体が即時実行エージェントに処理されるＯＲＢのキューとなってしまい、即時実行が保証されなくなる。リンクされるＯＲＢの数を、ターゲットのプリフェッチキューに入れられているＯＲＢの数と即時実行エージェントで実行されているＯＲＢの数（１）との合計値に制限することで、リンクリスト上のＯＲＢを、ターゲットにおけるプリフェッチキューに対して透過にすることができる。
【０１０８】
＜メッセージシーケンスの例＞
以上説明した手順でイニシエータとターゲットとの間で交換されるメッセージシーケンスの例を、図１９〜図２１を用いて説明する。
【０１０９】
（ターゲットへのデータ転送シーケンス）
図１９は、イニシエータ（ホストコンピュータ）からターゲット（プリンタ）へのデータ転送時のシーケンス例である。
【０１１０】
なお、図中のＳＢＰ−２とは、ＳＢＰ−２規格で規定されたデータ、すなわち図３のコマンドおよび図１１のステータスにおける、ＳＢＰ−２で規定されたフィールドを処理する処理層である。また、ＨＰＴとは、ＳＢＰ−２で規定されいない、ファンクションごとに定められた処理を行う処理層である。ＨＰＴでは、前述したフローチャートの手順を行う。ＳＢＰ−２は、その手順において、ＯＲＢのリンクやドアベルのライト、ＯＲＢやステータスのＨＰＴへの引き渡し等の機能を果たす。
【０１１１】
まず、イニシエータのアプリケーションでデータ、ＨＰＴでＯＲＢ（ここではデータ転送ＯＲＢ）が作成され、空きキューカウンタ(CurrentQuedQUE)が１減らされて、ＯＲＢのリンク要求がＳＢＰ−２に出される（１９０１）。ＳＢＰ−２ではＯＲＢをリンクしてドアベルレジスタにライト要求を出す（１９０２）。１３９４インタフェースにより、ドアベルレジスタが書き込まれ（１９０３）、それがターゲットのＳＢＰ−２に通知される（１９０４）。
【０１１２】
通知を受けたＳＢＰ−２は、ＯＲＢリード要求を１３９４インタフェースに出して（１９０５）、システムメモリからＯＲＢが読み出される（１９０６）。ＨＰＴは、読み出されたＯＲＢの内容に応じて対応キューに格納する（１９０７）。ここではデータ転送コマンドＯＲＢなので、１３９４インタフェースに対してデータリード要求を出す（１９０８）。これに応じて、指定されたアドレスからデータが読み出され、アプリケーションに渡される（１９０９）。アプリケーションは、この場合画像の展開を行うラスタライザ等であり、展開された画像はプリンタエンジンから印刷出力されることになる。
【０１１３】
これに対してターゲットのＳＢＰ−２に対してステータスブロック送信要求が出され（１９１０）、ステータスブロック（データ転送ステータス）がイニシエータに返される（１９１１）。イニシエータのＨＴＰは、これを受けると対応ＯＲＢをリンクから削除し、空きキューカウンタを１増やす（１９１２）。
【０１１４】
以上のシーケンスによりイニシエータからターゲットにデータが転送される。
（イニシエータへのデータ転送シーケンス）図２０は、リード要求ステータスのシーケンスである。
【０１１５】
ターゲットのアプリケーションでデータが作成されると、アンソリサイテドステータス（リード要求ステータス）が作成され、ステータスキューカウンタ(CurrentUnsolicitedQUE)が１減らされて、アンソリサイテドステータス送信要求が出される（２００１）。これを受けたＳＢＰ−２ではアンソリサイテドステータスブロックをイニシエータに送信する（２００２）。イニシエータのＳＢＰ−２層は、このステータスを受けてＨＰＴ層にアンソリサイテドステータスブロックを送信する（２００３）。ＨＰＴ層は、アンソリサイテドステータスブロックをステータスキューにコピーする。
【０１１６】
ステータスキューの先頭のステータスについては、データバッファおよびリード要求ＯＲＢを作成してＳＢＰ−２層に作成したＯＲＢのリンクを要求する（２００４）。ＳＢＰ−２層は、ドアベルレジスタへの書き込み要求を出し（２００５）、１３９４インタフェースによりライトが行われる（２００６）。ドアベル書き込みの通知は１３９４インタフェースからＳＢＰ−２に通知され（２００７）直ちにＯＲＢのリード要求（２００８）とＯＲＢのリードが行われる（２００９）。読み出されたＯＲＢはターゲットのＨＰＴ層に渡され、ＨＰＴでは指定されたキューにそれを格納した後（２０１０）、その内容を解析してデータリード要求であることを認識し、データライト要求を１３９４インタフェースに対して出す（２０１１）。
【０１１７】
これに応じてリバースデータがイニシエータの用意したデータバッファに書き込まれる（２０１２）。
【０１１８】
この処理が終わると、ステータスブロック作成要求ががターゲットから出され、ステータスキューの空きが１つ増やされる（２０１３）。それに応じてノーマルステータスブロックがイニシエータに返され（２０１４）、それによってＨＰＴにＯＲＢのリンク削除の要求が出されると、対応ＯＲＢが削除され、即時実行エージェント側のキューの空き数（０のはずである）に１加えられ、使用されたデータバッファが解放される（２０１５）。
【０１１９】
以上のシーケンスによりターゲットからイニシエータにデータが転送される。
【０１２０】
（イニシエータへのデータ転送シーケンス）
図２１は、ターゲットからイニシエータへとデータ転送する際のシーケンスである。ただし、図２０のシーケンスと異なり、転送されるデータが小さいためにダイレクトステータスを用いている。
【０１２１】
ターゲットのアプリケーションでデータが作成されると、アンソリサイテドステータス（ダイレクトステータス）が作成され、ステータスキューカウンタ(CurrentUnsolicitedQUE)が１減らされて、アンソリサイテドステータス送信要求が出される（２１０１）。これを受けたＳＢＰ−２ではアンソリサイテドステータスブロックをイニシエータに送信する（２１０２）。イニシエータのＳＢＰ−２層は、このステータスを受けてＨＰＴ層にアンソリサイテドステータスブロックを送信する（２１０３）。ＨＰＴ層は、アンソリサイテドステータスブロックをステータスキューにコピーする。
【０１２２】
ステータスキューの先頭のステータスについては、ステータスに重畳されたアプリケーションレベルのデータを読み出し、データバッファおよびダイレクトステータス応答ＯＲＢを作成してＳＢＰ−２層に作成したＯＲＢのリンクを要求する（２１０４）。ＳＢＰ−２層は、ドアベルレジスタへの書き込み要求を出し（２１０５）、１３９４インタフェースによりライトが行われる（２１０６）。ドアベル書き込みの通知は１３９４インタフェースからＳＢＰ−２に通知され（２１０７）直ちにＯＲＢのリード要求（２１０８）とＯＲＢのリードが行われる（２１０９）。
【０１２３】
読み出されたＯＲＢはターゲットのＨＰＴ層に渡され、ＨＰＴでは指定されたキューにそれを格納した後（２１１０）、その内容を解析する。ダイレクトステータス応答ＯＲＢであることが認識されると、対応するステータスブロック作成要求がターゲットから出され、ステータスキューの空きが１つ増やされる（２１１１）。それに応じてノーマルステータスブロックがイニシエータに返され（２１１２）、それによってＨＰＴにＯＲＢのリンク削除の要求が出されると、対応ＯＲＢが削除され、即時実行エージェント側のキューの空き数に１加えられ、使用されたデータバッファが解放される（２１１３）。
【０１２４】
以上のシーケンスによりターゲットからイニシエータにデータが転送される。このシーケンスでは、図２０のシーケンスに比べてデータライト要求（２０１１）およびリバースデータ書き込み（２０１２）の２つの手順が省かれている。
【０１２５】
＜本システムに特有の機能＞
本システムの構成および動作は上述した通りである。このシステムに特有な機能や構成、利点などをここで整理すると次のようなものがあげられる。
(1)ＯＲＢのキューを順次実行用と即時実行用と２つ設け、それぞれに応じた実行エージェントを設けた。これにより、イニシエータからのデータ転送要求ＯＲＢはキューイングされて順次処理されるが（順次実行）、ターゲットからのリード要求ステータスは、リード要求ＯＲＢ発行後直ちに処理される（即時実行）。即時実行は、ＯＲＢリストにリンクするＯＲＢ数の上限を、ライトのＯＲＢについては順次実行キューの容量に、リードのＯＲＢについては即時実行キューの容量（この場合１）にすることにより保証されている。
【０１２６】
一方、ターゲットからのリード要求ステータスは、イニシエータにおいてキューイングされる。このため、イニシエータからのデータ転送要求はターゲットのプリフェッチキューにより、ターゲットからのデータ転送要求（リード要求）はイニシエータのステータスキューによりそれぞれキューイングされることになり、アプリケーション層にデータ転送をおこなうための全２重通信チャネルを提供できる。すなわち、いずれの方向へのデータ転送についても、キューに入れられた順に要求は処理され、一方へのデータ転送の処理が他方のデータ転送の処理に影響を及ぼさず、互いに干渉しない独立したチャネルを提供できる。言い換えれば、イニシエータからターゲット，ターゲットからイニシエータへと、それぞれにおいて非同期に発生したデータを非同期に転送できる。
(2)イニシエータとターゲットとが互いのキューの空き容量を相互に監視しているため、ＯＲＢあるいはステータスブロックを送信した際に、確実に受信される。
(3)全２重通信チャネルは１回のログインで提供される。すなわち、資源を豊富に有するホストコンピュータをイニシエータとし、資源の乏しいプリンタをターゲットとして相互にデータを交換できる。このため、プリンタの備える資源、特に必要なメモリ容量を抑制することができる。
(4)ＩＥＥＥ１３９４インターフェースを利用しているために、ターゲット側へのデータ転送を、ターゲットがその都合に応じて読み出すことで行うことができ、イニシエータがターゲットの都合によってデータ転送に占有されることを防止できる。
(5)ＳＢＰ−２プロトコルを利用しているため、ターゲットでキューされるのはＯＲＢだけで、実際に転送されるデータそのものは処理待ちの間イニシエータに格納されている。このため、ターゲットのメモリ資源を小容量化できる。
(6)ダイレクトステータスを利用することで、ＨＰＴ層のステータスにアプリケーション層のデータを重畳させてターゲットからイニシエータに送信できる。このため、データ転送シーケンスを短くすることができる。
【０１２７】
なお、本実施例のシステムは、ホストコンピュータとプリンタに限らず様々な装置に適用することができる。また、上述した特徴点は、ホストコンピュータとプリンタとの関係にとどまらず、ホストコンピュータと資源の少ない周辺装置一般、周辺装置同士という接続であっても有用である。
【０１２８】
［第２の実施の形態］
本発明の第２の実施の形態として、同時に複数の論理チャネルを提供するシステムを説明する。この場合、ターゲット側には、プリンタ単体でなく、ファクシミリや画像スキャナといった機器が複合したデジタル複合機を利用することができる。
【０１２９】
＜システムの構成＞
図２３は本実施形態におけるイニシエータのブロック図である。図２と異なる点について説明し、共通する構成の説明は省略する。図２３で特徴的といえるのは、ステータス識別部２１２が、ステータスの種類だけでなく、論理チャネルを識別し、チャネル毎にステータスを振り分ける点と、システムメモリ，ＨＰＴ処理部を有する１チャネル分の構成を、複数（図では２）チャネル分備えている点である。
【０１３０】
なお、ステータス識別部は、ステータスブロックに含まれるチャネルＩＤに従って、チャネルを識別する。これについては後述する。例えば、デジタル複合機を利用する場合には、１つのチャネルはプリンタドライバが、もう一つは画像スキャナドライバが利用する、といったように各チャネル毎に異なるアプリケーションであってもよいし、同一のアプリケーションが複数のチャネルを利用してもよい。
【０１３１】
図２２は、ターゲットのブロック図である。図１と異なる点は、コマンドフェッチエージェント１１３が、コマンドＯＲＢをチャネル毎に振り分ける、という点である。各チャネルは、図１と同様の構成であり、プリフェッチキューと２つの実行エージェントを有している。
【０１３２】
なお、ＯＲＢには、論理チャネルが示されており、コマンドフェッチエージェント１１３はそれを見てチャネルを識別する。
【０１３３】
＜コマンドＯＲＢの形式＞
図２４〜図３２はコマンドＯＲＢのフォーマットの例である。図２４はデータ転送コマンドＯＲＢ，図２５はリード要求コマンドＯＲＢ，図２６はダイレクトステータス応答コマンドＯＲＢの図，図２７はデバイス資源獲得コマンドＯＲＢの図，図２８はデバイス資源解放コマンドＲＯＢの図，図３０は基本デバイスステータスコマンドＯＲＢの図であり、第１の実施の形態におけるそれぞれのコマンドと、チャネルＩＤフィールドを有する点で異なっている。他の構成は同じである。
【０１３４】
図２９はデバイス資源放棄応答コマンドＯＲＢの図で、ターゲットからのデバイス資源放棄要求に対する応答である。アクセプトビット２９０１により、放棄が要求された資源を放棄したか否かが示される。ターゲットは資源が乏しいため、複数のチャネルが利用されたり、複数のアプリケーションプロセスが稼働するなどにより各プロセスの資源が不足することもあり得る。そのような場合、ターゲットから資源放棄要求が出されることになる。
【０１３５】
図３１（Ａ）は、オープンチャネル要求コマンド、図３１（Ｂ）はオープンチャネル要求ステータスの図である。これらにより、所望の論理チャネルが開かれる。
【０１３６】
図３２（Ａ）は、クローズチャネル要求コマンド、図３１（Ｂ）はクローズンチャネル要求ステータスの図である。これらにより、所望の論理チャネルが閉じられる。
【０１３７】
＜ステータスブロックの形式＞
図３３〜図３８はステータスブロックのフォーマットを示す図である。図３３はステータス一般の形式の図、図３４はリード要求ステータスの図、図３５はダイレクトステータスの図、図３６はデバイス資源獲得ステータスの図、図３８は基本デバイスステータスの図である。これらの形式は、チャネルＩＤが含まれていることを除いて第１の実施の形態におけるステータスブロックと同様である。
【０１３８】
また、図３７は、デバイス資源放棄ステータスブロックの図であり、イニシエータに放棄を求める資源のＩＤを資源ＩＤフィールド３７０１に格納している。このステータスはターゲットから発せられる要求のため、アンソリサイテドステータスとしてイニシエータに送信される。
【０１３９】
＜イニシエータおよびターゲットにおけるコマンド／ステータス処理手順＞
図３９は、本実施形態における処理手順である。図３９（Ａ）はイニシエータにおいてステータスレジスタに書き込みが行われて起動される処理手順で、第１実施形態の図１８に相当する。処理が開始されると、初めにステップＳ３９０１でチャネルＩＤが判別される。その後、判別された各チャネルについて、図１８のステップＳ１５０１からと同様の処理がおこなわれる。
【０１４０】
図３９（Ｂ）は、ターゲットにおいてドアベルレジスタに書き込みが行われて起動される処理の手順で、第１の実施の形態における図１５に相当する。処理が開始されると、初めにステップＳ３９１１でチャネルＩＤが判別される。その後判別された各チャネルについて、図１５のステップＳ１６０１からと同様の処理がおこなわれる。
【０１４１】
このほか、データ転送要求から始まる処理（図１４）、ターゲットエージェントによる処理（図１６）、プリンタからホストコンピュータへとデータが発生した場合の処理（図１７）については、第１の実施の形態と同様である。ただし、これらの処理の前に、まずチャネルが開かれなければならない。
【０１４２】
ターゲットからの資源放棄要求は、ターゲットからのダイレクトステータスによるデータ転送と同様のシーケンスで行われる。
【０１４３】
本実施形態では、以上の手順でデータ転送が実行される。複数の論理チャネルが利用できることを除けば、第１の実施形態とほぼ同様のシステムである。
【０１４４】
このシステムにより、複数の論理チャネルそれぞれについて全２重通信を提供することができる。そのため、デジタル複合機等、複数のデバイスを有する機器についても、双方向通信を提供できる。それにより、第１の実施の形態で説明した(1)〜(6)の機能を複数のチャネルについて提供できる。
【０１４５】
［他の実施形態］
なお、本発明は、複数の機器（例えばホストコンピュータ，インタフェイス機器，リーダ，プリンタなど）から構成されるシステムに適用しても、一つの機器からなる装置（例えば、複写機，ファクシミリ装置など）に適用してもよい。
【０１４６】
また、本発明の目的は、前述した実施形態の機能を実現するソフトウェアのプログラムコード（すなわち、図１４〜図１８および図３９の手順のプログラム）を記録した記憶媒体を、システムあるいは装置に供給し、そのシステムあるいは装置のコンピュータ（またはＣＰＵやＭＰＵ）が記憶媒体に格納されたプログラムコードを読出し実行することによっても達成される。
【０１４７】
この場合、記憶媒体から読出されたプログラムコード自体が前述した実施形態の機能を実現することになり、そのプログラムコードを記憶した記憶媒体は本発明を構成することになる。
【０１４８】
プログラムコードを供給するための記憶媒体としては、例えば、フレキシブルディスク，ハードディスク，光ディスク，光磁気ディスク，ＣＤ−ＲＯＭ，ＣＤ−Ｒ，磁気テープ，不揮発性のメモリカード，ＲＯＭなどを用いることができる。
【０１４９】
また、コンピュータが読出したプログラムコードを実行することにより、前述した実施形態の機能が実現されるだけでなく、そのプログラムコードの指示に基づき、コンピュータ上で稼働しているＯＳ（オペレーティングシステム）などが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれる。
【０１５０】
さらに、記憶媒体から読出されたプログラムコードが、コンピュータに挿入された機能拡張ボードやコンピュータに接続された機能拡張ユニットに備わるメモリに書込まれた後、そのプログラムコードの指示に基づき、その機能拡張ボードや機能拡張ユニットに備わるＣＰＵなどが実際の処理の一部または全部を行い、その処理によって前述した実施形態の機能が実現される場合も含まれる。
【図面の簡単な説明】
【０１５１】
【図１】ターゲット（プリンタ）のブロック図である。
【図２】イニシエータ（ホストコンピュータ）のブロック図である。
【図３】ＯＲＢ一般のフォーマットを示す図である。
【図４】キューデプスコマンドＯＲＢのフォーマットを示す図である。
【図５】データ転送コマンドＯＲＢのフォーマットを示す図である。
【図６】リード要求コマンドＯＲＢのフォーマットを示す図である。
【図７】ダイレクトステータス応答コマンドＯＲＢのフォーマットを示す図である。
【図８】デバイス資源獲得コマンドＯＲＢのフォーマットを示す図である。
【図９】デバイス資源開放コマンドＯＲＢのフォーマットを示す図である。
【図１０】基本デバイスステータスコマンドＯＲＢのフォーマットを示す図である。
【図１１】ステータスブロック一般のフォーマットを示す図である。
【図１２】キューデプスステータスブロックのフォーマットを示す図である。
【図１３】データ転送ステータスブロックのフォーマットを示す図である。
【図１４】イニシエータによる、データ転送要求の発生に対する処理手順のフローチャートである。
【図１５】ドアベルレジスタに書き込みが行われた際のターゲットのフェッチエージェントによる処理手順のフローチャートである。
【図１６】フェッチエージェントからＯＲＢ通知を受けた際の実行エージェントによる処理手順のフローチャートである。
【図１７】ターゲットによる、データ転送発生の要求に対する処理手順のフローチャートである。
【図１８】ステータスレジスタに書込みがおこなされた際のイニシエータによる処理手順のフローチャートである。
【図１９】イニシエータ（ホストコンピュータ）からターゲット（プリンタ）へのデータ転送時のシーケンスの図である。
【図２０】ターゲットからイニシエータへとリード要求ステータスを用いてデータ転送する際のシーケンスの図である。
【図２１】ターゲットからイニシエータへとダイレクトステータスを用いてデータ転送する際のシーケンスの図である。
【図２２】マルチチャネルを提供するターゲットのブロック図である。
【図２３】マルチチャネルを提供するイニシエータのブロック図である。
【図２４】マルチチャネル化されたデータ転送コマンドＯＲＢのフォーマットを示す図である。
【図２５】マルチチャネル化されたリード要求コマンドＯＲＢのフォーマットを示す図である。
【図２６】マルチチャネル化されたダイレクトステータス応答コマンドＯＲＢのフォーマットを示す図である。
【図２７】マルチチャネル化されたデバイス資源獲得コマンドＯＲＢのフォーマットを示す図である。
【図２８】マルチチャネル化されたデバイス資源開放コマンドＯＲＢのフォーマットを示す図である。
【図２９】マルチチャネル化されたデバイス資源放棄応答コマンドＯＲＢのフォーマットを示す図である。
【図３０】マルチチャネル化された基本デバイスステータスコマンドＯＲＢのフォーマットを示す図である。
【図３１】オープンチャネル要求／応答のフォーマットを示す図である。
【図３２】クローズチャネル要求／応答のフォーマットを示す図である。
【図３３】マルチチャネル化されたステータスブロック一般のフォーマットを示す図である。
【図３４】マルチチャネル化されたデータ転送ステータスブロックのフォーマットを示す図である。
【図３５】マルチチャネル化されたダイレクトステータスブロックのフォーマットを示す図である。
【図３６】マルチチャネル化されたデバイス資源獲得ステータスブロックのフォーマットを示す図である。
【図３７】マルチチャネル化されたデバイス資源放棄ステータスブロックのフォーマットを示す図である。
【図３８】マルチチャネル化された基本デバイスステータスブロックのフォーマットを示す図である。
【図３９】（Ａ）マルチチャネル化されたイニシエータによる、ステータスレジスタへの書込みがおこなわれた際の処理手順と、（Ｂ）マルチチャネル化されたターゲットによる、ドアベルレジスタへの書込みがおこなわれた際の処理手順のフローチャートである。
【図４０】ＩＥＥＥ１３９４インターフェースを用いたプリンタシステムのハードウエア構成図である。
【符号の説明】
【０１５２】
１ ＣＰＵ
２ ＲＡＭ
３ ＲＯＭ
４ システムバス
１２ ＣＰＵ
１３ ＲＯＭ
１９ ＲＡＭ
１００ プリンタ
１０１ １３９４インターフェース
１０２ バスインターフェース
１０３ コマンドフェッチエージェント
１０４ プリフェッチキュー
１０５ 順次実行エージェント
１０６ 即時実行エージェント
１０７ データ処理部
２００ ホストコンピュータ
２０１ １３９４インターフェース
２０２ ステータス識別部
２０３ ＨＰＴ処理部
２０４ ステータスキュー
２０５ キュー処理部
２０６ ＯＲＢ管理部
２０７ バスインターフェース
２０８ システムメモリ
２０９ アプリケーション
【図１】
2006345547.tif 000003
【図２】
2006345547.tif 000004
【図３】
2006345547.tif 000005
【図４】
2006345547.tif 000006
【図５】
2006345547.tif 000007
【図６】
2006345547.tif 000008
【図７】
2006345547.tif 000009
【図８】
2006345547.tif 000010
【図９】
2006345547.tif 000011
【図１０】
2006345547.tif 000012
【図１１】
2006345547.tif 000013
【図１２】
2006345547.tif 000014
【図１３】
2006345547.tif 000015
【図１４】
2006345547.tif 000016
【図１５】
2006345547.tif 000017
【図１６】
2006345547.tif 000018
【図１７】
2006345547.tif 000019
【図１８】
2006345547.tif 000020
【図１９】
2006345547.tif 000021
【図２０】
2006345547.tif 000022
【図２１】
2006345547.tif 000023
【図２２】
2006345547.tif 000024
【図２３】
2006345547.tif 000025
【図２４】
2006345547.tif 000026
【図２５】
2006345547.tif 000027
【図２６】
2006345547.tif 000028
【図２７】
2006345547.tif 000029
【図２８】
2006345547.tif 000030
【図２９】
2006345547.tif 000031
【図３０】
2006345547.tif 000032
【図３１】
2006345547.tif 000033
【図３２】
2006345547.tif 000034
【図３３】
2006345547.tif 000035
【図３４】
2006345547.tif 000036
【図３５】
2006345547.tif 000037
【図３６】
2006345547.tif 000038
【図３７】
2006345547.tif 000039
【図３８】
2006345547.tif 000040
【図３９】
2006345547.tif 000041
【図４０】
2006345547.tif 000042