(57)【要約】  本発明は、外部デバイスに接続される電子機器において、電子機器のＯＳに依存する、外部デバイスへ制御信号を入力するためのデバイスドライバ等を外部デバイス毎に用意することを不要とすることを目的とする。  本発明に係る外部デバイス１０は、ＰＣ２０に接続されてＰＣ２０から制御を受け、外部デバイスの種類を特定するＩＤを、自身のＩＤとして記憶したインターフェース部１２と、インターフェース部１２に記憶されているＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身で実行される実行用機能と、を対応付けて記憶しておく機能記憶部１３と、機能を実行させる制御信号をＰＣ２０から受け付けて、機能記憶部１３に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を機能部１１に実行させる制御部１４とを備える。
2007088967.tif 000002
【特許請求の範囲】
【請求項１】
電子機器に接続されて当該電子機器から制御を受ける外部デバイスであって、
外部デバイスの種類を特定するＩＤを、自身のＩＤとして記憶したＩＤ記憶手段と、
前記ＩＤ記憶手段に記憶されているＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身で実行される実行用機能と、を対応付けて記憶しておく機能記憶手段と、
機能を実行させる制御信号を前記電子機器から受け付けて、前記機能記憶手段に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を実行させる制御手段と、
を備える外部デバイス。
【請求項２】
前記ＩＤ記憶手段に記憶されているＩＤは、前記電子機器において予め制御を行うためのデバイスドライバが規定されている外部デバイスの種類を特定するＩＤであることを特徴とする請求項１に記載の外部デバイス。
【請求項３】
前記ＩＤ記憶手段に記憶されているＩＤは、ブロック型デバイスである外部デバイスの種類を特定するＩＤであることを特徴とする請求項１又は２に記載の外部デバイス。
【請求項４】
電子機器と、当該電子機器に接続されて当該電子機器から制御を受ける外部デバイスとを含んで構成される電子機器システムであって、
前記外部デバイスは、
外部デバイスの種類を特定するＩＤを、自身のＩＤとして記憶したＩＤ記憶手段と、
前記ＩＤ記憶手段に記憶されているＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身で実行される実行用機能と、を対応付けて記憶しておく機能記憶手段と、
前記電子機器から機能を実行させる制御信号を受け付けて、前記機能記憶手段に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を動作させる制御手段と、
を備える電子機器システム。
【請求項５】
電子機器に接続されて当該電子機器から制御を受けると共に、外部デバイスの種類を特定するＩＤを、自身のＩＤとして記憶したＩＤ記憶手段と、前記ＩＤ記憶手段に記憶されているＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身で実行される実行用機能と、を対応付けて記憶しておく機能記憶手段と、を備える外部デバイスにおける制御方法であって、
前記電子機器から機能を実行させる制御信号を受け付けて、前記機能記憶手段に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を動作させる制御ステップを含む制御方法。
【請求項６】
前記ＩＤ記憶手段に記憶されているＩＤは、前記電子機器において予め制御を行うためのデバイスドライバが規定されている外部デバイスを特定するＩＤであることを特徴とする請求項５に記載の制御方法。
【請求項７】
前記ＩＤ記憶手段に記憶されているＩＤは、ブロック型デバイスである外部デバイスを特定するＩＤであることを特徴とする請求項５又は６に記載の制御方法。
【請求項８】
電子機器と、当該電子機器に接続されて当該電子機器から制御を受けると共に、外部デバイスの種類を特定するＩＤを、自身のＩＤとして記憶したＩＤ記憶手段と、前記ＩＤ記憶手段に記憶されているＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身で実行される実行用機能と、を対応付けて記憶しておく機能記憶手段と、を備える外部デバイスにおける制御方法であって、
前記外部デバイスが、前記電子機器から機能を実行させる制御信号を受け付けて、前記機能記憶手段に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を動作させる制御ステップを含む制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、電子機器に接続されて当該電子機器から制御を受ける外部デバイス、当該外部デバイスを含む電子機器システム、並びに当該外部デバイス及び電子機器システムにおける制御方法に関する。また、本発明は、計測機器やアクチュエータなどのコントロール機能とデータ転送機能とを具える機器をUSB（Universal Serial Bus）経由で接続しながら、USB情報を知らない場合においてもオープンな規格に準拠して、上記機器などのデバイスを制御するための新規な方法及び装置に関する。
【背景技術】
【０００２】
コンピュータシステム等の電子機器に必要な機能の一つは、外部デバイスとの接続機能である。一昔前はシリアル(EIA-232)接続が主流であった。この規格はモデムとPC（Personal Computer）を接続するために制定されたものであり、リモート・ホストとのキャラクタ・ベースのデータ通信に最適化されている。汎用性が高く直感的に理解しやすいため、簡単に制御ソフトウェアを書くことができる。外部デバイスをPCから制御するという用途では多くの場合これで十分であるが、転送速度が低いため、高い応答性が必要だったり大量のデータを高速にやりとりするという用途には不向きである。
【発明の開示】
【発明が解決しようとする課題】
【０００３】
一方、USBは制御にも高速データ転送にも適した規格であるが、一部の規格化された機能以外に対しては、外部デバイス毎にOS（Operating System）に依存した専用のデバイスドライバを用意する必要があり、開発に負担がかかるというペナルティがある。【０００４】
即ち、ＵＳＢ等の規格は、接続される外部デバイスの制御形式にまで立ち入った内容となっており、ＰＣ等の電子機器側においてカーネルモードで動作するＯＳに依存したドライバを必要とする。外部デバイスの設計者は、接続バス規格に精通すると共に、ＰＣ等の電子機器側における各種ＯＳと接続バスのホストドライバに特有のドライバ設計技術にも習熟しなければならない。これは設計者の負担増だけでなく、必要なソフトウェア部品の増加により必要なデバッグ量の増加、システム全体の安定性の低下をもたらす原因となっている。【０００５】
本発明は、以上の問題点を解決するためになされたものであり、外部デバイスに接続される電子機器において、電子機器のＯＳに依存する、外部デバイスへ制御信号を入力するためのデバイスドライバ等を外部デバイス毎に用意することを不要とする外部デバイス、電子機器システム及び制御方法を提供することを目的とする。【０００６】
本願においては、計測機器やアクチュエータなどコントロール機能とデータ転送機能をもつ機器をUSB経由で接続しながら、USB固有の情報を知らなくてもオープンな規格に準拠した方法でプログラムできるようにするための手法として、USB Mass Storage Classへの対応を提案するものである。
【課題を解決するための手段】
【０００７】
上記目的を達成するために、本発明に係る外部デバイスは、電子機器に接続されて当該電子機器から制御を受ける外部デバイスであって、外部デバイスの種類を特定するＩＤを、自身のＩＤとして記憶したＩＤ記憶手段と、ＩＤ記憶手段に記憶されているＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身で実行される実行用機能と、を対応付けて記憶しておく機能記憶手段と、機能を実行させる制御信号を前記電子機器から受け付けて、前記機能記憶手段に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を実行させる制御手段と、を備えることを特徴とする。【０００８】
上記目的を達成するために、本発明に係る電子機器システムは、電子機器と、当該電子機器に接続されて当該電子機器から制御を受ける外部デバイスとを含んで構成される電子機器システムであって、外部デバイスは、外部デバイスの種類を特定するＩＤを、自身のＩＤとして記憶したＩＤ記憶手段と、ＩＤ記憶手段に記憶されているＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身で実行される実行用機能と、を対応付けて記憶しておく機能記憶手段と、電子機器から機能を実行させる制御信号を受け付けて、前記機能記憶手段に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を動作させる制御手段と、を備えることを特徴とする。【０００９】
上記目的を達成するために、本発明に係る制御方法は、電子機器に接続されて当該電子機器から制御を受けると共に、外部デバイスの種類を特定するＩＤを、自身のＩＤとして記憶したＩＤ記憶手段と、前記ＩＤ記憶手段に記憶されているＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身で実行される実行用機能と、を対応付けて記憶しておく機能記憶手段と、を備える外部デバイスにおける制御方法であって、電子機器から機能を実行させる制御信号を受け付けて、前記機能記憶手段に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を動作させる制御ステップを含むことを特徴とする。【００１０】
上記目的を達成するために、本発明に係る制御方法は、電子機器と、当該電子機器に接続されて当該電子機器から制御を受けると共に、外部デバイスの種類を特定するＩＤを、自身のＩＤとして記憶したＩＤ記憶手段と、前記ＩＤ記憶手段に記憶されているＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身で実行される実行用機能と、を対応付けて記憶しておく機能記憶手段と、を備える外部デバイスにおける制御方法であって、外部デバイスが、前記電子機器から機能を実行させる制御信号を受け付けて、前記機能記憶手段に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を動作させる制御ステップを含むことを特徴とする。【００１１】
本発明に係る外部デバイスでは、ＩＤ記憶手段に記憶されたＩＤに係る種類の外部デバイスの機能を実行させる制御信号を電子機器から入力されると、制御手段によって、機能記憶手段に記憶された情報が参照されて、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能が実行される。従って、電子機器から制御信号を予め入力可能な種類の外部デバイスのＩＤをＩＤ記憶手段に記憶させておけば、電子機器において、電子機器のＯＳに依存する、外部デバイスへ制御信号を入力するためのデバイスドライバ等を外部デバイス毎に用意することが不要となる。【００１２】
ＩＤ記憶手段に記憶されているＩＤは、前記電子機器において予め制御を行うためのデバイスドライバが規定されている外部デバイスを特定するＩＤであることが望ましい。この構成によれば、ＩＤ記憶手段に記憶されるＩＤが、電子機器から制御信号を予め入力可能な種類の外部デバイスのＩＤとなるので、確実に本発明の効果を奏することができる。【００１３】
ＩＤ記憶手段に記憶されているＩＤは、ブロック型デバイスである外部デバイスを特定するＩＤであることが望ましい。この構成によれば、機能記憶手段において機能の対応を容易に記憶させることができると共に、本発明に係る外部デバイスに対する電子機器からの制御信号の入力を容易に行うことができる。【００１４】
本発明に係るデバイスの制御方法は、USB Mass Storage Classなる規格を用いて、デバイスを制御することを特徴とする。【００１５】
前記USB Mass Storage Class規格はOS内にサポートされていることが望ましい。【００１６】
前記USB Mass Storage Class規格を含むUSBインターフェイスを設けるとともに、このUSBインターフェイスを前記デバイスと独立に設けることが望ましい。【００１７】
前記デバイスは、前記USB Mass Storage Class規格をコマンド/ステータス用及びデータ転送用のパーティションをもつ外部記憶装置として認識することが望ましい。【００１８】
前記デバイスの制御は、制御プログラムにおけるPOSIX規格で定義されている、入出力システムコールopen(), read(), write(), close()を用いて行うことが望ましい。【００１９】
前記デバイスは、仮想的にコントロール用及びデータ用の記憶領域（パーティション）を用意し、前記USB Mass Storage Class規格からのコマンドを解釈し、実行することが望ましい。【００２０】
前記デバイスは、物理的にコントロール用及びデータ用の記憶領域（パーティション）を用意し、前記USB Mass Storage Class規格からのコマンドを解釈し、実行することが望ましい。【００２１】
前記コントロール用記憶領域（パーティション）への書き込みはコマンド発行として解釈することが望ましい。【００２２】
前記コントロール用記憶領域（パーティション）からの読み出しはステータス要求として解釈することが望ましい。【００２３】
本発明に係るデバイスの制御装置は、USB Mass Storage Classなる規格を含む制御手段を具え、この制御手段によってデバイスを制御することを特徴とする。【００２４】
前記制御手段は、前記USB Mass Storage Class規格をサポートしたOSを用いることが望ましい。【００２５】
前記制御手段は、前記USB Mass Storage Class規格を含むUSBインターフェイスを含み、デバイスと独立に設けたことが望ましい。【００２６】
前記デバイスは、前記USB Mass Storage Class規格をコマンド/ステータス用及びデータ転送用のパーティションをもつ外部記憶装置として認識することが望ましい。【００２７】
前記デバイスの制御は、制御プログラムにおけるPOSIX規格で定義されている、入出力システムコールopen(), read(), write(), close()を用いて行うことが望ましい。【００２８】
前記デバイスは、仮想的にコントロール用及びデータ用の記憶領域（パーティション）を用意し、前記USB Mass Storage Class規格からのコマンドを解釈し、実行することが望ましい。【００２９】
前記USB Mass Storage Class規格からのコマンドを解釈し、実行するための、物理的にコントロール用及びデータ用の記憶領域（パーティション）を具えることが望ましい。【００３０】
前記コントロール用記憶領域（パーティション）への書き込みはコマンド発行として解釈することが望ましい。【００３１】
前記コントロール用記憶領域（パーティション）からの読み出しはステータス要求として解釈することが望ましい。【００３２】
上記目的を達成すべく、本発明に係るデバイスの制御方法は、USB Mass Storage Classなる規格を用いて、デバイスを制御することを特徴とする。【００３３】
また、本発明に係るデバイスの制御装置は、USB Mass Storage Classなる規格を含む制御手段を具え、この制御手段によってデバイスを制御することを特徴とする。【００３４】
Mass Storage ClassはUSB経由でハードディスクやフロッピ（登録商標）ディスクといった外部記憶装置を接続するための規格で、多くのOSで標準的にサポートされており、特別なドライバなしで利用することができる。デバイスはOSから、コマンド/ステータス用及びデータ転送用のパーティションをもつ外部記憶装置として認識される。【００３５】
制御用プログラムはPOSIX規格で定義されている入出力システムコールopen(), read(), write(), close()を用いてデバイスの制御、データ入出力を行う。デバイスは仮想的にあるいは物理的にコントロール用、データ用の記憶領域(パーティション)を用意し、それらに対してPCがUSB経由で送ってくるMass Storage Classのコマンドを解釈、実行する。コントロール用パーティションに対する書き込みはコマンド発行、読み出しはステータス要求として解釈する。また、データ用パーティションに対する読み書きはデータの読み書きと解釈する。
【発明の効果】
【００３６】
本発明によれば、電子機器から制御信号を予め入力可能な種類の外部デバイスのＩＤをＩＤ記憶手段に記憶させておけば、電子機器において、電子機器のＯＳに依存する、外部デバイスへ制御信号を入力するためのデバイスドライバ等をデバイス毎に用意することが不要となる。
【図面の簡単な説明】
【００３７】
【図１】ＰＣにおけるデバイスドライバとＵＳＢデバイスとの関係を示す図である。
【図２】本発明の実施形態に係る外部デバイスの構成を示す図である。
【図３】外部デバイスにおける機能の対応の例を示した図である。
【図４】本発明の実施形態に係る外部デバイスの動作を示すフローチャートである。
【図５】本発明の制御方法におけるブロック図である。
【図６】本発明の制御装置における回路図である。
【図７】本発明の制御方法で用いるソフトウェアのブロック図である。
【図８】USBN9603レジスタにおける制御ルーチンの一例を示すブロック図である。
【符号の説明】
【００３８】
１０…外部デバイス、１１…機能部、１２…インターフェース部、１３…機能記憶部、１４…制御部、２０…ＰＣ、２１…インターフェース部、２２…制御信号送信部、２５…ケーブル、３０…外部デバイス、３０ａ…マスストレージデバイス、３１…ＵＳＢインターフェース、４０…ＰＣ、４１…デバイスドライバ、４１ａ…マスストレージクラスドライバ、４２…ＯＳ、４２ａ…中間層、４２ｂ…ＵＳＢホストドライバ、４３…アプリケーション、４４…ＵＳＢホスト、５０…ケーブル。
【発明を実施するための最良の形態】
【００３９】
以下、図面とともに本発明に係る外部デバイス、当該外部デバイスを含む電子機器システム及び当該外部デバイスにおける制御方法の好適な実施形態について詳細に説明する。なお、図面の説明においては同一要素には同一符号を付し、重複する説明を省略する。【００４０】
まず、図１を用いて、本発明の背景を改めて説明する。図１は、外部デバイスであるＵＳＢデバイス３０が、電子機器であるＰＣ４０にケーブル５０により接続されている状態を示す。ＵＳＢデバイス３０では、ＵＳＢインターフェース３１において、ＵＳＢデバイス３０に応じてデバイスの種類を特定するＩＤである、クラスＩＤが設定されている。ＰＣ４０からＵＳＢデバイス３０に対して、機能を実行させる制御信号を送信するためには、ＰＣ４０においてＵＳＢデバイス３０に応じてデバイスドライバ４１が必要となる。デバイスドライバ４１は、ＯＳ４２に含まれており、ＯＳ４２内において、中間層４２ａと、ＵＳＢホストドライバ４２ｂとを繋ぐ役割を果たす。ここで、図１に示すように、中間層４２ａは、制御信号を生成するアプリケーション４３と情報の送受信を行う部分であり、ＵＳＢホストドライバ４２ｂは、ＵＳＢデバイス３０とのインターフェースであるＵＳＢホスト４４と信号の送受信を行うものである。【００４１】
ＰＣ４０からＵＳＢデバイス３０への制御信号の送信は、クラスＩＤが特定された上でＵＳＢデバイス３０に応じた機能毎に行われるため、デバイスドライバ４１は、通常、ＵＳＢデバイス３０毎に必要となる。従って、上述したように、ＵＳＢデバイス３０を新たに開発する場合は、そのＵＳＢデバイス３０毎にデバイスドライバ４１を作成する必要があった。また、ＯＳ４２における上記の中間層４２ａやＵＳＢホストドライバ４２ｂは、ＯＳにより形式が異なるので、デバイスドライバ４１は、ＯＳ４２毎に作成する必要があった。【００４２】
ところで、デバイスドライバ４１には、ストレージやサウンドデバイス等のよく使われる機能のＵＳＢデバイスのための個々のデバイスドライバ開発を省略するために、通常、多くの種類のＯＳ４２において共通的に用意されているものがある。このようなデバイスドライバ４１はＵＳＢクラスドライバと呼ばれる。例えば、図１に示すマスストレージクラスドライバ４１ａは、ストレージ機器のためのデバイスドライバであり、ストレージ空間へのアクセスのための制御手順を提供している。ＰＣ４０に接続されたＵＳＢマスストレージデバイス３０ａには、マスストレージクラスドライバ４１ａが用いられて制御信号が入力される。【００４３】
以上を踏まえて、本発明に係る外部デバイス、当該外部デバイスを含む電子機器システム及び当該外部デバイスにおける制御方法の好適な実施形態を説明する。図２に本実施形態に係る外部デバイス１０、及び当該外部デバイス１０の接続対象であるＰＣ２０の機能構成を示す。外部デバイス１０とＰＣ２０とは、本実施形態に係る電子機器システムを構成している。外部デバイス１０とＰＣ２０とは、ケーブル２５等により接続されている。なお、外部デバイス１０は、ＰＣ２０から取り外すこともできるようになっている。外部デバイス１０とＰＣ２０との接続は、所定のデータ伝送路の規格に準じている。上述したように、当該規格では、外部デバイス１０への制御信号の送信は、外部デバイス１０の種類をＩＤにより特定した上で、当該種類に応じたデバイスドライバが用いられて行われる。本実施形態では、当該規格をＵＳＢとして説明する。【００４４】
外部デバイス１０は、ＰＣ２０からの制御を受けて所定の機能を実現するデバイスである。外部デバイス１０としては、具体的には、ストレージ機器、キーボード、マウス及びモデム等の周辺機器に相当する。本実施形態では、外部デバイス１０は、電圧等により外部から入力されるアナログ値を、デジタル値に変換するＡ／Ｄ変換器として説明する。図２に示すように、外部デバイス１０は、機能部１１と、インターフェース部１２と、機能記憶部１３と、制御部１４とを備えて構成される。【００４５】
機能部１１は、外部デバイス１０の機能を実行する手段である。本実施形態のようにＡ／Ｄ変換器であれば電圧値等により入力されたアナログ値をデジタル値に変換する機能を実行する手段である。機能部１１による機能の実行は、後述するように、制御部１４の制御を受けて行われる。機能部１１は、機能に応じたハードウェアによって実現される。例えば、本実施形態のようにＡ／Ｄ変換器であれば、Ａ／Ｄ変換を行う回路やＣＰＵ等によって実現される。【００４６】
インターフェース部１２は、ＰＣ２０からケーブル２５を経由して入力されるＵＳＢに準拠した制御信号の入力を受け付けつけ、また、ＰＣ２０との間でデータの入出力を行う手段である。また、インターフェース部１２は、外部デバイスの種類を特定するクラスＩＤを、自身のクラスＩＤとして記憶したＩＤ記憶手段でもある。インターフェース部１２に記憶されているクラスＩＤは、ＰＣ４０（の各ＯＳ）において予め制御を行うためのデバイスドライバが規定されている外部デバイスの種類のクラスＩＤである。また、インターフェース部１２に記憶されているクラスＩＤに係る外部デバイスの種類は、ブロック型デバイスである。インターフェース部１２に記憶されているクラスＩＤは、具体的には例えば、上述したマスストレージデバイスのクラスＩＤであることが望ましい。【００４７】
これによって、ＰＣ２０からは、外部デバイス１０の機能、即ち機能部１１の機能にかかわらず、外部デバイス１０がマスストレージデバイスであると認識される。従って、ＰＣ２０からは、マスストレージデバイスに対する制御信号が入力される。インターフェース部１２は、ＰＣ２０から入力された制御信号を受信して、制御部１４に入力する。【００４８】
インターフェース部１２は、ＩＣチップ（ＵＳＢデバイス）等のハードウェアによって実現される。【００４９】
機能記憶部１３は、インターフェース部に記憶されているクラスＩＤにより種類が特定される外部デバイスの入力受付用機能と、自身の機能部１１で実行される実行用機能とを対応付けて記憶しておく機能記憶手段である。機能記憶部１３は、具体的には、マスストレージデバイスの機能（入力受付用機能）と、機能部１１で実行される機能とを対応付けて記憶する。更に具体的には、図３に示すように、マスストレージデバイスの機能として“メモリアドレスの０番地に０又は１を書き込む”ことと、機能部１１のＡ／Ｄ変換器の機能として“計測をスタート又はストップする”こととを対応付けて記憶する。また、マスストレージデバイスの機能として“メモリアドレスの１番地に数値を書き込む”ことと、機能部１１のＡ／Ｄ変換器の機能として“当該数値を計測間隔とする”こととを対応付けて記憶する。また、マスストレージデバイスの“メモリアドレスの２番地の数値”と、機能部１１のＡ／Ｄ変換器の “計測された値”とを対応付けて記憶する（ＰＣ２０からメモリアドレス２番地にアクセスする制御信号が入力されることにより計測された値が読み出される）。これらの情報は、制御部１４によって参照される。機能記憶部１３は、メモリや回路のハードウェア等により上記の情報を記憶することにより実現される。【００５０】
制御部１４は、機能を実行させる制御信号を、ＰＣ２０からインターフェース部１２を介して受け付けて、機能記憶部１３に記憶された情報を参照して、当該制御信号に係る機能を入力受付用機能としたときに対応する実行用機能を機能部１１に実行させる制御手段である。具体的には例えば、ＰＣ２０から外部デバイス１０に、“０番地に１を書き込む”という旨の制御信号が入力されると、制御部１４は、機能記憶部１３に記憶された図３に示すような機能の対応関係を示す情報を参照して、機能部１１に対して“計測をスタートさせる”制御を行う。上記のように、マスストレージデバイスへの書き込みはコマンド発行として、マスストレージデバイスからの読み出しはステータス（上記の例ではデジタル値）要求とすることが望ましい。【００５１】
なお、外部デバイス１０に、ＳＲＡＭ（Static Random Access Memory）等のストレージ手段を設けておき、マスストレージデバイスと同様にＰＣ２０から入力された制御信号に基づきストレージ手段のメモリアドレス上での読み書きが（機能部１１による機能の実行と合わせて）行われることとしてもよい。以上が外部デバイス１０の機能である。【００５２】
引き続いて、電子機器であるＰＣ２０の構成について説明する。ＰＣ２０は、外部デバイス１０に制御信号を送信して、外部デバイス１０を制御する装置である。ＰＣ２０は、図２に示すように、インターフェース部２１と、制御信号送信部２２とを備えて構成される。ＰＣ２０は、ＣＰＵ及びメモリ等のハードウェアにより実現される。【００５３】
インターフェース部２１は、制御信号送信部２２からの指示に従いＵＳＢに準拠した制御信号を外部デバイス１０に送信し、外部デバイス１０との間でデータの入出力を行う手段である。インターフェース部２１は、ＩＣチップ（ＵＳＢホスト）等のハードウェアによって実現される。【００５４】
制御信号送信部２２は、外部デバイス１０への制御信号を外部デバイス１０へ送信するように、インターフェース部２１に指示を行う手段である。制御信号送信部２２は、図１におけるＰＣ４０のＯＳ４２及びアプリケーション４３の機能に相当する。即ち、制御信号送信部２２は、外部デバイス１０のクラスＩＤに対応したデバイスドライバを用いてクラスＩＤを特定した上で、外部デバイス１０に対して制御信号を送信するようにインターフェース部２１に指示する。【００５５】
本実施形態に係る外部デバイス１０への制御信号の送信は、外部デバイス１０のクラスＩＤをマスストレージデバイスのクラスＩＤとした上で行われる。なお、通常、マスストレージデバイスのデバイスドライバはＰＣ２０のＯＳにかかわらず、制御信号送信部２２に備えられている。なお、制御信号送信部２２の指示により送信された制御信号は、上述したように外部デバイス１０においては、機能記憶部１３に記憶された対応付けされた機能が実行される。従って、制御信号送信部２２（を実現するアプリケーション）は、その対応関係に基づいて、外部デバイス１０の機能部１１の機能が実行されるように、マスストレージデバイスの制御信号を送信する。【００５６】
なお、制御信号送信部２２における、アプリケーションからＯＳへの制御信号の入出力は、ＯＳのポータビリティ規格ＰＯＳＩＸで定義されている入出力システムコール（具体的には、ｏｐｅｎ（）、ｒｅａｄ（）、ｗｒｉｔｅ（）、ｃｌｏｓｅ（））を用いてアクセスすることが望ましい。ＯＳ毎のアプリケーションの開発を容易にするためである。以上がＰＣ２０の機能である。【００５７】
引き続いて、図４のフローチャートを用いて、本実施形態に係る外部デバイス１０の動作（外部デバイス１０における制御方法）を説明する。【００５８】
ＰＣ２０から外部デバイス１０に互いのインターフェース部１２，２１を介して制御信号が入力されることにより、動作が開始される。なお、制御信号の入力は、ＰＣ２０におけるユーザの操作等をトリガとして行われる。また、この制御信号の入力の際、ＰＣ２０の制御信号送信部２２では、マスストレージデバイスのデバイスドライバが用いられて、外部デバイス１０のインターフェース部１２に記憶されたマスストレージデバイスのクラスＩＤが特定される。【００５９】
外部デバイス１０では、制御部１４によって制御信号が受け付けられる（Ｓ０１、制御ステップ）。続いて、制御部１４によって、機能記憶部１３に記憶された図３に示すような情報が参照されて入力された制御信号に係る入力受付用機能に対応する、機能部１１で実行されるべき実行用機能が特定される（Ｓ０２、制御ステップ）。続いて、制御部１４によって、機能部１１に対して特定された実行用機能が実行されるように制御されて、機能部１１によって当該実行用機能が実行される（Ｓ０３、制御ステップ）。【００６０】
上述したように本実施形態では、ＰＣ２０は、外部デバイス１０のインターフェース部１２に記憶されたクラスＩＤに係る種類の外部デバイスとして、外部デバイス１０を制御することができる。従って、インターフェース部１２に記憶されたクラスＩＤを、ＰＣ２０から制御信号を予め入力可能な種類の外部デバイス、即ち、デバイスドライバ等が予め用意されている外部デバイスのクラスＩＤとすれば、ＰＣ２０において、電子機器のＯＳに依存する、外部デバイスへ制御信号を入力するためのデバイスドライバ等を外部デバイス１０毎に用意することが不要となる。【００６１】
また、本実施形態のようにインターフェース部１２に記憶されているＩＤを、ＰＣ２０において予め制御を行うためのデバイスドライバが規定されている外部デバイスを特定するＩＤであることとするのが望ましい。この構成によれば、インターフェース部１２に記憶されるＩＤが、ＰＣ２０から制御信号を予め入力可能な種類の外部デバイスのＩＤとなるので、確実に本発明の効果を奏することができる。【００６２】
また、本実施形態のようにインターフェース部１２に記憶されているＩＤは、ブロック型デバイスである外部デバイスを特定するＩＤであることが望ましい。この構成によれば、アドレスと機能の内容とを容易に対応付けることができるため、機能記憶部１３において機能の対応を容易に記憶させることができると共に、本発明に係る外部デバイス１０に対するＰＣからの制御信号の入力を容易に行うことができる。但し、必ずしもブロック型デバイスである必要はなく、キャラクタ型デバイスであってもよい。【００６３】
上記のような本発明の特徴により、外部デバイス１０をＰＣ２０のＯＳによらずに（ＯＳインデペンデントに）、即ち、ＯＳに依存したソースを必要とせずに利用可能とすることができる。なお、上記の実施形態では、外部デバイス１０（の機能部１１）の機能の例として、Ａ／Ｄ変換器を説明に用いたが、外部デバイスとして実現できる機能であれば、計測器、電源装置、映像機器及びオーディオ装置等の任意のデバイスに本発明を適用することができる。また、外部デバイス１０が接続される電子機器もＰＣ２０に限られない。更に、外部デバイスと電子機器との接続の規格についても、ＵＳＢに限られず、同様の枠組みを有するものに適用することができる。【００６４】
実装例として、ADuC7026内蔵のADコンバータ(2チャンネル)からアナログデータをキャプチャしてPCへ転送するシステムを作製した。【００６５】
OSはストレージ機器に対してキャッシュ機構を持っている。open()システムコールでオープンする限りオプション・フラグ(O_DIRECTとO_SYNC)を設定することでキャッシュを回避することができるが、アクセス方法の選択肢を広げ、あらゆる環境下でOSのキャッシュ機構を避けることを意図して、メディアロック機構のないUSBフロッピディスクをエミュレートする。これによって、ディレイは避けられなくても、ライト・キャッシュを自動的に回避することができる。【００６６】
（システム）
本機のブロックダイアグラムを図５に示す。USBインターフェースとデバイス固有の動作(今回はA/Dコンバータからのデータ取り込み)の独立性を高め、機能追加(例えばD/Aコンバータへのデータ出力など)をUSBインターフェースに手を加えることなく実現できるようにするために、64KBの外付けSRAMを用いて物理的にメモリ・パーティションを用意した。【００６７】
図の右側には、USBインターフェースの構成を示している。USB物理層はNational Instruments製のUSBN9603(Full Speed対応)にまかせ、プロトコル層(USBトランザクションの処理)、デバイス・フレームワーク(USBデバイス・リクエストの処理)、Mass Storage Classの処理をソフトウェアで行う。これらのソフトウェアはUSBN9603の割り込み要求信号(INTRQ)によってADuC7026のIRQ割り込みとして呼び出される。【００６８】
図の左側には、デバイス固有の動作(A/Dコンバータからのデータ取り込み)を示している。このソフトウェアはADuC内蔵のタイマ(Timer1)の割り込みによって呼び出される。Timer1にはサンプリング周波数がセットされており、呼び出される度にコントロール・パーティションをチェック、コマンドの解釈を行う。データの取り込みが指示されれば呼び出される度にA/Dコンバータからデータを読み出してSRAMのデータ・パーティションに格納する。【００６９】
また、必要のある場合にはステータスをコントロール・パーティションに書き込む。この処理は確実にサンプリング周波数ごとに行わなければならないため、UBN9603の割り込み信号よりも優先度の高いFIQ割り込みとして呼び出している。【００７０】
具体的には、コントロール・パーティションは0バイト目がCH0へのコマンド、1バイト目がCH1へのコマンド、2バイト目がコマンド・キューとなっている。今回は簡単のため、データ取り込み開始コマンド('G')と、中止コマンド('N')だけを用意した。【００７１】
コマンド・キューは、CH0、CH1へのコマンド・バイトに有効なコマンドが書き込まれたことを示すためのものである。デバイス側は、このバイトに'*'が書き込まれたことを認識すると、これを' '(スペース文字)でクリアすると同時に、CH0、CH1のコマンド・バイトを解釈し、実行する。データ・パーティションとしてはCH0、CH1用にそれぞれ16KBずつのパーティションを用意した。'G'コマンドが与えられると、対応するチャネルのパーティションの先頭から順次A/Dコンバータからのデータを格納していき、末尾に到達すると対応するコマンド・バイトに動作完了のマークとして'#'を書き込み、終了する。【００７２】
PC側はコマンド発行後、定期的にコントロール・パーティションをチェックし、'#'が書き込まれるのを待つことでデータ取り込みの完了を知ることができる。【００７３】
データ自体は、それぞれのチャネルに対応するパーティションを読み出すことによって得ることができる。【００７４】
（ハードウェア）
本機の回路図を図６に示す。ADuC7026はGPIOのP0.1, P0.2, P2.1〜7、P3、P4をコンフィギュレーション2に設定(GPxCONレジスタ(x=0,2,3,4))することで、アドレス・データ多重の16/8bitのメモリ・バスを使用することができる。このバス経由でアクセスできるメモリ空間は128KBずつの4領域に分けられており、各領域ごとにイネーブル信号(MS[3:0])が用意されている。USB9603及び外付けSRAMをこのバスに接続し、前者を領域0に、後者を領域1に割り当てた（GPIOについてはデータ・シート(ANALOG DEVICES, “AduC7019/20/21/22/24/25/26/27 Data sheet, Rev. 0”, Nov., 2005)p.59-60、メモリ・インターフェースについては同p.78-81、詳細なタイミングについては同p.9-10、メモリ・マップについては同p.33参照））。【００７５】
USBN9603は8bitのアドレス多重バスをサポート(MODE1='0', MODE0='1'に設定)しています(National Semiconductor, USBN9603/USBN9604 Universal Serial Bus Full Speed Node Controller with Enhanced DMA Support, Rev.1.3”参照)のでADuC7026のメモリ・バスに直結することができます。ADuC7026側ではXM0CONのbit1を'0'とすることで領域0のアクセス・モードを8bitに設定することができる。【００７６】
外付けSRAMにはWinbond製W24257AK-15を準備した。これは一般的な8bit幅の256KBit SRAM  (Windbond, “W24257A Datasheet, Rev. A6”参照)で、HM65256やuPD43256とピン配置互換である。アドレス・ラッチとして74HC573を2個使用し、ALE出力によってアドレスを分離し、SRAMに供給している。BHE, BLE出力は16bitバス上で8bit単位でのアクセスを行うための信号で、それぞれ、上位バイト、下位バイトへのアクセスが必要となる時にアクティブになる。16bitと8bitのアクセスを区別する必要があるのは書き込みのみであるから、ライト・ストローブ信号WSとの論理積をSRAMに供給し、リード・ストローブ信号RSはそのまま接続する。【００７７】
メモリ・バスのアクセス・タイミングを設定するレジスタがメモリ領域ごとに用意されている(XMxPAR, x=0,1,2,3)。ADuCのメモリ・タイミング・チャートとUSBN9603、SRAMのタイミングチャートを比較してタイミング設定を決定し、実機でチェックしながら調整したところ、USBN9603については0109h、SRAMについては0201hが最速の設定であった。USBN9603のアクセスタイミングは、アドレス関連のアクセスタイムは早いものの、リードでは読み出し時間が、ライトでは書き込み後次のアドレス設定が可能になるまでの時間が250nsと長いことに注意が必要である（上記Windbond, “W24257A Datasheet, Rev. A6”参照）。【００７８】
特に、ライト後の待ち時間はCPUクロックで約10サイクル必要であるが、XMxPARレジスタでは1CLKまでしか設定できないため、場合によってはプログラミング上の配慮が必要となる。【００７９】
また、USBN9603の割り込み要求信号(INTRQ)をADuC7026の外部割り込み入力ピンIRQ0
に接続し、USBN9603からの割り込みを受け付けられるようにしておく。【００８０】
アナログ入力については、CH0、CH1それぞれに簡単なアンプを用意した。ADuCのA/Dコンバータの入力範囲は0V〜2.5Vであるので、このアンプによりレンジ調節を行う。入力信号はまずアッテネータを通って振幅調整される。次に、AC接続の場合はカップリング・コンデンサとバイアス抵抗を経由、DC接続の場合は直接、オペアンプ(TLC272)に入力する。オペアンプの一段目はボルテージ・フォロワを構成しており、インピーダンス変換を行う。二段目は反転増幅器で、1.25V(Rx2, x=0,1の分圧比で決定される電圧)を中心としてRx1/3K倍(x=0,1)に増幅する。すべて単電源で構成されているので、負の電圧を計測したい場合はAC接続にしなければならない。【００８１】
また、オペアンプとしては単電源3.3Vで動作するものであればよく、LM158なども使用できる。【００８２】
（ソフトウェア）
ソフトウェアのブロック図を図７に示す。ARM7TDMIシリーズの割り込みにはIRQとFIQとの二種類がある。後者は割り込みルーチンで使用できるレジスタ数などに制限を加えることで割り込み信号検出からルーチンコールまでの処理を軽減し、レイテンシを抑えている(上記ANALOG DEVICES, “AduC7019/20/21/22/24/25/26/27 Data sheet, Rev. 0”, Nov., 2005 、p.31-32参照)。また、ARM7TDMIの割り込み禁止フラグはCPSRというCPUレジスタにIRQ用(Iビット)とFIQ用(Fビット)とが別々に用意されている。これらの禁止フラグは割り込みルーチンが呼ばれる時に自動的にセットされるが、IRQ割り込み時はIビットのみセットされ、FIQ割り込み時にはIビットとFビットとの両方がセットされる。つまり、IRQ割り込み処理中でもFIQ割り込み処理を受け付けることができる。従って、IRQとFIQとを使い分けることでCPSRにアクセスすることなく、割り込み処理中により優先度の高い割り込みを受け付けることができる。【００８３】
データのサンプリング処理は必ずサンプリング周波数ごとに必要な処理であるのでFIQ割り込み処理として、USBまわりは処理が複雑になる場合もあり、それほど時間の制約も強くないためIRQ割り込み処理として実装した。前述のように、Timer1にデータのサンプリング間隔を設定して周期的に割り込みを発生させる。具体的にはT1LDレジスタにカウント値、T1CONの下位4ビットに分周比、bit7と6に'1'をセットする。この割り込み信号でFIQを発生させられるよう設定する(FIQENレジスタ(上記ANALOG DEVICES, “AduC7019/20/21/22/24/25/26/27 Data sheet, Rev. 0”, Nov., 2005、p.73-74)に00000008hを書き込む)。【００８４】
USBN9603のINTRQ出力は外部割り込み入力ピンIRQ0に接続してあるので、これによってIRQ割り込みを発生させられるよう設定する(IRQENレジスタに00008000hを書き込む)。IRQENやFIQENレジスタは新たにセットしたいビットのみを立てて書き込むことで許可ビットを追加できる。逆に許可ビットをクリアしたい場合はIRQCLR、FIQCLRレジスタにクリアしたいビットのみを立てて書き込むことになる。【００８５】
A/Dコンバータ制御ルーチンではまず、FIQSTAレジスタをチェックする。このレジスタはFIQENレジスタで割り込みを許可している信号のうちどの信号がアクティブになっているかを知らせてくれる。対応するビットが'1'になっていればアクティブになっているので、このレジスタと00000008hとの論理積をとって'1'ならばTimer1からの割り込みと判断する(本例では、FIQ割り込みはTimer1からのものだけなので、この処理はなくても動作する)。【００８６】
次にT1CLRIレジスタ(上記ANALOG DEVICES, “AduC7019/20/21/22/24/25/26/27 Data sheet, Rev. 0”, Nov., 2005、p.75-76)に書き込みを行い、割り込み入力をクリアする。これを行わないと、割り込み処理終了後またすぐ割り込み処理が始まってしまう。次にコマンド・パーティションのコマンド・キュー・バイトをチェックする。この場合、'*'が書き込まれていれば、有効なコマンドがCH0、CH1のコマンド・バイトそれぞれにセットされているのでコマンド内容をチェックする。'G'ならば該当チャネルのデータ収集を開始、'N'ならば中止する。これら以外ならばなにもしない。具体的には、データ収集開始の場合はデータ収集の開始は変数ADC_CHx_EN(x=0,1)に'1'をセット、中止の場合は'0'をセットする。【００８７】
同時に、データ収集開始の場合はデータ・メモリへのポインタ(変数adcChxCurrent(x=0,1))をメモリ領域の先頭(ADC_CHx_BUFHEAD(x=0,1))にセットする。そして、ADC_CHx_ENが'1'の場合は該当チャネルからのデータを読み込み、メモリへ格納、ポインタをインクリメントする。ポインタがメモリ領域の最後(ADC_CHx_BUFTAIL - 1 (x=0,1))まで達したらデータ収集を完了し、該当コマンド・バイトに'#'(完了ステータス)を書き込む。【００８８】
USBインターフェース・ルーチンでは、A/Dコンバータ制御ルーチンの場合と同様、まずIRQSTAレジスタをチェックして外部割り込み0からの割り込みであることを確認してからUSBN9603の制御ルーチン(USBN960x_int())を実行する。制御ルーチンはusbn960x.cに記述されており、図７では左上のUSBプロトコル・レイヤに相当する。USBN9603の制御方法については、上述したデータ・シート以外にも、例えば、USB通信プログラミングテクニック“http://.picfun.com/usbframe.html;  桑野雅彦”USBコントローラUSBN9602を使ったUSBターゲット機器の開発“in TECHI USB ハード＆ソフト開発のすべて”TECHI Vol.8, pp.43-54）;  桑野雅彦”USBコントローラUSBN9602/9603/9604の使い方“）などを参照して用いることができる。【００８９】
これらの方法を用いた制御方法について以下に簡単に説明する。【００９０】
USBでは、一つのデバイスがエンドポイントというデータを送受信するための「出入り口」を機能ごとに用意する。PCはエンドポイントを選んでデータをやりとりすることで使用したい機能ブロックと直接通信することができる。USBN9603にはEP0〜EP6の7個のエンドポイントが用意されている。EP0はUSB規格（上記Compaq, Intel, Microsoft, and NEC, “Universal Serial Bus Specification, Rev.1.1”参照）(USBN9603はUSB Rev. 1.1対応)で必須とされているコントロール・エンドポイントで、8バイトのFIFOを備えている。USB規格で指定されている通り入出力兼用で、FIFOも入出力兼用、EPC0レジスタによって方向を切り替えて使用する(入出力兼用なのはコントロール・エンドポイントのみ)。EP1, EP3, EP5は送信専用(USBのIN方向に対応)のエンドポイントで、64バイトのFIFOを備えている。EP2, EP4, EP6は受信専用(USBのOUT方向に対応)で、同じく64バイトのFIFOを備えている。【００９１】
制御ルーチンの仕事はなぜ割り込みがかかったのかを判定し、それに対応した指令をUSBN9603に与えることである。図８にUSBN9603のレジスタのうち制御ルーチンでよく使うものを示す。この場合、すべて8ビットである。MAEVレジスタには、割り込み発生の理由がおおまかに示されているので、最初にこれをチェックする。RX_EVビットが立っていればデータの受信に関係する状態が変化した、ということである。どのチャネルで、何が起こったのか(受信が成功した、エラーが発生したなど)を知るためにRXEVレジスタ、さらにRXSx(x=0,1,2,3)レジスタをチェックすることになる。TX_EVビットが立っていればデータ送信の完了(あるいは未完了)を意味するので、TXEVレジスタやTXSx(x=0,1,2,3)レジスタをチェックする。NAKビットは、受信エンドポイント(EP2, EP4, EP6)においてFIFOがいっぱいであり、データを受け取ることができなかった場合、送信エンドポイント(EP1, EP3, EP5)においてFIFOが空だったためPCからのデータ読み出し要求に応えられなかった場合に'1'になる。【００９２】
どのチャネルで発生したかはNAKEVレジスタによって知ることができる。基本的にこのレジスタで重要なのはOUT0(bit4)のみである。このビットはEP0の受信方向でNAKが発生したことを意味し、PCからのコマンドが来ているのに受け取れていないということであって、送信中でも中止して受信モードに切り替えてやる必要がある。ALTビットが立っていた場合は、パワーマネジメント関連とバスリセット関連のレジスタALTEVレジスタをチェックする。本機のようにセルフパワーのデバイスの場合はパワーマネジメントが必須というわけではないので、バスリセット(bit6)のみをチェックすればよい。バスリセットが発生した場合は、電源投入時と同じ状態に戻らなければならない。USBN9603の制御ルーチンはこれらのレジスタを操作し、各エンドポイントでのデータ送受信を行う。これは、Compaq, Intel, Microsoft, and NEC, “Universal Serial Bus Specification, Rev.1.1”の8章Protocol Layerに記載されている処理に相当し、ファイルusbn960x.cに記述されている。【００９３】
USBデバイスとして機能するためには少なくとも、コントロール・エンドポイント(EP0)に対してPCから送られてくる種々のコマンドのうち「標準デバイス・リクエスト」と呼ばれるコマンド群に対して応答することができなければならない。これらは、上記Compaq, Intel, Microsoft, and NEC, “Universal Serial Bus Specification, Rev.1.1”の9章USB Device Frameworkに定義されており、主としてデバイス固有の情報(機能の概要やエンドポイントの数など)を要求したり、USBツリー内でのアドレスを設定したり、動作モードを切り替えたり、といった機能をもっている。【００９４】
これらの処理は、図７の左下、デバイス・リクエスト処理に相当し、usb.devicelayer.c, usb.descriptors.hに記述されている。これらのコマンド群はコントロール・トランスファ(上記Compaq, Intel, Microsoft, and NEC, “Universal Serial Bus Specification, Rev.1.1”、8.5.2, p.164-168)と呼ばれるプロトコルに従って伝達、実行、ステータス報告が行われる。コントロール・トランスファの処理はusbn960x.cに記述されている。【００９５】
デバイスは、自分の固有情報を標準USBディスクリプタというデータ・テーブル群の形で保持している。これは標準デバイス・ディスクリプタ、標準コンフィギュレーション・ディスクリプタ、標準インターフェース・ディスクリプタ、標準エンドポイント・ディスクリプタと呼ばれる4種類のデータ・テーブルの組み合わせで構成されている。標準デバイス・ディスクリプタにはデバイス全体の情報、例えばUSBのどのバージョンをサポートしているか、デバイス機能の概略(Class Codeなど)、製造者名、デバイス名などが記載されている。標準エンドポイント・ディスクリプタには該当エンドポイントの番号、データ転送方式と方向、最大のパケット・サイズなどが記載されている。【００９６】
USBでは1つのデバイスに複数の独立した機能を実装することができる。その機能ごとにエンドポイントの集合体であるインターフェースが定義される。標準インターフェース・ディスクリプタには該当インターフェースの機能の概略(Class Codeなど)が記載されている。また、USBではどの機能(インターフェース)を有効にするか動的に変更するための機構が用意されている。どの機能群を有効にするか、という組み合わせをコンフィギュレーションと呼び、標準コンフィギュレーション・ディスクリプタにその概略が記載されている。PC側は"Get Descriptor"標準デバイス・リクエストを使用して、用意されているコンフィギュレーションのディスクリプタをすべて読み出し、"Set Configuration"標準デバイス・リクエストで希望のコンフィギュレーションを選択することになる。【００９７】
なお、標準インターフェース・ディスクリプタ、標準コンフィギュレーション・ディスクリプタ自身にはそれぞれどのエンドポイント、インターフェースが属するかという情報の記載はない。また、"Get Descriptor"標準デバイス・リクエストでディスクリプタを要求されたときに、所属するエンドポイント、インターフェースのディスクリプタをすべていっしょに送ることで、この情報をPC側に知らせることになる。【００９８】
また、同時に有効にならない複数のインターフェースは同じエンドポイントを所有することができるし、そのような場合、インターフェースによって同一エンドポイントのデータ転送方式や方向が異なっていても良い。【００９９】
PCはUSBデバイスの接続を検知すると、バス・リセットをかけ、"Set Address"標準デバイス・リクエストによりデバイスにUSBアドレスを割り当て、"Set Configuration"標準デバイス・リクエストによりインターフェースをアクティベートし、デバイスを動作可能状態に持っていく。【０１００】
デバイスがMass Storage Classとして機能するためには、1)Mass Storage Class機能専用のンターフェースを用意すること、2)そのインターフェースのディスクリプタにデバイスのサポートするデータ転送方法とコマンド・コード体系を正しく記述しておくこと、そして、3)Mass Storage Class特有のデバイス・リクエストをサポートすること、が必要である。【０１０１】
まず、1)に関し、Mass Storage Classの概要文書USB-IF, “Universal Serial Mass Storage Class Specification Overview, Rev. 1.2”では、Mass Storage Class用インターフェースを2種類定義している。この２種類とは、Control/Bulk/Interrupt protocol(CBI)とBulk-Only Transportとである。前者はFull-speedのUSBフロッピ・ディスクのみで用いること、新規設計には用いないことを推奨する、と書かれているので、本例ではBulk-Only Transport（USB-IF, “Universal Serial Bus Mass Storage Class Bulk-Only Transport, Rev. 1.0”参照）を用いる。また、コマンド・コード体系について、上記USB-IF, “Universal Serial Mass Storage Class Specification Overview, Rev. 1.2”では、6
種類定義されているが、そのうちUSBフロッピに適したものはUFI、SFF-8070iの２つである。【０１０２】
今回は正式なspecificationをUSB-IFから入手できるUSB-IF, “Universal Serial Bus Storage Class UFI Command Specification, Rev. 1.2”を選択した。Bulk-Only Transport用のインターフェースはBulk-Inエンドポイント(Bulkトランザクション(上記Compaq, Intel, Microsoft, and NEC, “Universal Serial Bus Specification, Rev.1.1”、8.5.1, p.163-164)により通信するIN方向のエンドポイント)、Bulk-Outエンドポイントをそれぞれ一つずつで構成される。【０１０３】
2)のディスクリプタについては、本機に搭載する機能はMass Storage Class機能のみであるので、インターフェースはこの機能用のもの1種類だけである。従って、コンフィギュレーションも1種類しか必要としない。本機に用意するディスクリプタは標準デバイス・ディスクリプタ、標準コンフィギュレーション・ディスクリプタ1つ、標準インターフェース・ディスクリプタ1つ、標準エンドポイント・ディスクリプタ2つ(Bulk-Out、Bulk-In用1つずつ)、となる。Mass Storage Classに対応したデバイスであることをPCに知らせるためには、標準デバイス・ディスクリプタの5バイト目(bDeviceClass)を00h、標準インターフェース・ディスクリプタの6バイト目(bInterfaceClass)を08hとする必要がある。さらに、Bulk-Only Transportであることは同ディスクリプタの8バイト目(bInterfaceProtocol)を50hに、UFIコマンド体系を採用していることは7バイト目(bInterfaceSubClass)を04hとすることで記述する(USB-IF, “Universal Serial Mass Storage Class Specification Overview, Rev. 1.2”、p.6-7参照)。【０１０４】
3)のデバイス・リクエストは"Bulk-Only Mass Storage Reset"リクエストと"Get Max LUN"リクエストである。前者はMass Storage Class用インターフェース関連の機能のリセットであり、後者はデバイスのLogical Unit Number(LUN)の最大値を応答する。LUNは1つの物理デバイスに複数の(サブ)デバイスを用意するための機構である(例えば、マルチ光学ドライブでLUN0はCD-ROMドライブ機能、LUN1はDVD-RAMドライブ機能、など。データ用パーティションを沢山(3個以上)用意したい場合にはLUNを用いる必要があるが、今回の設計では必要ないのでこのコマンドに対しては0を返す。）。【０１０５】
Mass Storage Classとしての機能は図７の中程下の部分で処理している。コードはboms.cbwhandler.c、UFIの処理はboms.ufiproc.cに記述している。前述のように、Bulk-Only Transport用のインターフェースはBulk-In/Outエンドポイント1つずつで構成される。PC側はデバイスのBulk-Outエンドポイントに対して(もちろんBulk-Outトランザクションを用いて)、Command Block Wrapper(CBW)と呼ばれるデータ・ブロックを送る。CBWには使用するコマンド体系のコマンド(今回はUFIコマンド)の他にデータ転送量(dCBWDataTransferLength)やその方向(bmCBWFlagsのbit7)などの情報を含んでいる(上記USB-IF, “Universal Serial Bus Mass Storage Class Bulk-Only Transport, Rev. 1.0”参照)。【０１０６】
デバイス側はこのCBW、及びCBWに含まれるUFIコマンドを解釈し、必要に応じてBulk-Out/Inエンドポイント経由でデータの送受信を行い、最後にCommand Status Wrapper(CSW)と呼ばれるデータ・ブロックをBulk-InエンドポイントからPCに送出する。CSWにはコマンドの実行ステータス(bCSWStatus)と処理されなかったデータ量(dCSWResidue)が含まれている(上記USB-IF, “Universal Serial Bus Mass Storage Class Bulk-Only Transport, Rev. 1.0”、p.14-15参照)。Bulk-Only Transportでは必ずこの順にデータがやりとりされる必要があり、いったんPC側がCBWを発行すればデバイス側がCSWを返すか、PC側が"Bulk-Only Mass Storage Reset"コマンドでリセットをかけるまで次のCBWが発行されることはない。【０１０７】
もしこの規則に従わないタイミングでCBWが発行されたり、CBWの内容に不備(上記USB-IF, “Universal Serial Bus Mass Storage Class Bulk-Only Transport, Rev. 1.0”、p.17-18で定義されている)のある場合、デバイスはBulk-Out/In両方のエンドポイントをストールさせ、"Bulk-Only Mass Storage Reset"デバイス・リクエストを待つ。後述のようにエンドポイントのストールを検知したPC側は、まず"Clear Feature"標準デバイス・リクエストによってエンドポイントをリセットしようとするが、この場合はこのデバイス・リクエストにはエラーを返す。これによりPC側はCBWのエラーであると認識し、"Bulk-Only Mass Storage Reset"デバイス・リクエストを発行してくることになる。【０１０８】
CSWに含まれる実行ステータスは正常終了、失敗、CBW不整合の三種類がある。失敗はUFIコマンドの実行エラーを意味する。CBW不整合はCBW内に記述されたデータ転送量と転送方向がUFIコマンドで指定されたものと矛盾することを意味する。例えば、CBWにはデータ転送がOUT方向と指定されているのにUFIで必要なデータ転送がIN方向、というような場合である。これは、USB-IF, “Universal Serial Bus Mass Storage Class Bulk-Only Transport, Rev. 1.0”の6.7 The Thirteen Cases(p.18-22)に詳細に定義されている。この資料中では"host expectations"(ホストが期待する転送量、方向)がCBWで指定されたデータ量、方向を意味し、"device intent"(デバイスの意図する転送量、方向)がUFIで指定されたデータ量、方向を意味する。【０１０９】
CBW不整合の判定にはいくつかの選択枝があるが、本機ではデータ転送が必要な場合で、i)方向が反対の場合、ii)方向は一致するが、CBWで指定されたデータ量の方がUFIで指定されたデータ量よりも小さい場合、という基準で判定している。また、方向が一致してCBWで指定されたデータ量がUFIで指定されたデータ量よりも多い場合、デバイスは(USBでいう)IN方向なら足りない分だけ0を追加し、OUT方向なら余分なデータを読み捨てる。そして、その量をCSWの未処理データ数(dCSWResidue)にセットする。CBW不整合と判断したデバイスは、CBWで指定されたデータ転送方向がIN方向の場合はBulk-Inエンドポイントを、OUT方向の場合は両方のエンドポイントをストールさせる。PC側はエンドポイントがストールしたのを検知すると"Clear Feature"標準デバイス・リクエストで該当エンドポイントをリセットし、CSWを読み出します。もちろん、このCSWのbCSWStatusにはCBW不整合が発生したことが記述されていることになる。【０１１０】
留意すべき点は、CBW不整合によるエラーを報告しない場合は必ずCBWに指定されている量のデータ送受信を行うことである。また、読み捨てたり0を追加した量はCSWのdCSWResidueにセットする。これはUFIコマンドの実行に失敗した場合にもあてはまる。たとえば、データやパラメータを読み出すようなUFIコマンドに失敗し、送るべきデータが用意できなかった場合はCBWで指定された分だけ0を送る。
【図１】
2007088967.tif 000003
【図２】
2007088967.tif 000004
【図３】
2007088967.tif 000005
【図４】
2007088967.tif 000006
【図５】
2007088967.tif 000007
【図６】
2007088967.tif 000008
【図７】
2007088967.tif 000009
【図８】
2007088967.tif 000010
【国際調査報告】
2007088967.tif 000011
2007088967.tif 000012
2007088967.tif 000013
2007088967.tif 000014