(57)【特許請求の範囲】
【請求項１】
バスを介したアプリケーションへの及びからのデータ転送を制御する該アプリケーションとバス間のインタフェースにおいて、
上記アプリケーションからの非同期データ転送動作の要求により、該アプリケーションに、メモリマッピングされたインタフェースを提供し、上記バスを介した非同期データ転送動作を行うのに必要な要求を自動的に生成し、該アプリケーションとバス間の非同期データ転送を制御する非同期データ転送制御手段と、
上記アプリケーションからのアイソクロナスデータ転送動作の要求により、該要求されたアイソクロナスデータ転送を、連続したストリームの流れが途切れないように維持するために用いられるバッファのリンクリストを管理し、該アプリケーションとバス間のアイソクロナスデータ転送を制御するアイソクロナスデータ転送制御手段とを備えるインタフェース。
【請求項２】
上記非同期データ転送制御手段は、送信先の識別子と、アドレスと、データ長とを含むヘッダを有するパケットのデータを、上記バスに送信し又は該バスから受信することを特徴とする請求の範囲第１項記載のインタフェース。
【請求項３】
上記非同期データ転送手段は、上記バスを介した非同期データ転送を行うのに必要な要求を自動的に生成する自動ハードウェアインタフェースを備えることを特徴とする請求の範囲第２項記載のインタフェース。
【請求項４】
上記バスは、ＩＥＥＥ１３９４規格に準拠したバスであることを特徴とする請求の範囲第３項記載のインタフェース。
【請求項５】
上記リンクリスト内の各バッファは、前のバッファを指示するバックワードポインタと次のバッファを指示するフォワードポインタとを含んでいることを特徴とする請求の範囲第１項記載のインタフェース。
【請求項６】
上記リンクリスト内の各バッファは、データ転送動作中の所定の時点で上記アプリケーションを呼び出すコールバックルーチンを有することを特徴とする請求の範囲第５項記載のインタフェース。
【請求項７】
上記リンクリスト内の各バッファは、上記アプリケーションをデータ転送に再同期させる再同期イベントを有することを特徴とする請求の範囲第６項記載のインタフェース。
【請求項８】
上記アプリケーションは、上記リンクリストにバッファを追加することを特徴とする請求の範囲第７項記載のインタフェース。
【請求項９】
上記アプリケーションは、上記リンクリストからバッファを削除することを特徴とする請求の範囲第８項記載のインタフェース。
【請求項１０】
アプリケーションとバス間のデータ転送動作を制御する該アプリケーションとバス間のインタフェースにおいて、
上記アプリケーションと通信し、該アプリケーションから要求を受信し、該アプリケーションにインストラクションを送るアプリケーションプログラミングインタフェースと、
上記アプリケーションによって割り当てられたバッファと上記バス上のノード間の非同期データ転送動作を行うのに必要なトランザクションを自動的に生成する自動トランザクション発生器と、
上記バスに物理的インタフェースを提供し、該バスを介してデータパケットを送信及び受信するバスインタフェースとを備え、
上記アプリケーションプログラミングインタフェースは、上記アプリケーションからのアイソクロナスデータ転送動作の要求により、該要求されたアイソクロナスデータ転送を、連続したストリームの流れが途切れないように維持するために用いられるバッファのリンクリストを管理し、該アイソクロナスデータ転送を制御するアイソクロナスデータ制御手段を備えることを特徴とするインタフェース。
【請求項１１】
上記バッファのリンクリストは、各バッファについて、前のバッファを指示するバックワードポインタと次のバッファを指示するフォワードポインタとを含んでいることを特徴とする請求の範囲第１０項記載のインタフェース。
【請求項１２】
上記各バッファは、データ転送動作中の所定の時点で起動されて上記アプリケーションを呼び出すコールバックルーチンを有することを特徴とする請求の範囲第１１項記載のインタフェース。
【請求項１３】
上記各バッファは、起動されて上記アプリケーションを転送中のデータの所定の位置に再同期させる再同期イベントを有することを特徴とする請求の範囲第１２項記載のインタフェース。
【請求項１４】
上記アプリケーションは、上記リンクリストにバッファを追加することを特徴とする請求の範囲第１３項記載のインタフェース。
【請求項１５】
上記アプリケーションは、上記リンクリストからバッファを削除することを特徴とする請求の範囲第１４項記載のインタフェース。
【請求項１６】
上記自動トランザクション発生器は、ハードウェア論理回路によって実現されていることを特徴とする請求の範囲第１０項記載のインタフェース。
【請求項１７】
上記自動トランザクション発生器は、ソフトウェアによって実現されていることを特徴とする請求の範囲第１０項記載のインタフェース。
【請求項１８】
メモリマッピングされたインタフェースをアプリケーションに提供し、該アプリケーションとバス間の非同期データ転送動作を管理するデータ転送管理方法において、
上記アプリケーションから非同期データ転送動作の要求を受信するステップと、
上記バスを介した非同期データ転送動作を行うのに必要なトランザクションを自動的に生成するように自動トランザクション発生器に命令するステップと、
非同期データ転送動作の完了をアプリケーションに通知するステップとを有するデータ転送管理方法。
【請求項１９】
上記要求は、アプリケーションバッファのアドレスと、上記バスのアドレス空間のスタートアドレスと、転送されるデータの長さと、データ転送の方向とを含むことを特徴とする請求の範囲第１８項記載のデータ転送管理方法。
【請求項２０】
上記スタートアドレスは、６４ビットのアドレスであることを特徴とする請求の範囲第１９項記載のデータ転送管理方法。
【請求項２１】
上記バスは、ＩＥＥＥ１３９４規格に準拠したバスであることを特徴とする請求の範囲第２０項記載のデータ転送管理方法。
【請求項２２】
上記自動トランザクション発生器は、ハードウェア論理回路によって実現されていることを特徴とする請求の範囲第１８項記載のデータ転送管理方法。
【請求項２３】
上記自動トランザクション発生器は、ソフトウェアによって実現されていることを特徴とする請求の範囲第１８項記載のデータ転送管理方法。
【請求項２４】
アプリケーションとバス間のデータ転送動作を管理する該アプリケーションとバス間のインタフェースにおいて、
上記アプリケーションと通信し、該アプリケーションから要求を受信し、該アプリケーションにインストラクションを送る通信手段と、
上記アプリケーションのバッファと上記バス上のノード間の非同期データ転送動作を行うのに必要なトランザクションを自動的に生成する自動トランザクション発生器と、
上記バスを介して転送されるデータパケットを、該バスに送信し、該バスから受信するとともに、監視する手段とを備えるインタフェース。
【請求項２５】
上記アプリケーションが上記通信手段に要求を送ったときに、上記データ転送動作が開始されることを特徴とする請求の範囲第２４項記載のインタフェース。
【請求項２６】
上記要求は、上記アプリケーションのバッファのアドレスと、上記バスのスタートアドレスと、転送されるデータの長さと、転送方向とを含むことを特徴とする請求の範囲第２５項記載のインタフェース。
【請求項２７】
上記バスは、ＩＥＥＥ１３９４規格に準拠したバスであることを特徴とする請求の範囲第２６項記載のインタフェース。
【請求項２８】
上記アプリケーションとバス間のアイソクロナスデータ転送を制御するアイソクロナスデータ転送制御手段を更に備える請求の範囲第２４項記載のインタフェース。
【請求項２９】
上記アイソクロナスデータ転送制御手段は、上記アプリケーションからのアイソクロナスデータ転送動作の要求により、該要求されたアイソクロナスデータ転送を、連続したストリームの流れが途切れないように維持するために用いられるバッファのリンクリストを管理し、該アプリケーションとバス間のアイソクロナスデータ転送を制御することを特徴とする請求の範囲第２８項記載のインタフェース。
【請求項３０】
上記リンクリストは、前のバッファを指示するバックワードポインタと次のバッファを指示するフォワードポインタとを含んでいることを特徴とする請求の範囲第２９項記載のインタフェース。
【請求項３１】
上記リンクリスト内の各バッファは、データ転送動作中の所定の時点で起動されて上記アプリケーションを呼び出すコールバックルーチンを有することを特徴とする請求の範囲第２９項記載のインタフェース。
【請求項３２】
上記リンクリスト内の各バッファは、起動されて上記アプリケーションを転送中のデータの所定の位置に再同期させる再同期イベントを有することを特徴とする請求の範囲第３１項記載のインタフェース。
【請求項３３】
アプリケーションとＩＥＥＥ１３９４規格に準拠したバス間のインタフェースであって、該アプリケーションとバス間のデータ転送動作を管理するインタフェースにおいて、
上記アプリケーションと通信し、該アプリケーションから要求を受信し、該アプリケーションにインストラクションを送るアプリケーションプログラミングインタフェースと、
上記アプリケーションによって割り当てられたバッファと上記バス上のノード間の非同期データ転送動作を行うのに必要なトランザクションを、自動的に生成する自動トランザクション発生器と、
上記バスに物理的インタフェースを提供し、該バスを介してデータパケットを送信及び受信するバスインタフェース回路とを備えるインタフェース。
【請求項３４】
上記アプリケーションが上記アプリケーションプログラミングインタフェースに要求を送ったときに、上記データ転送動作が開始されることを特徴とする請求の範囲第３３項記載のインタフェース。
【請求項３５】
上記要求は、上記アプリケーションのバッファのアドレスと、上記バスのスタートアドレスと、転送されるデータの長さと、転送方向とを含むことを特徴とする請求の範囲第３４項記載のインタフェース。
【請求項３６】
上記自動トランザクション発生器は、ハードウェア論理回路によって実現されていることを特徴とする請求の範囲第３３項記載のインタフェース。
【請求項３７】
上記自動トランザクション発生器は、ソフトウェアによって実現されていることを特徴とする請求の範囲第３３項記載のインタフェース。
【請求項３８】
アプリケーションにインタフェースを提供し、該アプリケーションとバス間のアイソクロナスデータ転送動作を管理するデータ転送管理方法において、
上記アプリケーションからアイソクロナスデータ転送動作の要求を受信するステップと、
上記アプリケーションからのアイソクロナスデータ転送動作の要求により、該要求されたアイソクロナスデータ転送を、連続したストリームの流れが途切れないように維持するために用いられる複数のバッファにそれぞれ対応するバッファ記述子のリンクリストを管理し、該アプリケーションが別のバッファを処理する間に、１つのバッファとバス間でデータを転送するステップとを有するデータ転送管理方法。
【請求項３９】
上記アプリケーションは、アイソクロナスデータ送信動作中に、１つのバッファにデータを書き込むことを特徴とする請求の範囲第３８項記載のデータ転送管理方法。
【請求項４０】
上記アプリケーションは、アイソクロナスデータ受信動作中に、１つのバッファからデータを読み出すことを特徴とする請求の範囲第３８項記載のデータ転送管理方法。
【請求項４１】
上記リンクリストは、前のバッファを指示するバックワードポインタと次のバッファを指示するフォワードポインタとを含んでいることを特徴とする請求の範囲第３８項記載のデータ転送管理方法。
【請求項４２】
上記リンクリスト内の各バッファは、データ転送動作中の所定の時点で起動されて上記アプリケーションを呼び出すコールバックルーチンを有することを特徴とする請求の範囲第３８項記載のデータ転送管理方法。
【請求項４３】
上記リンクリスト内の各バッファは、起動されて上記アプリケーションを転送中のデータの所定の位置に再同期させる再同期イベントを有することを特徴とする請求の範囲第３８項記載のデータ転送管理方法。
【請求項４４】
上記リンクリストにバッファを追加するステップを更に有する請求の範囲第４１項記載のデータ転送管理方法。
【請求項４５】
上記リンクリストからバッファを削除するステップを更に有する請求の範囲第４１項記載のデータ転送管理方法。
【請求項４６】
アプリケーションとバスの間のデータ転送動作を管理する該アプリケーションとバス間のインタフェースにおいて、
上記アプリケーションと通信し、該アプリケーションから要求を受信し、該アプリケーションにインストラクションを送る通信手段と、
上記アプリケーションからのアイソクロナスデータ転送動作の要求により、該要求されたアイソクロナスデータ転送を、連続したストリームの流れが途切れないように維持するために用いられる複数のバッファにそれぞれ対応するバッファ記述子のリンクリストを管理し、上記アプリケーションとバス間のアイソクロナスデータ転送を制御するアイソクロナスデータ転送制御手段と、
上記バスを介して転送されるデータパケットを、該バスに送信し、該バスから受信するとともに、監視する手段とを備えるインタフェース。
【請求項４７】
上記バッファは、上記アプリケーションによって提供されることを特徴とする請求の範囲第４６項記載のインタフェース。
【請求項４８】
上記リンクリストは、該リンクリスト内の各バッファについて、次のバッファを指示するフォワードポインタを含んでいることを特徴とする請求の範囲第４７項記載のインタフェース。
【請求項４９】
上記リンクリストは、該リンクリスト内の各バッファについて、前のバッファを指示するバックワードポインタを含んでいることを特徴とする請求の範囲第４８項記載のインタフェース。
【請求項５０】
上記リンクリスト内の各バッファ記述子は、データ転送動作中の所定の時点で起動されて上記アプリケーションを呼び出すコールバックルーチンを有することを特徴とする請求の範囲第４６項記載のインタフェース。
【請求項５１】
上記リンクリスト内の各バッファ記述子は、起動されて上記アプリケーションを転送中のデータの所定の位置に再同期させる再同期イベントを有することを特徴とする請求の範囲第４６項記載のインタフェース。
【請求項５２】
上記アプリケーションによって割り当てられたバッファと上記バス間の非同期データ転送動作を行うのに必要なトランザクションを、自動的に生成する自動トランザクション発生器（３８）を更に備える請求の範囲第４６項記載のインタフェース。
【請求項５３】
上記バス（２８）は、ＩＥＥＥ１３９４規格に準拠したバスであることを特徴とする請求の範囲第５２項記載のインタフェース。
【請求項５４】
上記リンクリストは、該リンクリスト内の各バッファについて、前のバッファを指示するバックワードポインタと次のバッファを指示するフォワードポインタとを含み、該リンクリストは線形リストとして構成されていることを特徴とする請求の範囲第４７項記載のインタフェース。
【請求項５５】
上記アプリケーションは、上記リンクリストにバッファを追加することを特徴とする請求の範囲第５４項記載のインタフェース。
【請求項５６】
上記アプリケーションは、上記リンクリストからバッファを削除することを特徴とする請求の範囲第５５項記載のインタフェース。
【請求項５７】
アプリケーションとＩＥＥＥ１３９４規格に準拠したバス間のインタフェースであって、該アプリケーションとバス間のデータ転送動作を管理するインタフェースにおいて、
上記アプリケーションと通信し、該アプリケーションから要求を受信し、該アプリケーションにインストラクションが送るアプリケーションプログラミングインタフェースと、
上記アプリケーションからのアイソクロナスデータ転送動作の要求により、該要求されたアイソクロナスデータ転送を、連続したストリームの流れが途切れないように維持するために用いられるバッファのリンクリストを管理し、該アプリケーションとバス間のアイソクロナスデータ転送を制御する制御手段と、
上記バスに物理的インタフェースを提供し、該バスを介して転送されるデータパケットを送信及び受信するバスインタフェース回路とを備えるインタフェース。
【請求項５８】
上記リンクリストは、該リンクリスト内の各バッファについて、前のバッファを指示するバックワードポインタと次のバッファを指示するフォワードポインタとを含み、該リンクリストは循環リストとして構成されていることを特徴とする請求の範囲第５７項記載のインタフェース。
【請求項５９】
上記リンクリスト内の各バッファは、データ転送動作中の所定の時点で起動されて上記アプリケーションを呼び出すコールバックルーチンを有することを特徴とする請求の範囲第５８項記載のインタフェース。
【請求項６０】
上記リンクリスト内の各バッファは、起動されて上記アプリケーションを転送中のデータの所定の位置に再同期させる再同期イベントを備えることを特徴とする請求の範囲第５９項記載のインタフェース。
【請求項６１】
上記リンクリストは、上記リンクリスト内の各バッファについて、前のバッファを指示するポインタと次のバッファを指示するポインタとを含み、該リンクリストは線形リストとして構成されていることを特徴とする請求の範囲第５７項記載のインタフェース。
【請求項６２】
上記アプリケーションは、上記リンクリストにバッファを追加することを特徴とする請求の範囲第６１項記載のインタフェース。
【請求項６３】
上記アプリケーションは、上記リンクリストからバッファを削除することを特徴とする請求の範囲第６２項記載のインタフェース。
【発明の詳細な説明】
技術分野
本発明は、バスを介してデータ転送を行うためのアプリケーションプログラミングインタフェースに関する。より詳しくは、本発明は、非同期データ転送及びアイソクロナスデータ転送のいずれにも対応するバスを介したデータ転送におけるバス管理及びデータ転送の制御に関する。
背景技術
１９９５年６月１６日に作成されたＩＥＥＥ１３９４規格「Ｐ１３９４高性能シリアルバスのための規格」ドラフト８．０１ｖｌ（The IEEE 1394 standard,"P1394 Standard For A High Performance Serial Bus,"Draft 8.01vl,June 16,1995）は、非同期データ転送及びアイソクロナスデータ転送をサポートし、比較的安価に高速シリアルバスアーキテクチャを実現した国際規格である。アイソクロナスデータ転送は、リアルタイムデータ転送の一種であり、このアイソクロナスデータ転送では、送信側アプリケーションと受信側アプリケーションとにおいて、特定のデータの転送間隔が等しい。アイソクロナスデータ転送においては、各パケットは、それぞれ固有の周期で転送される。アイソクロナスデータ転送の理想的なアプリケーションとしては、例えばビデオ記録装置とテレビジョン受信機がある。ビデオ記録装置は、映像と音声を記録し、記録したデータを個別の塊、すなわちパケットに分割する。そして、ビデオ記録装置は、映像と音声の各パケットを一定の周期で送信し、テレビジョン受信機において映像と音声が再生される。ＩＥＥＥ１３９４規格に準拠したバスアーキテクチャにより、マルチチャンネルによるアプリケーション間のアイソクロナスデータ転送が実現される。これによれば、データと共に６ビットのチャンネル番号が報知され、このチャンネル番号に基づいて適切なアプリケーションがパケットを受信することを保証している。また、マルチチャンネルにより、バスを介して複数のアプリケーションが同時にアイソクロナスデータを送受信することができる。非同期データ転送は、比較的古くから用いられているデータ転送方式であり、非同期データ転送では、できるだけ速く、可能な限り多くのデータが送信側から受信側に転送される。
ＩＥＥＥ１３９４規格は、デジタル装置を汎用入出力接続により相互接続する高速シリアルバスを提供するものである。ＩＥＥＥ１３９４規格は、デジタルインタフェースを規定しており、これにより、アプリケーションは、デジタルデータをアナログデータに変換する必要がなく、バスを介してデータをデジタルフォーマットのまま送信することができる。したがって、受信側のアプリケーションが受信するデータは、アナログデータではなく、デジタルデータであり、受信側のアプリケーションでは、アナログデータをデジタルデータに変換する手間が省かれる。ＩＥＥＥ１３９４規格で要求されているケーブルは、このようなデジタル装置間の接続に用いられている他の太いケーブルに比べて、かなり細い。また、ＩＥＥＥ１３９４バスが動作中であっても、新たな装置をバスに接続したり、切り離したりすることができる。バスに新たな装置が接続され、あるいは切り離された場合には、ＩＥＥＥ１３９４バスは、現ノード間でデータの送受信ができるように、自動的にバス環境を再設定する。ノードは、バスにおいて固有のアドレスを有する論理的なエンティティとみなされる。各ノードは、識別ＲＯＭと、制御レジスタの標準セットと、ノード自身のアドレス空間とを有している。
ＩＥＥＥ１３９４規格で規定されているプロトコルを図１に示す。このプロトコルは、シリアルバス管理ブロック１０と、このシリアルバス管理ブロック１０にそれぞれ接続されたトランザクションレイヤ１２と、リンクレイヤ１４と、物理レイヤ１６とを有する。物理レイヤ１６は、装置又はアプリケーションとＩＥＥＥ１３９４ケーブルとを電気的且つ機械的に接続する。さらに、物理レイヤ１６は、アービトレーション機能を有し、ＩＥＥＥ１３９４バスに接続されている全ての装置が実際にデータの送信及び受信を行うアクセス経路を有することを保証する。リンクレイヤ１４は、非同期データ転送及びアイソクロナスデータ転送の両方に対応したパケットの配信を行う。リンクレイヤ１４は、確認応答プロトコル（acknowledgement protocol）を用いて、非同期データ転送をサポートし、さらに、ジャストインタイムデータ配信（just-in-time data delivery）を行うリアルタイム帯域保証プロトコル（real-time guaran teed bandwidth protocol）を用いて、アイソクロナスデータ転送をサポートしている。トランザクションレイヤ１２は、読出、書込及びロックを含む非同期データ転送を行うために必要なコマンドをサポートしている。シリアルバス管理ブロック１０は、アイソクロナスデータ転送動作を管理するアイソクロナスリソースマネージャを備えている。さらに、シリアルバス管理ブロック１０は、アービトレーションのタイミングを最適化し、バス上の全ての装置に供給される電力が適切な値となるような調整を行い、サイクルマスタの割当を行い、アイソクロナスチャンネル及び帯域リソースの割当を行い、及びエラーの基本通知を行うことにより、シリアルバス全体の環境を制御する。
ＩＥＥＥ１３９４規格のシリアルバスを用いるアプリケーションのアプリケーションプログラミングインタフェース（ＡＰＩ）は、スキップストーン社（Skipstone）によって開発されており、アプリケーションは、このＡＰＩを用いてＩＥＥＥ１３９４バスをデータ転送バスとして用いることができる。スキップストーン社のＡＰＩについては、アメリカ合衆国テキサス州７８７５９オースチン＃４２５ウェストブレーカーレーン３９２５のスキップストーン社（Skipstone,Inc.,3925 West Braker Lane,#425,Austin,Texas 78759）から入手可能な説明書「シリアルソフトＩＥＥＥ１３９４開発ツールキット」（"The SerialSoft IEEE 1394 Developer Toolkit"）に記載されている。スキップストーン社は、このＡＰＩを、ＩＥＥＥ１３９４バス上の装置に書き込むデータ及びから読み出すデータを管理するアプリケーションによって用いられるプログラミングコールの集まりと定義している。アイソクロナスデータ転送を初期化するためには、何回かの非同期データ転送が必要とされ、これにより、アプリケーションを設定し、データの転送に用いられる特定のチャンネルを決定することができる。チャンネルが一旦決定されると、送信側のアプリケーションは、バッファを用いてデータを一時的に記憶した後、送信し、受信側のアプリケーションは、バッファを用いてデータを一時的に記憶した後、処理する。送信側のアプリケーションにおいて、スキップストーン社のＡＰＩは、データの送信を能動的に管理する。すなわち、このＡＰＩは、適切な周期で、適切なバッファの適切な部分からデータをバスに送信する。受信側のアプリケーションにおいて、スキップストーン社のＡＰＩは、データの受信を能動的に管理する。すなわち、ＡＰＩは、適切な周期で、バスからデータを受信し、適切なバッファの適切な部分にデータを一時的に記憶した後、データを処理する。
非同期データ転送においては、スキップストーン社のＡＰＩは、データ転送を行うのに必要なトランザクションを能動的に管理する。非同期入力書込トランザクションが行われている間、アプリケーションは、１３９４バスのアドレス空間の適切な領域にマッピングされたバッファをＡＰＩに提供する。非同期入力書込トランザクションがＡＰＩに到着すると、それらのデータがバッファに書き込まれる。非同期入力読出トランザクションが行われている間、アプリケーションは、バッファに有用な情報が格納されていることを確認しなければならない。そして、１３９４バスドライバは、非同期入力読出トランザクションが到着すると、バッファの要求されたアドレスからデータを読み出す。非同期入力書込トランザクション及び読出トランザクションの両方において、スキップストーン社のＡＰＩは、必要なトランザクションを能動的に生成し、管理する。例えば、データブロックをアプリケーションに転送するとき、そのデータ量が複数のトランザクションを必要とする場合、スキップストーン社のＡＰＩは、アプリケーションに、データブロックの転送を行うのに必要な複数の１３９４トランザクションのそれぞれを記述させる。この処理は、非同期データ転送動作中のＡＰＩがデータを落とさないように注意するだけではなく、アプリケーションのプロセッサにとって大きなオーバヘッドとなる。
スキップストーン社のＡＰＩは、同様な手法によりアイソクロナスデータ転送をサポートしている。具体的には、アプリケーションは、スキップストーン社のＡＰＩに対して各アイソクロナスデータのパケットを記述しなくてはならない。そして、スキップストーン社のＡＰＩは、各パケットを適切な周期で送信する。このような処理は、アプリケーションのプロセッサのオーバヘッドが増え、このために、アプリケーションは、アイソクロナスデータを効率的に処理することができない。
そこで、ＡＰＩ及びアプリケーションのプロセッサによる監視を必要とすることなく、データ転送を行うのに必要なトランザクションを自動的に生成するＡＰＩの実現が望まれている。また、アプリケーションの要求に従ってハードウェアを高度に自動化でき、ＩＥＥＥ１３９４規格に準拠したバスにおけるアイソクロナスデータ転送を効率的に行うＡＰＩの実現が望まれている。
発明の開示
本発明は、アプリケーションとバス間の非同期データ転送及びアイソクロナスデータ転送を実行及び管理するアプリケーションプログラミングインタフェース（ＡＰＩ）を提供する。ＡＰＩは、非同期データ転送において、１つ以上の非同期データ転送トランザクションを用いて、アプリケーション内の１つ以上のローカルバッファとバス上の様々なアドレスとの間において、あらゆる量のデータを転送する能力を有する。自動トランザクション発生器は、直接的なプロセッサの制御又はＡＰＩによる監視を必要とすることなく、非同期データ転送動作を行うのに必要なトランザクションを自動的に生成する。また、ＡＰＩは、アプリケーションとバス上の他のノードとの間で、専用チャンネルを介してアイソクロナスデータ転送を行う機能を有する。アイソクロナスデータ転送においては、アプリケーションから提供されるデータバッファの記述子のリンクリストを管理するバッファ管理方式が用いられる。バッファ記述子のリンクリストは、アイソクロナスデータの連続したストリームの流れが途切れないことを保証するために、ＡＰＩによって維持される。このバッファ記述子のリンクリストは、例えばバッファの循環リストとして構成され、リンクリスト内の次のバッファに対するフォワードポインタと、リンクリスト内の前のバッファに対するバックワードポインタとを含んでいる。また、バッファ記述子のリンクリストを線形リストとして構成してもよく、この場合、アプリケーションは、いつでもリンクリストに新規のバッファを追加したり、リンクリストから既存のバッファを削除したりすることができる。アイソクロナスデータ転送におてい、ＡＰＩは、データストリーム中に再同期イベントを挿入し、アプリケーションとデータ転送動作の所定の時点とを再同期させることができる。また、リンクリスト内の各バッファは、データ転送の所定の時点でアプリケーションを呼び出すコールバックルーチンを有する。
【図面の簡単な説明】
図１は、ＩＥＥＥ１３９４規格で規定されるプロトコルを説明する図である。
図２は、バスを備えるシステム内のアプリケーションプログラミングインタフェースを示すブロック図である。
図３は、ビデオカメラ５０と、ビデオカセットレコーダ５２と、コンピュータ５４と、それらを接続するＩ／Ｏバス５６、５８とを備えるシステムを示す図である。
図４は、本発明のアプリケーションプログラミングインタフェースを実現する各システム内に設けられたハードウェア装置のブロック図である。
図５は、アプリケーションによりＡＰＩ２０に割り当てられたバッファに対応するバッファ記述子のリンクリストを示す図である。
図６は、ＡＰＩバッファのアイソクロナスデータ送受信動作を示すフローチャートである。
発明を実施するための好ましい実施の形態
図３に示すシステムは、ビデオカメラ５０と、ビデオカセットレコーダ５２と、コンピュータ５４と、それぞれの装置を接続する入出力（Ｉ／Ｏ）バス５６、５８とを備えている。Ｉ／Ｏバス５６は、ビデオカメラ５０とビデオカセットレコーダ５２を接続し、これにより、ビデオカメラ５０からビデオカセットレコーダ５２にデータを送信し、記録することができる。Ｉ／Ｏバス５８は、ビデオカセットレコーダ５２とコンピュータ５４を接続し、これにより、ビデオカセットレコーダ５２からコンピュータ５４にデータを送信し、このデータに基づく映像を表示させる。
本発明を適用したアプリケーションプログラミングインタフェース（ＡＰＩ）は、ビデオカメラ５０、ビデオカセットレコーダ５２及びコンピュータ５４等の相互に接続されたサブシステムのうちのいずれか又は全てに実装されており、ＡＰＩは、Ｉ／Ｏバス５６、５８を介して行われるデータ転送動作を制御する。本発明の好ましい実施の形態では、Ｉ／Ｏバス５６、５８にはＩＥＥＥ１３９４規格に準拠したケーブルを用いている。
各サブシステムに設けられた、本発明を適用したＡＰＩを実現するハードウェア装置のブロック図を、図４に示す。図４に示すハードウェア装置において、プリント回路基板６０には、ユーザインタフェース７０が接続されている。このプリント回路基板６０には、中央処理装置（ＣＰＵ）６２が実装されており、このＣＰＵ６２には、システムバス６８を介して、システムメモリ６４と、Ｉ／Ｏバスインタフェース６６とが接続されている。システムバス６８は、ユーザインタフェース７０にも接続されている。ユーザインタフェース７０は、特定のサブシステムであり、ユーザと情報のやりとりを行うための、例えばキーボードやディスプレイ、他の入出力機器からなる。
図３に示すビデオカメラ５０、ビデオカセットレコーダ５２、コンピュータ５４の各サブシステムは、本発明のＡＰＩを実現するために、例えば図４に示すようなハードウェア装置を備える。各サブシステム内のＣＰＵ６２は、アプリケーションプログラムのインストラクションを実行する。そして、本発明のＡＰＩは、Ｉ／Ｏバス５６、５８を介して、そのＡＰＩが存在するサブシステムと他のサブシステム間のアイソクロナスデータ転送及び非同期データ転送動作を管理する。
本発明を適用したＡＰＩは、バスを介したアプリケーションへの及びからのアイソクロナスデータ転送と非同期データ転送を実行する。ここで用いられるアプリケーションを、以下ではアプリケーション又はデバイスドライバと呼ぶ。データ転送動作が行われるバスとしては、例えばＩＥＥＥ１３９４規格に準拠したバスが適している。なお、当業者にとって明らかなように、本発明に係るＡＰＩは、他の種類のバス上でのデータ転送の管理にも用いることができる。このＡＰＩは、１つ以上の非同期テータ転送トランザクションを用いて、アプリケーションによって提供されるローカルバッファとバス上の様々なアドレスとの間において、あらゆる量のデータを転送する能力を有する。データブロックの非同期転送が開始されると、ＡＰＩは、自動トランザクション発生器にコマンドを送る。そして、自動トランザクション発生器は、直接的なプロセッサの制御又はＡＰＩによる監視を必要とすることなく、完全なデータブロックを非同期転送するのに必要な書込又は読出トランザクションを自動的に生成する。
また、ＡＰＩは、アプリケーションとバス上の他のノードとの間で、専用チャンネルを介してアイソクロナスデータ転送を行う機能を有する。アイソクロナスデータ転送においては、アプリケーション内のデータバッファを管理するバッファ管理方式が用いられる。アプリケーションは、転送するデータの種類及びデータ量に応じて、１つのバッファ、２つ以上のバッファ、あるいはバッファのリンクリストを用いる。バッファを指示するバッファ記述子のリンクリストは、アイソクロナスデータの連続したストリームの流れが途切れないことを保証するために、ＡＰＩによって維持される。このバッファ記述子のリンクリストは、バッファの線形又は循環リストとして実現できるとともに、各バッファについて、リンクリスト内の次のバッファの記述子を指示するフォワードポインタと、リンクリスト内の前のバッファの記述子を指示するバックワードポインタとを含んでいる。リンクリストが線形リストのときは、アプリケーションは、処理するデータに応じて、動的に、新たなバッファをリンクリストに追加し、又はリンクリストから既存のバッファを削除することができる。
アイソクロナスデータ転送においては、本発明を適用したＡＰＩは、データ内の所定の位置で再同期が行えるようにする再同期イベントを、データストリーム中に挿入する。また、このＡＰＩは、データ転送動作中の所定の時点でアプリケーションを呼び出す各バッファ用のコールバックルーチンを提供する。再同期イベント及びコールバックルーチンは、共にＩＥＥＥ１３９４規格でサポートされているものである。
また、本発明を適用したＡＰＩは、必要に応じて、バス上でバス管理動作を実行する機能を有する。このようなバス管理動作には、アイソクロナスチャンネル番号の割当及びその解除、及び必要に応じて行われるアイソクロナスデータ転送用の帯域幅の割当及びその解除が含まれる。バスがＩＥＥＥ１３９４規格のバスである場合、ＡＰＩは、また、ＩＥＥＥ１３９４規格で定められている他のバス管理動作を実行する。
本発明を適用したＡＰＩとバスとを備えるシステムを図２に示す。ＡＰＩ２０は、アプリケーション２２、２４とバス２８間のインタフェースとして機能し、アプリケーション２２、２４とバス２８間のデータ転送動作を管理する。図２に示すように、１つのＡＰＩ２０は、複数のアプリケーションとバス２８間のインタフェースとして機能することができる。例えば、図３に示すコンピュータ５４においては、１つのＡＰＩ２０は、コンピュータ５４で実行される１つ以上のアプリケーション間のインタフェースとして機能することができる。
ＡＰＩ２０とバス２８間には、ハードウェア及び物理的インタフェース２６が設けられている。ハードウェア及び物理的インタフェース２６は、アプリケーション２２、２４の１つとバス２８上の他のノード間の非同期データ転送を行うのに必要なトランザクションを自動的に生成する自動トランザクション発生器３８を備える。また、ハードウェア及び物理的インタフェース２６は、バス２８への及びからのデータの流れを監視及び管理するバスインタフェース４０を備えいている。ハードウェア及び物理的インタフェース２６は、ＡＰＩ２０によって制御され、１組のメモリバッファ３０に接続されている。１組のメモリバッファ３０は、複数のメモリバッファ３２、３４、３６を備えている。メモリバッファ３２、３４、３６は、後述するように、アプリケーション２２への及びからのアイソクロナスデータ転送を維持するために、アプリケーション２２により、ＡＰＩ２０に専用とされている。
アイソクロナスデータ転送
アプリケーションは、アイソクロナスデータ転送動作を初期化するために、最初に、ＡＰＩ２０にアイソクロナスチャンネルを要求する。このとき、アプリケーションは、特定のチャンネル番号又は利用可能なチャンネル番号のどちらかを要求することができる。そして、ＡＰＩ２０は、要求毎に、ＩＥＥＥ１３９４規格のアイソクロナスデータ転送のためのチャンネルを獲得する。ＩＥＥＥ１３９４規格は、６ビットのチャンネル番号をサポートしており、このチャンネル番号は、バス２８全体に対してデータストリームとして報知される。アプリケーションとバス２８上の他のノード間に、一旦アイソクロナスデータ転送のチャンネルが割り当てられると、他のノードは、その特定のチャンネル番号を使用することができない。そして、チャンネルが割り当てられた後は、アプリケーションは、データ転送用のメモリバッファをＡＰＩ２０に割り当てなければならない。アプリケーションは、アイソクロナスデータの受信又は送信に用いられる１つのメモリバッファ、２つ以上のメモリバッファ、あるいはメモリバッファのリンクリストをＡＰＩ２０に割り当てることができる。ＡＰＩ２０に割り当てられるメモリバッファは、連続的なものでも断片的なものでもよく、及び論理的なものでも物理的なものでもよい。メモリバッファのリンクリストは、循環的なものでも、線形的なものでもよい。ＡＰＩ２０に割り当てられたメモリバッファのリンクリストが線形的なものである場合、アプリケーション２２は、処理するデータに応じて、新たなメモリバッファをリンクリストに追加し、又はリンクリストから既存のメモリバッファを削除することができる。
図２に示すシステムでは、アプリケーション２２は、アイソクロナスデータ転送のために、３つのメモリバッファ３２、３４、３６からなる１組のメモリバッファ３０をＡＰＩ２０に割り当てている。また、アプリケーション２２は、各メモリバッファ３２、３４、３６のそれぞれに１つの合計３つのバッファ記述子のリンクリストをＡＰＩ２０に割り当てている。ＡＰＩ２０は、リンクリスト内の各メモリバッファに対する記述子を維持し、アプリケーション２２と、割り当てられたメモリバッファ３２、３４、３６と、バス２８との間のアイソクロナスデータの流れを管理する。ＡＰＩ２０によって維持されているリンクリスト内においては、各メモリバッファは、バッファ記述子によって表され、リンクリストは、リンクリスト内における次のメモリバッファの記述子に対するフォワードポインタと、リンクリスト内における前のメモリバッファの記述子に対するバックワードポインタとを含んでいる。ＡＰＩ２０に割り当てられたメモリバッファに対応するバッファ記述子のリンクリストを図５に示す。バッファ記述子１〜ｎは、それぞれメモリバッファ１〜ｎに対応している。具体的には、バッファ記述子８０は、メモリバッファ８４に対応し、バッファ記述子８２は、メモリバッファ８６に対応している。
各バッファ記述子は、対応するメモリバッファのアドレス及び長さを含んでいる。また、バッファ記述子は、メモリバッファが一杯又は空になった後、現在のデータ転送動作の方向に従って呼び出すコールバック完了ルーチンを含んでいる。さらに、バッファ記述子は、オプションの同期イベントを含んでおり、この同期イベントは、メモリバッファがどのように特定のイベント又は時刻に同期されるかを、アプリケーションによってプログラムされるものである。具体的には、メモリバッファ８４に対応するバッファ記述子８０は、メモリバッファ８４のアドレス８０ａ及びバッファ長８０ｂを含んでいる。また、バッファ記述子８０は、必要に応じて、完了ルーチン８０ｃ及び同期イベント８０ｄを含んでいる。
バッファ記述子及びメモリバッファを上述のように用いることにより、バッファ記述子、メモリバッファ、完了ルーチン及び同期イベントの全ては、アプリケーションによって、その特定の要求に従って設定されるので、本発明のＡＰＩを用いたアプリケーションは、高い柔軟性を得ることができる。例えば、デジタルビデオカメラ内で実行され、デジタルビデオモニタにアイソクロナスデータを転送するアプリケーションでは、データがメモリバッファにロードされ、それに対して、ＡＰＩは、バッファ記述子を維持する。そして、ＡＰＩは、メモリバッファからビデオモニタに対するデータの各パケットの転送動作を管理する。ビデオカメラは、１対のバッファ記述子が同一のメモリバッファを指示するようにすることにより、垂直方向において２倍の圧縮を行うことができる。すなわち、記述子１、２がメモリバッファ１を指示し、記述子３、４がメモリバッファ２を指示するようにする。各対の第２の記述子内の完了ルーチンは、ビデオモニタに、メモリバッファからデータを読み出す準備ができたことを通知する。これは、ビデオカメラが第１及び第２の走査線のデータを出力するとき、第２の走査線のデータは、メモリバッファ内の第１の走査線のデータを上書きすることを意味する。ビデオモニタは、第２の走査線のデータが書き込まれるまで、メモリバッファからデータを読み出さないので、ビデオモニタには第１の走査線は決して表示されない。このように、走査線が１つ置きに飛び越される。
バッファ記述子のリンクリストは、循環的なものとすることができ、これにより、メモリバッファ３２、３４、３６への又はからのデータの連続した流れが維持される。アプリケーション２２からバス２８を介した他のノードへのアイソクロナスデータ転送では、アプリケーション２２は、メモリバッファ３２、３４、３６を順番に、データで満たす。そして、ＡＰＩ２０は、適切なメモリバッファからバス２８への適切な周期のデータ転送動作を管理する。ハードウェア及び物理的インタフェース２６内のバスインタフェース４０は、メモリバッファ３２、３４、３６からバス２８へのデータ転送を制御する。他のノードからバス２８を介したアプリケーション２２へのアイソクロナスデータ転送では、ＡＰＩ２０は、バス２８からバスインタフェース４０を介した適切なメモリバッファ３２、３４、３６へのデータ転送動作を管理する。割り当てられたメモリバッファが一杯になると、データは、リンクリスト内の次のメモリバッファに記憶される。そして、アプリケーション２２は、メモリバッファ３２、３４、３６のうちの適切な１つからデータを適切な周期で読み出す。アプリケーション２２が一旦１つのメモリバッファからのデータの読出を終了すると、そのメモリバッファは、ＡＰＩ２０に戻され、アプリケーション２２は、次のメモリバッファからのデータの読出を開始する。
また、バッファ記述子のリンクリストは、線形的なものとすることができ、この場合、アプリケーションは、データ転送動作に応じて、ＡＰＩ２０に対するメモリバッファの割当及び解除を行う。例えば、アイソクロナスデータの受信では、アプリケーションは、各メモリバッファの処理を終了すると、更なるデータを受信させるために、それらをＡＰＩ２０に再び割り当てることができる。また、データ転送動作を行うために、更なるメモリバッファが必要な場合、アプリケーションは、ＡＰＩ２０に更なるメモリバッファを割り当てることができる。
ＡＰＩ２０は、アイソクロナスデータ転送においては、アプリケーション２２の要求に応じて、再同期イベント及び／又はコールバックルーチンを実行する。再同期イベントにより、アプリケーションは、転送中のデータ内の所定の位置に再同期される。データは、アイソクロナス的に転送されるので、この再同期イベントは、また、アプリケーションを、関連するデータの流れにおける適切な時点に同期させる。再同期イベントを実行する理想的な例としては、例えばビデオデータの転送がある。例えば、ビデオレコーダ等のアプリケーションからビデオデータを転送する場合、データは、モニタ又はテレビジョン受信機の画面の１本の水平走査線を表すブロックとして転送される。モニタは、各水平走査線を表示した後は、次の水平走査線を表示するために、それ自身をリセットしなければならない。モニタは、各水平走査線の最後のデータの位置で再同期イベントを用いることにより、それ自身を、次の水平走査線のデータの開始位置に同期させることができる。
本発明に係るＡＰＩの好ましい実施の形態では、特定のバス時間、すなわち、アイソクロナスデータのブロックのヘッダに特定の値が現れたとき、あるいは、バスの特定のチャンネルに、動作を開始するアイソクロナスデータ又は動作を停止するアイソクロナスデータが現れたとき、アイソクロナスデータ転送動作は、同期が取られ、又は直ちに実行されるようにスケジュールされる。
ＡＰＩ２０に割り当てられた各メモリバッファは、再同期イベント及びコールバックルーチンを有する。コールバックルーチンは、ビデオデータの転送において、１フレームを表すデータブロックの転送の最後で用いることができる。モニタ又はテレビジョン受信機は、複数の水平走査線を１つのフレームにグループ化し、画面の最上部から次のフレームの表示が開始するように、各フレームの最後においてそれ自身をリセットする。コールバックルーチンは、各フレームを表すデータストリームの最後で用いられる。このような方式により、バス２８に接続されたソース機器からのビデオフレームを表すデータを、メモリバッファに記憶することができる。ビデオフレームを表すデータを転送した後、コールバックルーチンを用いて、処理のための次のフレームを表すデータが転送されてくることを、アプリケーションに通知することができる。そして、アプリケーションは、次のフレームを表すデータが次のメモリバッファに記憶されている間に、現フレームのデータを処理することができる。
アイソクロナスデータの送信及び受信動作におけるＡＰＩ２０及びメモリバッファの処理のフローチャートを図６に示す。ステップ１０２において、アイソクロナスデータの受信動作が開始され、アプリケーションは、バッファ記述子、完了ルーチンの呼出及び同期イベントを設定する。フローチャート１００のステップ１０２において、バスシステムで処理を必要とする各アイソクロナスデータのストリームが入力される。ＡＰＩ２０は、入力データを処理するために現在の記述子を追跡し続ける。換言すると、ＡＰＩ２０は、次のメモリバッファのポインタ、及び次のメモリバッファ内のデータを記憶することができる位置を維持する。
ステップ１０４において、次のバッファ記述子が、リンクリストから取得される。ステップ１０６において、リンクリスト内に、更なるバッファ記述子が存在するか否かが判定される。リンクリストに更なるバッファ記述子が存在しない場合、ステップ１０８において処理は停止される。更なるバッファ記述子が存在する場合、処理は、ステップ１１２に進み、現在のメモリバッファに対する同期イベントが到着されるまで待機する。同期イベントが一旦到着すると、ステップ１１４において、受信動作の場合には、入力データがメモリバッファに記憶され、あるいは送信動作の場合には、メモリバッファからのデータが送信される。メモリバッファの処理が終了すると、ステップ１１６において、このメモリバッファにコールバックルーチンが含まれているか否かが判定される。コールバックルーチンが含まれている場合、ステップ１１８において、コールバックルーチンが呼び出される。一方、コールバックルーチンが含まれていない場合、処理は、ステップ１０４に戻り、次の記述子が取得される。コールバックルーチンの有無に関わらず、ＡＰＩ２０及びハードウェア及び物理的インタフェース２６により、次のバッファ記述子が得られることが保証され、アイソクロナスデータは失われない。
フローチャート１００に示す各ステップは、ＣＰＵ及び関連したサブシステム、例えば図３及び図４を用いて説明した典型的なパーソナルコンピュータ、組込プロセッサ装置等において実行することができる。ここで説明したフローチャート１００の各ステップは、あらゆる適切なプログラミング言語、例えば、Ｃ、ＰＡＳＣＡＬ、ＦＯＲＴＲＡＮ、ＢＡＳＩＣ、アセンブラ言語等、あるいはそれらの言語の組合せで実現することができる。上述したステップを実現するソフトウェア設計において、あらゆる適切なコンピュータプログラミング技術、例えば、手続又はオブジェクト指向プログラミング、並列又は分散処理、割込駆動又はポーリングイベント処理等を用いることができる。フローチャート１００に示すステップは、この明細書及び特許請求の範囲に記載している方法及び装置の要件を満たす範囲内で、変更、追加又は削除することができる。また、１つのステップ内の処理を２つの以上のステップに分割することができる。また、実施の形態によっては、２以上のステップを同時に行うこともでき、あるいは各ステップのタスクをインターリーブすることもできる。さらに、各ステップの順序又はルーチンを変更することもできる。すなわち、フローチャート１００は、本発明の実施の形態における機能を実現するためのロジックの一例に過ぎない。
説明の便宜上、フローチャートにおける連続したステップを単一の「ルーチン」又はプログラムと呼んでいるが、各ステップを複数のルーチン、複数のプログラム、あるいは複数の処理等によって実現することができる。また、フローチャートの各ステップは、同じ又は異なる装置内の複数のプロセスで分散して実行することができる。
アイソクロナスデータ転送動作の一具体例において、アプリケーション２２が、バス２８に接続されたノードにおけるビデオレコーダからアイソクロナスデータを受信するビデオモニタ（以下、ビデオモニタ２２ともいう。）である場合、ＡＰＩ２０は、バス２８から、リンクリスト内のバッファ記述子によって表されるメモリバッファ３２、３４、３６へのデータの流れを管理する。１番目のメモリバッファ３２に、ビデオカメラから受信されるデータが記憶される。１番目のメモリバッファ３２が一杯になると、そのデータは、リンクリスト内の次のメモリバッファ３４にデータが記憶されている間に、処理されて、ビデオモニタ２２で表示される。１番目のメモリバッファ３２に記憶された１フレーム分のデータの最後にコールバックルーチンが存在する場合、このコールバックルーチンを用いて、１番目のメモリバッファ３２に記憶されている１番目のフレームを表すデータが処理可能なことを、ビデオモニタ２２に通知することができる。ビデオモニタ２２が１番目のメモリバッファ３２内のデータの処理を終了すると、ビデオモニタ２２は、バス２８から受信される更なるデータを記憶させるために、メモリバッファ３２をＡＰＩ２０に戻す。
アプリケーション２２が、バス２８に接続された他のノードにデータを送信するビデオレコーダである場合、アプリケーション２２は、メモリバッファ３２、３４、３６に順次データを記憶する。そして、ＡＰＩ２０は、メモリバッファ３２、３４、３６からのデータが適切なチャンネル及び適切な時刻にバス２８上に送信されるように管理する。以上のように、本発明を適用したＡＰＩ２０は、アプリケーション２２への又はからのアイソクロナスデータ転送動作を管理する。
非同期データ転送
アプリケーション２４とバス２８上の他のノード間で非同期データ転送を行うために、ＡＰＩ２０は、基本的に、ダイレクトメモリアクセス（ＤＭＡ）モデルを設定し、ハードウェアレベルの自動化を用いて、転送に必要な要求を自動的に生成し、アプリケーション２４及びＡＰＩ２０は、データ転送動作が行われている間、他の機能を実行することができる。ＡＰＩ２０は、非同期データ転送のためのメモリマッピングされたインタフェースを、アプリケーションに提供する。非同期データ転送を開始するために、アプリケーション２４は、アプリケーションのアドレス空間内におけるメモリバッファのアドレスと、バス２８のアドレス空間における転送が開始されるスタートアドレスと、転送されるデータブロックの長さと、転送が読出又は書込動作かを示すコードとを含む記述子を、ＡＰＩ２０に送る。ＡＰＩ２０は、必要なデータを自動トランザクション発生器３８に供給し、そして、自動トランザクション発生器３８は、バス２８を介して全てのデータブロックの転送を行うのに必要な１つ以上のトランザクションを生成する。そして、自動トランザクション発生器３８は、アプリケーション２４に割り当てられたメモリバッファとバス２８上の適切なアドレスとの間のデータ転送を行うのに必要な読出又は書込トランザクションを生成する。この自動化により、ＡＰＩ２０及びアプリケーション２４は、非同期データ転送を監視することを必要としない。本発明の好ましい実施の形態においては、自動トランザクション発生器３８は、ハードウェアによって実現されているが、当業者にとって、自動トランザクション発生器３８をＡＰＩ２０内のソフトウェアでも実現できることは明らかである。アプリケーション２４が、このハードウェアレベルの自動化を必要としない場合、ＡＰＩ２０は、また、自動トランザクション３８を用いることなく、データ転送動作を行うのに必要なトランザクションを生成することができる。
当業者には明らかなように、各読出又は書込トランザクションでは、バス２８の方式及び能力に基づいたあるデータ量しか転送することができない。したがって、データブロックを転送するには、複数の読出又は書込トランザクションが必要となる。従来のシステムとは対照的に、ＡＰＩ２０は、単一のコマンドを自動トランザクション発生器３８に送る。そして、自動トランザクション発生器３８は、ＡＰＩ２０にこれ以上の処理を要求することなく、バス２８上でデータブロックを転送するのに必要な読出又は書込トランザクションを生成する。これにより、ＡＰＩ２０とアプリケーション２４は、転送が行われている間、他のタスクを実行することができ、システムをより効率的にすることができる。この実施の形態では、非同期データ転送であるので、データブロック全体の転送が一旦終了すると、ＡＰＩ２０は、それをアプリケーション２４に通知する。
上述したように、本発明の好ましい実施の形態では、バス２８は、ＩＥＥＥ１３９４規格のバスである。したがって、非同期データ転送では、バス２８は、６４ビットのアドレス空間を提供する。自動トランザクション発生器３８に供給される記述子内において、データ転送が開始される相手のアドレスは、６４ビットのスタートアドレスで特定される。
非同期読出動作を開始するために、アプリケーション２４は、アプリケーションのアドレス空間内のそこにデータが転送されるメモリバッファのアドレスと、バス２８のアドレス空間のそこからデータが読み出される６４ビットのスタートアドレスと、転送されるデータブロックの長さと、転送が読出動作であることを示すコードとを含む記述子を、ＡＰＩ２０に送る。そして、ＡＰＩ２０は、必要な情報を自動トランザクション発生器３８に供給する。そして、自動トランザクション発生器３８は、バス２８上の適切なノードからアプリケーションのバッファにデータを転送するのに必要な読出コマンドを生成する。アプリケーション２４は、読出トランザクションが生成される前に、指定されたメモリバッファが利用可能であることを保証しなければならない。そして、データが、自動トランザクション発生器３８により生成されたトランザクションに応じて、周知の方法で読み出される。
非同期書込動作を開始するために、アプリケーション２４は、アプリケーションのアドレス空間内のそこからデータが転送されるメモリバッファのアドレスと、バス２８のアドレス空間のそこにデータが書き込まれる６４ビットのスタートアドレスと、転送されるデータブロックの長さと、転送が書込動作であることを示すコードとを含む記述子をＡＰＩ２０に送る。そして、ＡＰＩ２０は、必要な情報を自動トランザクション発生器３８に供給する。そして、自動トランザクション発生器３８は、アプリケーションのメモリバッファからバス２８上の適切なノードにデータを転送するのに必要な書込コマンドを生成する。そして、データが、自動トランザクション発生器３８により生成されたトランザクションに応じて、アプリケーションのメモリバッファから送信される。メモリバッファからデータが送信されるとき、アプリケーション２４は、それが通知される。
ＡＰＩの規約及びバス管理動作
アプリケーションは、ＡＰＩ２０内のルーチンを同期的又は非同期的に呼び出す。アプリケーションがルーチンを同期的に呼び出す場合、ルーチンがアプリケーションに戻されるときに、ＡＰＩ２０は、要求された動作を完了しているか、そうでない場合は、要求された動作を完了できなかったことを示す完了状態を返す。一方、アプリケーションがルーチンを非同期的に呼び出す場合、ルーチンが制御をクライアントに返す時点では、要求された動作は完了していない可能性が高い。アプリケーションは、ルーチンを非同期的に呼び出すために、完了コールバックルーチンを有している。ＡＰＩ２０は、元の呼出から返る前に、この完了コールバックルーチンを呼び出すことができる。しかしながら、多くの場合、ＡＰＩ２０は、動作を開始させた元の呼出から返る前に、要求された動作を完了し、そして、動作が完了したことを示すアプリケーションの完了コールバックルーチンを呼び出す。
ＡＰＩによって提供される機能を用いる前に、アプリケーションは、最初にＡＰＩを初期化する必要がある。各アプリケーションは、別々にＡＰＩを初期化しなければならない。例えば、あるアプリケーションは、ActivateSonyAPIルーチンを呼び出すことによって、ＡＰＩを初期化する。このActivateSonyAPIルーチンにより、ＡＰＩとアプリケーション間の接続が確立される。ActivateSonyAPIルーチンの呼出においては、アプリケーションは、バスのリセット又は他のバスイベントが発生したときにＡＰＩが呼び出す指示ルーチン（indication routine）を指定する。ActivateSonyAPIルーチンは、アプリケーションがその後のＡＰＩのルーチンの呼出に用いる値を、アプリケーションに返す。
その動作中に多数の指示を行うアプリケーションは、専用に使用する追加の指示バッファをＡＰＩに渡すために、AddIndBuffersルーチンを呼び出すことができる。クライアントは、ＡＰＩが現在有するバッファの数を確認するために、まず、CountIndBuffersルーチンを呼び出すことができる。アプリケーションは、ＡＰＩを終了する前に、RelIndBuffersルーチンを呼び出して、ＡＰＩに与えている指示バッファを解放することができる。
アプリケーションは、ＡＰＩの使用を終わると、DeactiveateSonyAPIルーチンを呼び出す。このDeactiveateSonyAPIルーチンにより、アプリケーションとＡＰＩ間の接続が切断され、全ての指示バッファ及びＡＰＩがアプリケーションに代わって用いていた全てのリソースが解放される。なお、アプリケーションのバッファの一部が現在ＡＰＩによって使用されている場合は、所定のアプリケーションからＡＰＩを直ちに解放できない場合もある。所定のアプリケーションに対してＡＰＩが動作している間は、そのアプリケーションは、ＡＰＩが備える全ての機能を使用することができる。
アプリケーションは、ＡＰＩを初期化した後、ＩＥＥＥ１３９４規格書第８節に規定されている、及び以下に説明するＩＥＥＥ１３９４規格の様々なバス管理機能を動作させることができる。アプリケーションは、MGMTAllocateChannelルーチン及びMGMTDeAllocateChannelルーチンをそれぞれ用いて、現在動作中のアイソクロナスリソースマネージャからアイソクロナスチャンネル番号を割り当てる及び解除することができる。これらのルーチンを用いて、アプリケーションは、利用可能であれば、特定のチャンネル番号の割当を要求することができる。あるいは、アプリケーションは、現在利用可能なチャンネル番号の割当を要求することができる。これらのＡＰＩルーチンは、アイソクロナスデータのチャンネルの割当及び解除に関して、ＩＥＥＥ１３９４規格の規定に準拠している。アイソクロナスチャンネル番号を用いるとき、アプリケーションは、ＩＥＥＥ１３９４規格の規定又は他の準拠（governing）プロトコル書に適用できる他の規定に従わなければならない。
アプリケーションは、MGMTAllocateBandwidthルーチン及びMGMTDeAllocateBandwidthルーチンをそれぞれ用いて、現在動作中のアイソクロナスリソースマネージャからアイソクロナス帯域を割り当てる及び解除することができる。これらのルーチンは、アイソクロナス帯域の割当及び割当の解除に関して、ＩＥＥＥ１３９４規格に規定に準拠している。これらのルーチンを用いるとき、アプリケーションは、必要なアイソクロナス帯域の正しい幅を算出して、非常に正確に割り当てなければならない。また、アプリケーションは、アイソクロナス帯域の割当、解除又は占有に関して、ＩＥＥＥ１３９４規格又は他の準拠プロトコル書に文書化された適用可能な規則に従わなければならない。
アプリケーションがＡＰＩの動作を止めるとき、ＡＰＩは、アプリケーションが以前に割り当てたあらゆるバスリソースを解除しようとはしない。これにより、アプリケーションは、ＩＥＣ ＡＶプロトコル規格において要求されるように、これらのリソースの所有を容易に放棄することができる。なお、これにより、アプリケーションは、アイソクロナスバスリソースを割り当てる及び解除するときに、準拠プロトコルに従わなければならない。
アプリケーションは、MGMTBusInfoルーチンを用いて、動作中のバスマネージャの現在のトポロジーマップ情報やスピードマップ情報、及び利用可能な他のバス情報を検索する。このルーチンは、アプリケーションが動作しているノードが動作中のバスマネージャであるか否かに関わらず、最近の情報をバスマネージャから検索する。なお、現在動作中のバスマネージャが存在しない場合、このルーチンは、機能しない。トポロジマップ及びスピードマップのフォーマット及びバスマネージャが存在する、あるいは存在しない条件については、ＩＥＥＥ１３９４規格書第８節に記載されている。
アプリケーションは、ＡＰＩを初期化した後、ASYNDataRequestルーチンを呼び出し、ＩＥＥＥ１３９４バスに非同期データ転送の要求を開始する。このルーチンによりアプリケーションは、例えばデータブロックの読出及び書込要求、クワドレットの読出及び書込要求及びロック要求等、ＩＥＥＥ１３９４規格に規定されているあらゆる非同期データ転送トランザクションを実行することができる。アプリケーションがASYNDataRequestルーチンを呼び出すと、このルーチンは、アプリケーションのバッファのアドレス空間に、６４ビットのＩＥＥＥ１３９４アドレス空間内のスタートアドレスと、データ長及びトランザクションコードが書き込まれている記述子を渡す。そして、ASYNDataRequestルーチンは、要求された動作を行うために、１つ以上のＩＥＥＥ１３９４トランザクションを生成する。ＡＰＩが要求されたデータ転送動作を完了すると、あるいは処理にエラーが発生すると、ＡＰＩは、アプリケーションにコールバックルーチンを戻すか、あるいはアプリケーションのコールバックルーチンを呼び出す。いずれの処理が行われるかは、アプリケーションがコールバックルーチンを同期的に呼び出しているか、非同期的に呼び出しているかにより決定される。
ＩＥＥＥ１３９４バスにおいてロックトランザクションを実行するために、アプリケーションはASYNDataRequestルーチンを呼び出し、引数とデータ値と処理コードを渡す。ＡＰＩは、要求されたロック処理を行うためのロックトランザクションを生成し、コールバックルーチンをアプリケーションに戻すか、あるいはアプリケーションのコールバックルーチンを呼び出す。いずれの処理が行われるかは、アプリケーションの呼出の種類、すなわち呼出が同期的か非同期的かに基づいて決定される。
アプリケーションは、ＡＰＩを初期化した後に、ＩＥＥＥ１３９４シリアルバスのチャンネルにアイソクロナスデータを送信し、ＩＥＥＥ１３９４シリアルバスのチャンネルからアイソクロナスデータを受信する。アイソクロナスデータの転送を開始する前に、アプリケーションは、ISOCHOpenルーチンを用いて、アイソクロナスポートを開設するする必要がある。アプリケーションは、このルーチンを呼び出して、アプリケーションは転送を行おうとするアイソクロナスデータのストリームの方向及び他の情報を特定する。ISOCHOpenルーチンは、必要なシステムリソースが利用可能であるか否かを判定し、その結果をアプリケーションに返す。このルーチンが問題なく完了すると、アプリケーションは、アイソクロナスデータ転送に必要な全てのシステムリソースを取得する。
アプリケーションがアイソクロナスチャンネルを介してデータの送受信を行う場合、ホストシステム内のアイソクロナスデータの供給源又は供給先は、アプリケーションに設けられ、データ構造に記述された１つ以上のデータバッファである。アプリケーションは、ISOCHAttachルーチンを呼び出して、これらのバッファをＡＰＩに渡す。このルーチンにより、アプリケーションのバッファは、アイソクロナスデータストリーム用のアプリケーションバッファが準備され、アプリケーションデータがバッファを介して送受信される。ＡＰＩのバッファ処理が完了する以前に、アプリケーションがバッファを使用する必要が生じた場合、アプリケーションは、ISOCHDetachルーチンを呼び出し、アプリケーションが使用するバッファを特定する。
アプリケーションがアイソクロナスデータの記述のために用いたバッファ記述子に規定されているＡＰＩにより、アプリケーションは、１つ以上のデータバッファ、あるいはデータバッファのリンクリストを特定することができ、これを用いてアイソクロナスデータの送受信を行うことができる。各バッファは、連続的なものでも断片的なものでもよく、及び論理的なものでも物理的なものでもよく、アプリケーションは、バッファ毎にコールバックルーチンを指定するようにしてもよい。このため、ＡＰＩは、アプリケーションに代わって非常に柔軟にバッファを管理することができ、したがってアプリケーションの要求に広く対応することができる。
アプリケーションは、アイソクロナスポートを開設し、このポートにバッファを接続して、アイソクロナスデータを制御する。この制御は、ISOCHControlルーチンを呼び出して行われる。このルーチンにより、アプリケーションは、アプリケーションのバッファにおいて送受信されるアイソクロナスデータのストリームの送受信の開始及び停止を制御できる。さらに、アプリケーションは、このルーチンを呼び出して、特定のアイソクロナスサイクル又は他のイベントに、データの送受信を開始又は停止するイベントを直ちに挿入する。アプリケーションは、アイソクロナスデータ転送を完了すると、ISOCHCloseルーチンを呼び出して、開設ポートに接続されているシステムリソースを解放する。
ActivateSonyAPIルーチン及びDeactivateSonyAPIルーチンは、システムの初期化を行い、これにより、アプリケーションは、ＡＰＩが有するＩＥＥＥ１３９４規格に準拠した特定の機能を呼び出すことができる。ActivateSonyAPIルーチンは、ＡＰＩにより提供される機能との接続を確立する。DeactivateSonyAPIルーチンは、ＡＰＩにより提供される機能との接続を切断する。起動により、妥当なactivateRecデータ構造が構築される。アプリケーションに対するＡＰＩの起動処理の一部として、アプリケーションは、指示ルーチンを提供し、ＡＰＩはこれを用いて、ＩＥＥＥ１３９４バスにおいて発生する情報、例えばバスリセットや、リモートノードからの要求指示等を呼出側に報知する。終了により、起動時に登録された全ての指示ルーチンの登録が抹消される。ＡＰＩ終了後は、ＡＰＩが再び起動されるまで、呼出側は、ＡＰＩの機能を使用できない。
以下に示す関数により、ＡＰＩを起動し、機能させることができる。
STATUS ActivateSonyAPI（ActivateReqPtr activateReq）；
このルーチンは１つのパラメータをとり、１つの状態値を返す。後述するように、avtivateReqデータ構造に呼出側が代入され、ポインタがActivateSonyAPIルーチンに渡される。このルーチンが状態値としてGOODを返すと、呼出側は、得られたactivateReqデータ構造を保存する。このデータ構造は、アプリケーションとＡＰＩの接続を示すものである。この接続を識別するために、呼出側は、次のＡＰＩの呼出において、activateReqデータ構造にポインタを渡す。これにより返される可能性のある状態値は、ＡＰＩが起動し、activeteReqデータ構造を更なる処理に使用することができることを示すGOOD、ＡＰＩが要求を受け取ったが、現在動作されていないことを示すPENDING、ＡＰＩの起動処理中に予期せぬエラーが発生し、ＡＰＩを起動できなかったことを示すUNDEFINEDERROR等である。状態値としてPENDINGが返されると、ＡＰＩはAsyncCompletionルーチンを呼び出して起動要求に対する処理を完了する。このとき、要求状態フィールドは、起動リクエストのための完了状態を格納する。
上述の１つのパラメータは、activateReqデータ構造のアドレスを示す。このデータ構造は、例えば以下の表１に示すような、ＡＰＩを起動するのに必要な情報を提供する。
0003993893.tif 000002
BusResetHandlerフィールドは、空白であるか、あるいはバスリセットイベントを受信したときに呼び出すルーチンのアドレスを格納する。ＩＥＥＥ１３９４バスにおいてバスリセットが行われる場合、ＡＰＩはBusResetHandlerルーチンを呼び出し、バスリセット情報を含むデータ構造のアドレスを渡す。IndicationHandlerフィールドが空白ではない場合、このフィールドには、ＡＰＩが受け持たない指示が発生した場合に呼び出すルーチンのアドレスが書き込まれている。ＡＰＩがリモートノードからサブアクション要求を受け取ると、ＡＰＩは、IndicationHandlerルーチンを呼び出し、要求があったデータ構造のアドレスを渡す。ＡＰＩは、起動処理の一部としてSonyAPIPrivateフィールドに書込を行う。ＡＰＩは、このフィールドの値を、次の呼出に用いる。呼出側のアプリケーションは、このフィールドの値は、呼出側のアプリケーションによっては、変更されない。AsyncCompletionフィールドは、空白であるか、あるいはＡＰＩが起動されてアプリケーションを呼び出すルーチンルーチンのアドレスが書き込まれている。なお、呼出側のアプリケーションは、要求が同期的か非同期的かに基づいて、完了ルーチンを指定する。UserPtrフィールドは、アプリケーションの完了ルーチンの呼出に使用される。このフィールドは、ＡＰＩによっては変更されない。Statusフィールドには、起動要求の状態が書き込まれている。
下記の関数により、要求されたＡＰＩの処理が終了する。
status DeactivateSonyAPI（ActivateReqPtr request）；
この関数に対して返される可能性のある状態値は、ＡＰＩが終了され、activateReqデータ構造が更なる処理に使用できなくなったことを示すGOOD、ＡＰＩが終了要求を受け取ったが、その時点ではまだ動作中であることを示すINVALIDCONNECTION又はPENDING、ＡＰＩの終了処理中に予期せぬエラーが発生し、ＡＰＩの終了処理が完了できなかったことを示すUNDEFINEDERROR等である。PENDINGが返されたときは、ＡＰＩは、AsyncCompletionルーチンを呼び出し、終了処理を完了する。このとき、要求状態フィールドには、終了要求のための完了ルーチンが格納される。
１つのパラメータは、以前にＡＰＩを起動するために用いられたactivateReqデータ構造のアドレスを示す。上述の節では、このデータ構造を定義し、そのフィールドが記述されている。なお、呼出側を終了するためには、以前に行われたＡＰＩの起動に用いたデータ構造と同じデータ構造を用いる必要がある。呼出側は、AsyncCompletionフィールドとUserPtrフィールド内の値を変更する。呼出側は、ActivateSonyAPIルーチンの呼出を行って以後、DeactivateSonyAPIルーチンの呼出を行うまでの間、activateReqデータ構造の他のフィールドに変更を加えることができない。特定のアプリケーションに対しＡＰＩを終了することに加え、このルーチンは、以前にアプリケーションがＡＰＩに渡した全ての指示バッファを解放する。アプリケーションが使用している指示バッファが存在し、同時にアプリケーションがこのルーチンを呼び出そうとすると、このルーチンはエラーを示す値をアプリケーションに返す。この場合、アプリケーションは、完了ルーチンを指定してこのルーチンを再び呼び出す。ＡＰＩがこの終了要求を完了し、アプリケーションの指示ルーチンを呼び出すと、アプリケーションの全ての指示バッファが解放される。
ＡＰＩは、非同期的に、指示ハンドリングルーチン、すなわちBusResetHandlerルーチン及びIndicationHandlerルーチンを呼び出す。これらのルーチンは、システムが利用可能機能の一部を有している。環境及び、状況に応じて、ＡＰＩは割込レベルでこれらのルーチンを呼び出す。BusResetHandlerルーチンにおいて、ハンドラは、ポインタをリセット情報に渡す。IndicationHandlerルーチンにおいては、ハンドラは、ポインタを指示情報に渡す。アプリケーションは、これら指示ルーチンのうちの１又は両方のアドレスをＡＰＩに渡し、これによりＡＰＩが起動される。なお、アプリケーションは、これらのハンドラのいずれか１を供給するようにしてもよく、両方を供給するようにしてもよく、いずれも供給しないとしてもよい。
バスリセットハンドリングルーチンを呼び出すステートメントは、下記のとおりである。
void BusResetHandler（BusResetBlockPtr busResetBlock）；
busResetBlockデータ構造は、下記の表２に示すようなバスリセットイベントを記述するデータ構造のアドレスを含んでいる。
0003993893.tif 000003
バスリセットハンドリングルーチンを提供するアプリケーションに対してＡＰＩが起動している間に、ＩＥＥＥ１３９４バスにバスリセットが発生すると、ＡＰＩは、いつでもバスリセットハンドリングルーチンを呼び出す。バスの接続あるいは切断等の物理的原因によりリセットのクラスタが発生すると、一度ハンドラが呼び出される。ハンドラは再実行されないが、連続して何度も呼び出される。バスリセットの結果、バスリセット実行時に実行中の全ての非同期データ転送トランザクションは、エラー状態で完了する。アイソクロナスデータ転送は、ＩＥＥＥ１３９４規格に基づいて再開され、バスリセットハンドラ実行中に指示を作成する。
非同期データ転送トランザクション要求指示ルーチンを呼び出すステートメントは、以下のとおりである。
void IndicationHandler（IndicationBlockPtr indicationBlockPtr）
IndicationBlockPtrデータ構造は、下記の表３に示すように、指示ブロックのアドレスを含んでいる。
0003993893.tif 000004
ＡＰＩは、ＡＰＩ自身又はＩＥＥＥ１３９４インタフェースハードウェアが機能を有していないような非同期サブアクションの要求を受け取ったとき、指示ルーチンを呼び出す。そのような各イベントに対し、ＡＰＩは各アプリケーションの指示ルーチンを呼び出し、最初のアプリケーションからＡＰＩの起動処理を開始し、指示ハンドラを供給する。各指示ハンドラは、そのハンドラがその指示をハンドリングしたか否かを示す値をＡＰＩに返す。ＡＰＩは、指示ルーチンからその指示をハンドリングしたことを示す状態を受け取った場合、その指示については、他の指示ルーチンの呼出を行わない。
幾つかの要求サブアクションは、ＡＰＩ自身がハンドリングする。これらのトランザクションについては、ＡＰＩは、指示ハンドラルーチンの呼出を行わない。ＡＰＩは、指示を発生させる全てのＩＥＥＥ１３９４トランザクション情報及び指示ハンドラルーチンに必要な追加情報を渡し、ＡＰＩにおいて、応答サブアクションが生成される。
アプリケーションは、指示ハンドラにバッファを提供する。これにより、アプリケーションは、指示バッファのデフォルトの組を拡張し、特定の要求にアプリケーションを対応させることができる。指示バッファの組を拡張することにより、ＩＥＥＥ１３９４インタフェースにビジーＡＣＫ信号を発生させることなく、より多くの特別な指示を行うことができる。なお、アプリケーションは、ＡＰＩから指示を受け取ったときに、アプリケーションに所属するバッファを必ずしも受け取らない。ＡＰＩは、必要であれば、アプリケーションの指示バッファを他のアプリケーションに渡して、指示の報告を行う。
Current Indication Buffer Count関数は、指示バッファプール内の指示バッファの総数を返す。返された値は、現在の指示バッファの数を示す。
Add Indication Buffers関数は、バッファプールにバッファを追加する。バッファの要素は、LocalBufferとして記述される。この関数の呼出側は、要求に示されたバッファの所有権をＡＰＩに譲り、バッファの配列を行う前の所有権を再び獲得しなくてはならない。
0003993893.tif 000005
このAdd Indication Buffers関数に返される可能性のある値は、ＡＰＩが要求を受け取り、後に要求を完了するであろうことを示すGOOD、ＡＰＩが要求を受け取ったことを示すINVALIDCONNECTION,PENDING、このプラットフォームには、バッファを追加できないことを示すUNSUPPORTEDOP、データ転送動作を行っている最中に予期せぬエラーが発生したことを示すUNDEFINEDERROR等である。この値が返されると、ＡＰＩは、AsyncCompletionルーチンを呼び出し、要求された動作が完了される。このとき、BufMgmtBlockの状態フィールドは、要求に対する完了状態を格納する。
AddIndBuffers関数の第１のパラメータは、有効なActivateReqデータ構造のアドレスを示す。第２のパラメータは、BufMgmtBlockデータ構造のアドレスを示す。このデータ構造は、以下の表４に示すように、バッファを記述する。
0003993893.tif 000006
APIprivateフィールドは、要求を管理するためのプライベートデータを有する。LocalBufferPtrフィールドは、与えられるバッファの記述子を有している。これらのバッファは、如何なる容量のものでもよい。ＡＰＩは、ＡＰＩ自身の判断に基づいて、与えられたバッファの全てを使用してもよく、一部を使用してもよく、全く使用しなくてもよい。AsyncCompletionフィールドが空白ではない場合、このフィールドには処理を完了するために呼び出すルーチンのアドレスを格納している。UserPtrフィールドは、完了ルーチンの呼出に使用される。このフィールドは、ＡＰＩによっては変更されない。Statusフィールドは、要求されたデータ転送動作の状態を有する。Statusフィールドは、非同期処理が完了するまで、保留（pending）状態を格納する。完了ルーチンが呼び出されると、Statusフィールドは、完了状態を格納する。
Release Indication Buffers関数は、以前に追加された追加されたバッファを呼出側に返す。バッファの要素は、LocalBufferとして記述される。この関数の呼出側は、AddIndBuffers関数要求により追加されたバッファのサブセットを特定する。要求されたバッファが全て解放されると、完了ルーチンが呼び出される。
0003993893.tif 000007
RelIndBuffers関数に対して返される可能性のある状態値は、ＡＰＩが要求を受け取り、後に要求を完了するであろうことを示すPENDING、このプラットフォームには、バッファを追加できないことを示すINVALIDCONNECTION,UNSUPPORTEDOP、要求に応じた処理を行っている最中に予期せぬエラーが発生したことを示すUNDEFINEDERROR等である。
Release Indication Bufferの第１のパラメータは、有効なactivateReqデータ構造のアドレスを示す。第２のパラメータは、BufMgmtBlockデータ構造のアドレスを示す。このデータ構造は、上述のとおり、バッファを記述する。アプリケーションがＡＰＩにバッファを解放するように要求するとき、最初にＡＰＩにバッファが与えられたときと同じ記述を用いなくてはならない。
Bus Managementルーチンは、ＩＥＥＥ１３９４バス管理動作を実行する。この機能には、アイソクロナスバスリソースの割当及び解除、及びＩＥＥＥ１３９４バスの位相又は環境に関する情報の読込等の処理が含まれる。
MGMTAllocateChannelルーチンは、ＩＥＥＥ１３９４規格書第８節に規定されているプロトコルを用い、単一のアイソクロナスチャンネル番号を割り当てる。MGMTAllocateChannelルーチンを呼び出すステートメントは以下のとおりである。
0003993893.tif 000008
MGMTAllocateChannelルーチンに返される可能性のある状態値は、チャンネルが無事に割り当てられたことを示すGOOD、コンテクストパラメータが現在動作中のＡＰＩへの接続点のアドレスを含んでいないことを示すINVALIDCONNECTION、ＡＰＩが要求を受け取っていることを示すPENDING、要求されたチャンネル番号が現在使用不可能であることを示すCHUNAVAILABLE、予期せぬエラーが発生したことを示すUNDEFINEDERROR等である。PENDINGが返されたときは、ＡＰＩは、MGMTCompletionルーチンを呼び出し、割当要求処理が完了され、このとき状態フィールドは、この要求の状態を格納する。
MGMTAllocateChannelルーチンの第１の呼出パラメータは、動作中のActivateReqデータ構造のアドレスである。第２のパラメータは、下記の表５に示すように、データ構造のアドレスを示す。
0003993893.tif 000009
チャンネルフィールドには、割り当てられるチャンネル番号が書き込まれる。チャンネル番号が０から６３の範囲である場合、ルーチンは、特定のチャンネル番号の割当を行う。チャンネルフィールドに全ての番号が格納されている場合、ルーチンは、割り当てる番号を自ら選択する。チャンネル番号がそれ以外の値である場合、ルーチンは、chAvailableフィールドを埋め、chUnavailable状態を返す。これにより、現在アイソクロナスリソースマネージャ（Isochronous Resource Manager）から取得できるチャンネル番号が確認される。allocatedChフィールドは、このルーチンを呼び出した結果として実際に割り当てられるチャンネル番号か、チャンネルの割当が行われていない場合には、全ての番号を格納している。chAvailableフィールドは、アイソクロナスリソースマネージャのchannels_CSRの現在の値が格納される。なお、このCSRの値は、随時変化し、したがって、このフィールドの値も一時的なものであり、続いて行われる呼出によって変更されることもある。MGMTCompletionフィールドがNULLではない場合、このフィールドには、完了のために呼び出されるルーチンのアドレスが格納されている。UserPtrフィールドは、アプリケーションの完了ルーチンに用いられる。このフィールドは、ＡＰＩによっては変更されない。Statusフィールドは、この呼出のための完了状態を格納している。アプリケーションがこのルーチンを非同期的に呼び出すと、このフィールドには、完了ルーチンが呼び出されるまでの間、PENDING状態が格納される。
MGMTAllocateBandwidthルーチンは、ＩＥＥＥ１３９４規格書第８節に規定されているプロトコルを用い、アイソクロナス帯域の割当を行う。MGMTAllocateBandwidthルーチンを呼び出すステートメントは、以下のとおりである。
0003993893.tif 000010
MGMTAllocateBandwidthルーチンに返される可能性のある状態値は、帯域が無事に割り当てられたことを示すGOOD、コンテクストパラメータが現在動作中のＡＰＩとの接続点のアドレスを格納していないことを示すINVALIDCONNECTION、要求された帯域が現在使用不可能であることを示すBWUNAVAILABLEは、予期せぬエラーが発生したことを示すUNDEFINEDERROR等である。PENDINGが値として返された場合、ＡＰＩは、MGMTCompletionルーチンを呼び出し、割当要求処理を完了し、このとき状態フィールドにはこの要求の完了状態が格納される。
MGMTAllocateBandwidthルーチンの第１の呼出パラメータは、動作中のActivateReqデータ構造のアドレスを示す。第２のパラメータは、下記の表６に示すように、データ構造のアドレスを示す。
0003993893.tif 000011
bandwidthフィールドは、割り当てられる帯域を示す値を格納する。この値が全ての帯域を示している場合、ルーチンは、bwAvailableを埋め、BWUNAVAILABLEの値を返す。なお、これにより、現在動作中のアイソクロナスリソースマネージャからbwavailableの現在の値を知ることができる。bwAvailableフィールドは、アイソクロナスリソースマネージャのbandwidth/availabel CSRの現在の値を格納している。なお、このCSRの値は、随時変化し、したがって、このフィールドの値も一時的なものであり、次の呼出によって変更されることもある。MGMTCompletionフィールドの値が空白（NULL）ではない場合、このフィールドには、完了のために呼び出されるルーチンのアドレスが格納されている。UserPtrフィールドは、アプリケーションの完了ルーチンに用いられる。このフィールドは、ＡＰＩによっては、変更されない。Statusフィールドは、この呼出の完了状態を格納する。アプリケーションがこのルーチンを非同期的に呼び出すと、このフィールドは、完了ルーチンが呼び出されるまでの間、PENDING状態を格納する。
MGMTDeAllocateChannelルーチンは、ＩＥＥＥ１３９４規格の第８節に規定されているプロトコルを用い、アイソクロナスチャンネルの割当の解除を行う。MGMTDeAllocateChannelルーチンを呼び出すステートメントは以下のとおりである。
0003993893.tif 000012
このルーチンは、２つのパラメータを有し、状態値を返す。返される可能性のある状態値は、チャンネルの割当が無事に解除されたことを示すGOOD、コンテクストパラメータが現在動作中のＡＰＩとの接続点のアドレスを有していないことを示すINVALIDCONNECTION、ＡＰＩが要求を受け取ったことを示すPENDING、要求されたチャンネル番号は、割り当てられていないことを示すCHUNAVAILABLE、予期せぬエラーが発生したことを示すUNDEFINEDERROR等である。状態値としてPENDINGが返された場合、ＡＰＩは、MGMTCompletionルーチンを呼び出し、割当要求処理を完了し、そのときstatusフィールドは、この要求の完了状態を格納する。
MGMTAllocateChannelルーチンの第１のパラメータは、動作中のActivateReqデータ構造のアドレスを示す。第２のパラメータは、MGMTAllocateChBlockデータ構造のアドレスを示す。このルーチンは、データ構造のチャンネルフィールドに特定されたチャンネルの割当の解除を行い、chAvailableフィールドに、現在動作中のアイソクロナスリソースマネージャから取得されるchannels_availableの値を埋め込む。
MGMTDeAllocateBandwidthルーチンは、ＩＥＥＥ１３９４規格の第８節に規定されているプロトコルを用い、アイソクロナス帯域の割当の解除を行う。MGMTDeAllocateBandwidthルーチンを呼び出すステートメントは、以下のとおりである。
0003993893.tif 000013
このルーチンは、２つのパラメータを有し、状態値を返す。返される可能性のある値は、帯域の割当が無事に解除されたことを示すGOOD、コンテクストパラメータが現在動作中のＡＰＩとの接続手点のアドレスを有していないことを示すINVALIABLECONNECTION、ＡＰＩが要求を受け取ったことを示すPENDING、この要求を完了することにより、アイソクロナスリソースマネージャのbandwidth_availableレジスタの値が不適切なものとなるため、要求は遂行されなかったことを示すBWUNAVAILABLE、予期せぬエラーが発生したことを示すUNDEFINEDERROR等である。状態値としてPENDINGが返された場合、ＡＰＩは、MGMTCompletionルーチンを呼び出し、割当要求処理を完了し、このときstatusフィールドは、この要求の完了状態を格納する。
MGMTAllocateBandwidthルーチンの第１のパラメータは、動作中のActivateReqデータ構造のアドレスを示す。第２のパラメータは、MGMTAllocateBWBlockデータ構造のアドレスを示す。このルーチンは、bandwidthフィールドに格納されている帯域の割当を解除し、bwAvailableフィールドに、現在動作中のアイソクロナスリソースマネージャから取得されるbandwidth_availableレジスタの値を埋め込む。
MGMTBusInfoルーチンは、ＩＥＥＥ１３９４バスに接続され、アプリケーションが実行されているノードに関する情報を返す。この情報には、ＩＥＥＥ１３９４規格に規定されているとおり、ＰＨＹギャップカウントの現在の設定、ＩＥＥＥ１３９４バスに接続されているノードの数、バスのトポロジマップのポインタ、及びバスのスピードマップのポインタ等を含む。
ASYNDataRequestルーチンは、ＩＥＥＥ１３９４非同期読出又は書込トランザクションを生成し、これによりアプリケーションのデータバッファと６４ビットのＩＥＥＥ１３９４アドレス空間内の連続的なアドレスとの間でデータ転送が行われる。ASYNDataRequestルーチンを呼び出すステートメントは、以下のとおりである。
0003993893.tif 000014
ASYNDataRequestルーチンに返される可能性のある状態値は、ＡＰＩが無事にデータ転送要求を遂行したことを示すGOOD、ＡＰＩが要求を受け取り、以後に要求を遂行するであろうことを示すPENDING、flags.opCodeフィールドに未知のコードが格納されていることを示すINVALIDOPCODE、activateReqPtrフィールドが動作中の接続点を示していないことを示すINVALIDCONNECTION、ある程度データの転送を行ったが、この要求の遂行の途中に予期せぬエラーが発生したことを示すUNDEFINEDERROR等である。
ASYNDataRequestルーチンの第１のパラメータは、有効なactivateReqデータ構造のアドレスを示す。第２のパラメータは、asyncTransportデータ構造のアドレスを示す。このデータ構造は、例えば下記の表７に示すように、要求されたデータ転送動作を記述する。
0003993893.tif 000015
0003993893.tif 000016
ASYdataフィールドは、要求の管理に用いるプライベートデータを格納する。OpCodeフィールドは、要求された動作を記述するコードを格納し、このコードは、asyncOpCodeコード表で定義されているもののうちの１つである。NonIncrフィールドは、１に設定すると、remoteBufPtrフィールド内の同じＩＥＥＥ１３９４アドレスに全てのデータを転送するようにルーチンに指示し、０に設定すると、remoteBufPtrフィールド内のアドレスから広範囲にわたるＩＥＥＥ１３９４アドレスにデータを転送するようにルーチンに指示する。BlockSizeフィールドには、ブロック読出又は書込サブアクションに用いるブロックの最大のデータ量がバイト単位で示されている。０の値は、選択されたバススピードにおける要求サイズの最大値を用いることを示す。APPLBufPtrフィールドは、アプリケーションのデータバッファの記述子を格納している。RemoteBufPtrは、ＩＥＥＥ１３９４リモートノードのデータバッファのリモートアドレスを格納している。Lengthフィールドは、転送されるバイト数を示し、これは、アプリケーションのデータバッファのバッファ長と同等あるいはそれ以下とされる。AsyncCompletionフィールドは、空白であるか、あるいはデータ転送の完了に用いるルーチンのアドレスを格納する。UserPtrフィールドは、アプリケーションの完了ルーチンの呼出に用いられ、ＡＰＩによっては、変更されない。Statusフィールドは、要求されたデータ転送動作の状態を格納する。このフィールドは、非同期処理が完了するまで、PENDING状態を格納する。完了ルーチンが呼び出されると、このフィールドは完了状態を格納する。
ASYNLockRequestルーチンは、ＩＥＥＥ１３９４バスをロックするロックトランザクションを生成する。このASYNLockRequestルーチンのステートメントは、下記とおりである。
0003993893.tif 000017
ASYNLockRequestルーチンに返される値は、ＡＰＩがロックトランザクションを無事に完了し、その結果がAsyncLockBlockに格納されたことを示すGOOD、ＡＰＩが要求を受け取り、その要求を以後に遂行するであろうことを示すPENDING、AsyncLockBlockデータ構造のOpCodeフィールドに未知のコードが存在することを示すINVALIDOPCODE、activateReqPtrが動作中の接続点を示していないことを示すINVALIDCONNECTION、幾らかのデータ転送を行ったが、要求された動作中に予期せぬエラーが発生したことを示すUNDEFINEDERROR等である。
ASYNLockRequestルーチンの第１のパラメータは、有効なactivateReqデータ構造のアドレスを示す。第２のパラメータは、AsyncLockBlockデータ構造のアドレスを示す。このデータ構造は、下記の表８に示すように、要求されたデータ転送を記述する。
0003993893.tif 000018
APIPrivateフィールドは、要求を管理するためのプライベートデータを格納する。OpCodeフィールドは、要求された動作のコードを格納し、このコードは、asyncOpCodesコード表に規定されている値の内の１つである。ArgData structフィールドは、このロックトランザクションの引数及びデータを格納する。AsyncCompletionフィールドは、６４ビットで示される送り先のアドレスを格納する。AsyncCompletionフィールドは、空白であるか、あるいはロックトランザクションを完了するためのルーチンのアドレスを格納する。UserPtrフィールドは、アプリケーションの完了ルーチンの呼出に用いられ、ＡＰＩによっては変更されない。Statusフィールドは、要求されたデータ転送動作の状態を格納する。非同期処理が完了するまでの間、このフィールドには、PENDING状態が格納される。完了ルーチンが呼び出されると、このフィールドは完了状態を格納する。
アイソクロナスリソース管理ルーチンは、ＩＥＥＥ１３９４インタフェースとアプリケーションデータバッファとの間で送受信されるアイソクロナスデータの転送に必要なリソースの割当及びその解除を行う。割当及び解除を行う際、システム内で競合する可能性のあるアイソクロナスデータアプリケーションの衝突を避ける必要がある。ＩＥＥＥ１３９４バスを介してアイソクロナスデータの転送を行う場合は、必要なバスリソースのエンティティ、すなわちチャンネル番号及び帯域がＩＥＥＥ１３９４バス上に必ず存在する。アイソクロナスデータを使用する各アプリケーションは、いつ、何によって割当及び解除が行われるかを規定する１組の規則を有している。ＡＰＩのバス管理ルーチンにより、アプリケーションは、ＩＥＥＥ１３９４規格に則ってこれらのリソースの割当を行うことができる。なお、ここでいうルーチンは、ＩＥＥＥ１３９４バスリソースに割り当てられるわけではなく、アプリケーションバッファとアイソクロナスデータを送受信するのに必要なシステムレベルのリソースにのみ割り当てられる。これらのリソースには、DMAチャンネル及びそれを維持するリソース、例えば下のレベルの割込ハンドラやディスパッチャ等が含まれる。
ISOCHOpenルーチンは、アイソクロナスポートを開設及び初期化する。アイソクロナスポートは、ＡＰＩのアプリケーション及びＡＰＩが動作するローカルノードのハードウェア及びソフトウェアの複数のリソースを組み合わせたものである。この１組のリソースは、ローカルノードにおいて送受信されるアイソクロナスデータの単一のストリームの転送に必要とされるもの全てを当該ノードに構成する。また、ＩＥＥＥ１３９４規格書第８節の規定に従い、及びアプリケーションの規約及び要求に従い、この１組のリソースには、アプリケーションが別個に割り当てる必要のあるＩＥＥＥ１３９４バスリソースは、含まれていない。ＡＰＩにＩＥＥＥ１３９４バスリソースの割当及び解除を行わせるルーチンについては、上述のとおりである。
ポート開設ルーチンのステートメントは、以下のとおりである。
0003993893.tif 000019
ポート開設ルーチンの第１のパラメータは、有効なactivateReqデータ構造のアドレスを示す。第２のパラメータは、ISOCHOpenBlockデータ構造のアドレスを示す。このルーチンが無事に完了すると、アプリケーションは、以後この開設されたポートに関わる呼出を行う際に、このアイソクロナスポートを参照するためにISOCHOpenBlockデータ構造を使用する。ポート開設ルーチンによって返される可能性のある値は、ポート開設処理が無事に完了したことを示すGOOD、ＡＰＩが要求を受け取り、以後に処理が行われるであろうことを示すPENDING、アイソクロナスポート又は他の必要なリソースが現在利用不可能であり、そのため要求が拒否されたことを示すNONRESOURCES、要求されたバススピードがサポートされていないことを示すINVALIDREQUEST、ActivateReqPtrフィールドが示すＡＰＩ接続が動作中でないことを示すINVALIDCONNECTION、要求された動作が完了できなかったが、発生したエラーの原因が不明であることを示すUNDEFINEDERROR等である。
ポート開設ルーチンの呼出パラメータは、ISOCHOpenBlockデータ構造のアドレスを示す。このデータ構造は、下記表９に示すように、要求を記述する。
0003993893.tif 000020
directionフィールドは、アイソクロナスデータ転送の転送方向を示す。AsyncCompletionフィールドは、空白であるか、あるいは完了のために呼び出されるルーチンのアドレスを格納している。UserPtrフィールドは、アプリケーションの完了ルーチンの呼出に用いられ、ＡＰＩによっては変更されない。Statusフィールドは、要求されたデータ転送動作の状態を格納する。非同期データ転送動作が完了するまでは、このフィールドにはPENDINGが格納される。完了ルーチンが呼び出されると、このフィールドは完了状態を格納する。アプリケーションがアイソクロナスポートを用いた処理を終わると、アプリケーションは、isochPortPtrをISOCHCloseルーチンに渡す。
ISOCHCloseルーチンは、以前にISOCHOpenルーチンにより開設されたポートを閉鎖する。このルーチンは、下記のようなステートメントを有する。
0003993893.tif 000021
このルーチンは１つのパラメータをとり、１つの状態値を返す。このルーチンは非同期的に実行され、完了時にISOCHOpenBlockに規定されている完了ルーチンを呼び出す。返される可能性のある状態値は、処理が無事に完了したことを示すGOOD、ＡＰＩが要求を受け取り、追って処理が実行されるであろうことを示すPENDING、connectionPtrが示すＡＰＩ接続が動作中でない、又は、openBlockが現在開設されているアイソクロナスポートを示していないことを示すINVALIDCONNECTION、予期せぬエラーが発生したため要求された動作を完了できなかったことを示すUNDEFINEDERROR等である。
ISOCHCloseルーチンの第１の呼出パラメータは、有効なactivateReqデータ構造のアドレスを示す。第２のパラメータは、ISOCHOpenルーチンに用いられるISOCHOpenBlockのアドレスを示す。
アイソクロナスデータ制御ルーチンは、アプリケーションのデータバッファに出入りするアイソクロナスデータのストリームを制御する。アプリケーションがアイソクロナスデータを受信する側である場合、これらの制御ルーチンは、アプリケーションに受信されるアイソクロナスデータの流れのみに影響し、ＩＥＥＥ１３９４バス自身に存在するアイソクロナスデータには影響を及ぼさない。アプリケーションがアプリケーションデータバッファからデータを送信する場合、これらの制御は、ＩＥＥＥ１３９４バス上のデータにも影響を及ぼす。
ISOCHControlルーチンのステートメントは、以下のとおりである。
0003993893.tif 000022
ISOCHControlルーチンに返される可能性のある状態値は、処理が無事に完了したことを示すGOOD、openBlockフィールドが動作中のアイソクロナスポートを示していないことを示すINVALIDCONNECTION、処理が現在保留されていることを示すPENDING、ISOCHControleBlockのopCodeフィールドの値が適切でないことを示すINVALIDOPCODE、ＩＥＥＥ１３９４インタフェースハードウェアの制約又はソフトウェアの制約、又は環境の制約により、処理がサポートされていないことを示すUNSUPPORTEDOP、予期せぬエラーの発生により処理が実行できないことを示すUNDEFINEDERROR等である。コールバックルーチンを呼び出したとき、状態値としてPENDINGが返された場合、ISOCHCOntroleBlockの状態フィールドが制御要求の完了ステイタスを格納する。
ISOCHControlルーチンは、有効なISOCHOpenBlockデータ構造のアドレスを示す。第２のパラメータはISOCHCtlBlockデータ構造のアドレスを示す。このデータ構造は、表１０に示すように、要求された制御処理を記述する。
0003993893.tif 000023
APIPrivateフィールドは、この要求を管理するためにＡＰＩに用いられるプライベートメモリを有する。IsoOPCodeは、要求された制御処理を記述するIsoOpCodeコード表から得られる値を格納する。IsoEventフィールドは、要求された動作を実行するトリガとなるトリガイベントを特定する。IsoEventフィールドが「SYFIELD」を値として格納している場合、Syフィールドがアイソクロナスチャンネルにおける処理の開始又は終了をトリガする値を格納する。IsoOpCodeフィールドの値が「START」である場合、Tagフィールドの値がアイソクロナスデータブロックのパケットのヘッダのタグ値として用いられる。同じく、IsoOpCodeフィールドの値が「START」である場合、Channelフィールドの値がアイソクロナスデータブロックのパケットのヘッダのチャンネル値として用いられる。IsoEventフィールドの値が「TIME」である場合、Timeフィールドは、要求された動作が開始された時刻を格納する。AsyncCompletionフィールドは、空白であるか、あるいはデータ転送の完了に用いられるルーチンのアドレスを格納している。UserPtrフィールドは、アプリケーションの完了ルーチンの呼出に用いられる。このフィールドは、ＡＰＩによっては、変更されない。Statusフィールドは、要求されたデータ転送動作の状態を格納する。非同期データ転送動作が完了するまでは、このフィールドは「pending」を格納する。完了ルーチンが呼び出されると、このフィールドは完了状態を格納する。
アイソクロナス添付ルーチンは、ＡＰＩソフトウェアにアプリケーションデータバッファの記述子を渡す。ＩＥＥＥ１３９４インタフェースハードウェア及び関連するさらに下層のソフトウェアがバッファを利用できるようにするために、アプリケーションは、このルーチンをいつでも呼び出すことができる。このルーチンのステートメントは以下のとおりである。
0003993893.tif 000024
アイソクロナス添付ルーチンに返される状態値は、処理が完了し、アプリケーションデータバッファが受け取られたことを示すGOOD、openBlockフィールドが動作中のアイソクロナスポートを指定していないことを示すINVALIDCONNECTION、ハードウェア環境、ソフトウェア環境又は他のシステム環境の制約により、バッファ記述子に特定されている再同期イベントがサポートされていないことを示すUNSUPPORTEDOP、アプリケーションのバッファの循環リンクリストの引き渡しの処理を行おうとしたとき、アイソクロナスデータ転送動作中であった、又は、既存の循環リンクリストに新たなバッファを追加しようとしたとき、アイソクロナスデータ転送動作中であったことを示すINVALIDREQUEST、予期せぬエラーの発生により処理が完了できなかったことを示すUNDEFINEDERROR等である。
ISOCHAttachルーチンの第１のパラメータは、有効なISOCHOpenBlockデータ構造のアドレスを示す。第２のパラメータは、ISOCHAppendBlockデータ構造のアドレスを示す。このデータ構造は、表１１に示すように、アプリケーションデータバッファのリンクリストを記述する。
0003993893.tif 000025
APIPrivateフィールドは、要求を管理するためにＡＰＩに用いられるプライベートストレージを格納する。IsochBuffListフィールドは、特定のポートに付与されたリンクリストの第１のアイソクロナスバッファのアドレスを格納する。現在のバッファリスト又は付与されるバッファリストが循環的である場合、付与処理は、ポートにおける処理が停止してから実行され、付与処理は、以前に付与されたバッファの置き換えも行うことができる。既存のバッファリストが循環的でない場合、バッファの追加は、いつでも行うことができる。AsyncCompletionフィールドは、空白であるか、あるいは完了のために呼び出されるルーチンのアドレスを格納している。UserPtrフィールドは、アプリケーションの完了ルーチンの呼出に用いられ、ＡＰＩによっては変更されない。Statusフィールドは、要求された動作の状態を格納する。非同期処理が完了するまでの間、このフィールドは「PENDING」を格納する。完了ルーチンが呼び出されると、このフィールドは、完了状態を格納する。
IsochBuffListフィールドは、isochBufferのアドレスを格納する。isochBufferデータ構造は、１つのデータバッファを記述する。isochBufferデータ構造は、二重のリンクリストに存在する。表１２は、このデータ構造を示す。
0003993893.tif 000026
Nextフィールドは、リンクリスト中の次のバッファのアドレスを格納する。Previousフィールドは、リンクリスト中の前のバッファのアドレスを格納する。Circularフィールドは、バッファの組が循環構造を有しているか否かを示す値を格納する。ResynchEventフィールドは、再同期イベントを任意に格納する。このフィールドの値が「IMMEDIATE」であるとき、再同期は行われない。ResyncEventフィールドの値が「SYFIELD」であるとき、Syフィールドは、このアプリケーションデータバッファへの、あるいはアプリケーションデータバッファからのデータ転送を休止させる。ResyncEventフィールドに格納される値が「TIME」の場合、Timeフィールドは、アプリケーションデータバッファにおいて送受信されるデータの転送の待ち時間を格納する。ApplBufPtrフィールドは、アプリケーションデータバッファのアドレスを格納する。このアドレスは、論理的アドレスでも物理的アドレスでもよく、離散的でも連続的でもよく、これらは、動作環境の能力に応じて決定される。IsochCompletionフィールドは、完了ルーチンのアドレスを格納する。このフィールドが空白ではない場合、バッファへのデータ転送が完了すると、完了ルーチンが呼び出される。UserPtrフィールドは、アプリケーションの完了ルーチンに使用され、このフィールドは、ＡＰＩによっては変更されない。
ISOCHDetachルーチンは、アプリケーションデータバッファをＡＰＩから解放してアプリケーションに返却する。アプリケーションは、ＩＥＥＥ１３９４インタフェースハードウェア及び関連する下層のソフトウェアからバッファを解放するために、いつでもこのルーチンを呼び出すことができる。要求されたバッファは、完了ルーチンが呼び出されたときに解放される。このルーチンの呼出のステートメントは、以下のとおりである。
0003993893.tif 000027
ISOCHDetachルーチンに返される状態値は、処理が完了し、バッファが解放されたことを示すGOOD、処理が保留中であることを示すPENDING、openBlockフィールドが動作中のアイソクロナスポートを指示していないことを示すINVALIDCONECTION、ISOCHAppendBlockに記述されているバッファが見つからない、又はISOCHOpenBlock構造に記述されているアイソクロナスポートがそれらのバッファを使用する権利を有していないことを示すINVALIDREQUEST、予期せぬエラーが発生したため、処理が終了できなかったことを示すUNDEFINEDERROR等である。コールバックルーチンが呼び出されたとき、PENDINGが返された場合、ISOCHAppendBlockの状態フィールドは、解放処理の完了状態を格納する。
ISOCHDetachルーチンの第１のパラメータは、有効なISOCHOpenBlockデータ構造のアドレスを示す。第２のパラメータは、ISOCHAppendBlockデータ構造のアドレスを示す。このデータ構造は、上述したように、アプリケーションデータバッファリストを記述する。
本発明に係るアプリケーションプログラミングインタフェースは、アプリケーションにインタフェースを提供し、これによりアプリケーションがバスを介して行うデータ転送は、同期式にも非同期式にも対応できる。このアプリケーションプログラミングインタフェースは、アイソクロナスデータ転送動作中に、バス２８を介して行われる非同期データ転送にも対応する。バス２８を介してアイソクロナスデータが転送されている間、非同期データでギャップを埋めることができる。ＩＥＥＥ１３９４では、アイソクロナスデータにおける最悪のジッタが特定されており、これに基づいてアイソクロナスデータのパケットの最大待ち時間が定められている。したがって、ＡＰＩ２０によれば、アイソクロナスデータは、適切な周期で、確実に転送される。さらに、アイソクロナスデータのパケット間に生じるギャップに非同期データパケットを挿入して転送することができる。
本発明に係るＡＰＩは、従来のシステムを改善し、メモリマッピングされたバス２８を介して非同期データ転送を行うのに必要なトランザクションを自動的に生成する自動トランザクション発生器３８を用いることにより、非同期データ転送を自動化することができる。アイソクロナスデータ転送動作中に、各バッファに対応するバッファ記述子のリンクリストは、維持され、アプリケーションとバス２８間のデータの送受信に使用される。各バッファには、コールバックルーチンや再同期イベントを格納することもできる。
本発明の原理、構造、動作が容易に理解されるように、本発明の実施の形態を、特定の用語を用いて詳細に説明した。上述の特定の実施の形態の説明で用いた具体例及びその詳細により、特許請求の範囲を限定してはならない。本発明の趣旨を逸脱することなく、実施の形態を様々に変更できることは、当業者には明らかである。
【図１】
0003993893.tif 000028
【図２】
0003993893.tif 000029
【図３】
0003993893.tif 000030
【図４】
0003993893.tif 000031
【図５】
0003993893.tif 000032
【図６】
0003993893.tif 000033