説明

汎用USBドライバ

【課題】汎用USBドライバを提供するための技術を開示すること。
【解決手段】より詳細には、汎用USBのデバイスドライバのアーキテクチャを説明し、このアーキテクチャは、汎用のカーネルモードのドライバにアクセスする、ユーザモードのUSBライブラリを通じた開発を可能にする。説明する実施態様では、方法は、装置のプラグインのイベントに応答して、カーネルモードの汎用デバイスドライバをロードすることを含む。ユーザのソフトウェアコンポーネントは、汎用デバイスドライバと通信する汎用のユーザモードのライブラリ(例えば、ダイナミックリンクライブラリ(DLL))によって提供されたルーチンを利用することによって、装置にアクセスする。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、一般には、デジタル通信に関し、より詳細には、汎用ユニバーサルシリアルバス(USB)ドライバに関する。
【背景技術】
【0002】
本特許文献の開示の一部は、著作権保護を受ける材料を含む。著作権所有者は、本特許文献または本特許開示のいかなる者による複製に対しても、それが特許商標庁の特許ファイルまたは記録において現れるときには、異議を唱えないが、そうでない場合、何であれすべての著作権を留保する。(著作権)Microsoft Corporation。著作権所有。
【0003】
コンピュータがより一般的になるにつれて、単一のコンピュータシステムに組み込まれる機能の数は増え続けている。機能追加を、外部装置をコンピュータシステムに接続することによって提供することが多い。また、外部装置はコンピュータシステムと通信して、機能追加を提供する。
【0004】
ユニバーサルシリアルバス(USB)は、外部装置をコンピュータシステムに接続するための標準的な通信チャネルとなっている。USBは、いくつかの装置を同じコンピュータシステムに同時に接続することを可能にするが、比較的高い帯域幅を提供する。例えば、最新の一般に入手可能なバージョンのUSB(例えば、USB2.0)は、最大480Mbps(メガビット毎秒)まで転送することができる。
【0005】
USBデバイスを提供するベンダは一般に、これらの装置にアクセスすることを可能にするためのデバイスドライバを提供することが求められる。一般に、デバイスドライバは、プログラム、および、コンピュータシステムが装置にアクセスすること(例えば、データを装置から読み取ること、データを装置に書き込むこと、コマンドを装置に送信すること、および、状態データを装置から受信すること)を可能にするデータのセットである。
【0006】
現在、大部分のUSBデバイスのベンダは、それらの装置用のカーネルモードのデバイスドライバを提供することが求められる。一般に、カーネルはオペレーティングシステム(OS)の中心部であり、OSの実行中にアクティブなまま存続し、コンピュータシステムをコントロールする。例えば、カーネルは、必要なサービス(メモリおよびプロセス管理など)をコンピュータシステムに提供する。結果として、カーネルモードのドライバは、最小の誤動作(またはバグ)の場合に復旧不可能なシステム全体のクラッシュを容易に引き起こす可能性がある。加えて、USBドライバをカーネルモードで実装するには、カーネルモードのドライバをテストするために必要な余分のハードウェアまたはソフトウェアに加えて、複雑なカーネルモードのドライバのプログラミングへの時間およびエネルギーの投資が必要となる。さらに、OSのアップグレード時に、互換性のない、または旧式のカーネルモードのデバイスドライバがクラッシュを引き起こし、システムのアップグレードの成功を妨げる場合がある。
【発明の概要】
【発明が解決しようとする課題】
【0007】
汎用USBドライバを提供するための技術を開示する。より詳細には、汎用USBデバイスドライバのアーキテクチャを説明し、このアーキテクチャは、汎用カーネルモードのドライバと通信する、ユーザモードのUSBライブラリを通じた開発を可能にする。
【課題を解決するための手段】
【0008】
説明する実施態様では、方法は、装置のプラグインのイベントに応答して、カーネルモードの汎用デバイスドライバをロードすることを含む。ユーザのソフトウェアコンポーネントは、汎用デバイスドライバと通信する汎用的なユーザモードのライブラリ(例えば、ダイナミックリンクライブラリ(DLL))によって提供されたルーチンを利用することによって、装置にアクセスする。
【0009】
もう1つの実施態様では、分離した汎用デバイスドライバは、プラグインされた装置毎に、または装置によってサポートされた機能毎にロードされる。
【0010】
いくつかの実施態様では、製造品がコンピュータプログラム製品として提供される。コンピュータプログラム製品の1つの実施態様は、コンピュータシステムによって読取可能であり、コンピュータプログラムをエンコードする、コンピュータプログラム記憶媒体を提供する。コンピュータプログラム製品のもう1つの実施態様は、コンピューティングシステムにより搬送波において組み立てられ、コンピュータプログラムをエンコードする、コンピュータのデータ信号において提供することができる。
【0011】
また、コンピュータプログラム製品は、コンピュータ処理をコンピュータシステム上で実行するためのコンピュータプログラムをエンコードする。コンピュータ処理は、装置のプラグインのイベント(プラグアンドプレイのモジュールによって検出することができる)に応答して、カーネルモードの汎用デバイスドライバをロードする。ユーザのソフトウェアコンポーネントは、汎用的なユーザモードのライブラリ(例えば、ダイナミックリンクライブラリ(DLL))によって提供されたルーチンを利用することによって、装置にアクセスする。
【0012】
他の実施態様もまた、本明細書で説明および列挙する。
【0013】
詳細な説明を、添付の図面を参照して説明する。図面では、参照符号の一番左の数字は、その参照符号が最初に現れる図を識別する。異なる図における同じ参照符号の使用は、類似または等しい項目を指示する。
【図面の簡単な説明】
【0014】
【図1】汎用デバイスドライバのための例示的システムを例示する図である。
【図2】複数の装置のための汎用デバイスドライバの複数の場合の例示的システムを例示する図である。
【図3】汎用デバイスドライバを利用するための例示的方法を例示する図である。
【図4】汎用デバイスドライバにおけるI/O処理を行うための例示的方法を例示する図である。
【図5】汎用デバイスドライバにおける電源管理を提供するための例示的方法を例示する図である。
【図6】本明細書で説明する技術を実装するために使用することができる、汎用のコンピュータ環境を例示する図である。
【発明を実施するための形態】
【0015】
以下の開示は、汎用デバイスドライバのアーキテクチャを提供するための技術を説明する。より具体的には、汎用USBドライバを提供するための技術を開示する。より詳細には、アーキテクチャは、汎用のカーネルモードドライバにアクセスするユーザモードのUSBライブラリを利用する。アーキテクチャは、部分的には、デバイスドライバの開発時間を短縮し、エンドユーザの体験を改善し(例えば、通常のオペレーション中であるか、アップグレード処理中であるかにかかわらず、システム全体のクラッシュを制限することによる)、テストおよびデバッグを集中させる。アーキテクチャをまた、入出力(I/O)処理、セキュリティおよび電源管理を改善するために利用することもでき、これをさらに本明細書で論じる。また、本明細書で説明する技術を、ソフトウェア、ファームウェア、ハードウェアおよび/またはそれらの組合せとして実装することができる。
【0016】
(汎用ドライバの概観)
図1は、汎用デバイスドライバのための例示的システム100を例示する。本明細書の図1および2における矢印の方向は、一実施態様によるデータの流れの方向を指示する。システム100には、カーネルモード環境102およびユーザモード環境104が含まれる。カーネルモード環境102にはUSBのコアスタック106が含まれ、USBのコアスタック106はOSの一部である場合があり、USBデバイスとの通信をハードウェアレベルで可能にする。USBのコアスタック106はハブ機能を促進することができ、これをさらに、図2を参照して説明する。USBのコアスタック106は、汎用USBドライバ108に結合される。汎用USBドライバ108はUSBデバイスのI/Oを管理し、より一般には、USBデバイスをユーザモード環境104に接続する。
【0017】
ユーザモード環境104には、汎用USBのユーザモードのライブラリ110およびユーザのソフトウェアコンポーネント112が含まれる。したがって、ユーザのソフトウェアコンポーネント112は、一実施態様ではユーザモードのソフトウェアコンポーネントである。汎用USBのユーザモードのライブラリ110はルーチン(またはアプリケーションプログラミングインターフェース(API))を提供し、APIをUSBユーザのソフトウェアコンポーネント112によって利用して、USBデバイスと通信するか、あるいはUSBデバイスをコントロールすることができる。一実施態様では、汎用USBのユーザモードのライブラリ110はDLLである。したがって、USBユーザのソフトウェアコンポーネント112は、ルーチンをカーネルモードではなくユーザモードで呼び出すことによって、USBデバイスをユーザモード環境104から管理することができる。いくつかの例示的APIを、以下で同一見出しの下でさらに論じる。
【0018】
このような実施態様は、システム全体のクラッシュを減らすために想定され、理由は、USBユーザのソフトウェアコンポーネント112(または、汎用USBのユーザモードのライブラリ110によって提供されたルーチン)がクラッシュする場合、カーネルのオペレーションは影響を受けないままであるからである。加えて、このようなシステム(100)は、デバイスドライバの開発時間を短縮し、テストおよびデバッグを集中させる(部分的には、ただ1つのコンピュータシステムのみが、USBインターフェースをテストするために必要とされ、すなわち、ユーザモードのソフトウェアコンポーネントがクラッシュするときでさえ、システムは作動可能のままであるからである)。
【0019】
一実施態様では、USBのコアスタック106と汎用USBドライバ108との間の通信インターフェースに対応するデータは、USBユーザのソフトウェアコンポーネント112と汎用USBのユーザモードのライブラリ110との間のインターフェースに関する情報も同様に、開発者に公開され、またはそうでない場合は公に入手可能である。一実施態様では、汎用USBドライバ108と汎用USBのユーザモードのライブラリ110との間のインターフェースに関する情報を、公開する必要はない。
【0020】
(複数の装置のための汎用ドライバ)
図2は、複数の装置のための汎用デバイスドライバが複数の場合の、例示的システム200を例示する。システム200には、カーネルモード環境102、ユーザモード環境104、USBのコアスタック106、汎用USBのユーザモードのライブラリ110、および、USBユーザのソフトウェアコンポーネント112が含まれる。
【0021】
システム200には、データを通信するためのUSBバス202が含まれる(以下に、図6を参照してさらに論じる)。しかし、USBバスは一例であり、他のタイプのデータ通信バス(有線または無線通信バス、例えば、ブルートゥース、small computer system interface(SCSI)など)を、システム200において利用することができる。
【0022】
図2に例示するように、USBバス202はUSBのコアスタック106に結合される(図1に関して説明したように)。USBのコアスタック106は、次に、USBハブ206との通信を容易にするために、物理デバイスオブジェクト(PDO)に結合される。USBハブ206は、複数のUSBデバイスがカーネルモード環境102内で処理されることを可能にする。したがって、汎用USBドライバ(108)を、カーネルモード環境102とユーザモード環境104との間で結合することができることが想定される。
【0023】
図2に例示するように、複数のPDOを、様々なドライバ(例えば、汎用USBドライバ108およびUSB複合ドライバ(USB composite driver)208)との通信を容易にするために利用することができる。ユーザ環境104は、各汎用USBドライバ(108)と、グローバル一意識別子(GUID)210によって発見および/または識別された機能を通じて通信することができる。各GUID210は、USBインターフェース/機能を一意に識別する。1つの例示的実施態様では、ワシントン州レドモンドのMicrosoft Corporationを通じて入手可能なWindows(登録商標)OSなど、OSレジストリファイルおよび/またはドライバファイル(例えば、情報ファイル(INF))内のGUIDキーのためのフォーマットは、以下の通りである。
【0024】
HKR,,DeviceInterfaceGUID,,"{058815B2-9805-47d3-B7D5-ABC464D3CA06}"
したがって、各GUID210は、対応する装置によってサポートされた機能を識別し、これらの機能を、USBのユーザモードのソフトウェアコンポーネント112によって利用することができる。例えば、ユーザモードのソフトウェアコンポーネントは、それらの重要なGUIDを接続するいかなるドライバをも検索して、所望の機能性をサポートする装置を発見するようになる。USBのユーザモードのソフトウェアコンポーネント112は次いでUSBデバイスと、図1を参照して説明したように汎用USBのユーザモードのライブラリ110を通じて通信することができる。
【0025】
複数のUSBハブ(206)を利用して、複数のUSBデバイス、または、単一のUSBデバイス内に組み込まれた機能との通信を可能にすることができることが想定される。例えば、USBハブ(206)を利用して、キーストロークボタンまたは統合されたポインティングデバイス(例えば、ジョイスティックおよびまたはタッチパッド)に加えて、マルチメディアのコマンドボタンを有するキーボード内の異なる機能へのアクセスを可能にすることができる。
【0026】
(汎用デバイスドライバの操作)
図3は、汎用デバイスドライバを利用するための例示的方法300を例示する。プラグアンドプレイ(PNP)モジュール(例えば、OS内に常駐する)によって検出することができる、プラグインのイベントが発生すると(302)、コアスタック(例えば、図1および2の106)は、プラグインされた装置に対応するデバイスIDを抽出する。抽出されたデバイスIDは、PNPモジュールによって提供または検出され(306)、PNPモジュールは、抽出されたデバイスIDを汎用ドライバ(例えば、図2の108)と突き合わせる(308)。
【0027】
突き合わせた汎用ドライバ(例えば、図1および2の108)がロードされて(310)、ステージ310のロードされたデバイスドライバとユーザのソフトウェアコンポーネント(例えば、図1および2の112)との間の通信を促進する。ステージ312で、一意のIDが登録される(図2の210を参照して説明したものなど)。最後に、プラグインされた装置に、ユーザのソフトウェアコンポーネントによって、汎用デバイスドライバを通じてアクセスすることができる(314)。
【0028】
一実施態様では、PNPモジュールが、別のデバイスIDではなく、抽出されたデバイスIDを汎用デバイスドライバと突き合わせる(例えば、汎用デバイスドライバが、プラグインされた装置と互換性がある場合)ことが想定される。これは、いかなる追加のドライバをロードする必要性をも除く。したがって、一実施態様では、カーネルモードの汎用デバイスドライバは、装置のプラグインイベントに応答してロードされ、ユーザのソフトウェアコンポーネントは、汎用のユーザモードのライブラリによって提供されたルーチンを利用することによって、装置にアクセスする。汎用のユーザモードのライブラリを、汎用デバイスドライバに結合して通信可能にする。ルーチンをAPIとして実装することができる(これを以下で、「例示的API」という見出しの下でさらに説明する)。さらに、分離した汎用デバイスドライバを、プラグインされた装置(または、装置によってサポートされた機能)毎にロードすることができる。
【0029】
(汎用デバイスドライバにおけるI/O処理)
図4は、汎用デバイスドライバにおけるI/Oを処理するための例示的方法400を例示する。一実施態様では、方法400では、ユーザのソフトウェアコンポーネント(例えば、図1および2の112)は、少数のルーチンをコールすることによって、ハードウェア特定のI/O処理を汎用デバイスドライバ(例えば、図1および2の108)に任せることを可能にする。例えば、ユーザのソフトウェアコンポーネントは単に、汎用USBのユーザモードのライブラリ(例えば、図1の110)を通じて提供された初期化、読み取り/書き込み、およびコマンドの解放を発行し、特定のデータ長の処理(consideration)、データの断片化、および/またはデータの再アセンブリを汎用デバイスドライバに任せることができる。
【0030】
例えば、初期化は汎用USBのデバイスドライバの状態およびビヘイビア(behavior)をデフォルトにリセットし、さらなる操作を処理するために汎用USBデバイスドライバを準備することができる。読み取りは、対応する装置上の特定のエンドポイントからデータを読み取ることができ、書き込みは、対応する装置上の特定のエンドポイントにデータを書き込むことができる。解放は、初期化により開始されたセッション中に要求されたすべてのリソースをクリーンアップすることができる。
【0031】
データ長の処理に関して、USB入力(すなわち、装置から、図5を参照して論じるホストまたはコンピューティングシステムへのデータ)のエンドポイントは、0バイトからそのエンドポイントの指定された最大パケットサイズまでのいかなるサイズでも一度に転送することができるので、ホストシステム上のソフトウェアによって、転送内のパケット毎にこの最大サイズまでを受信するように準備する必要がある(ただし、転送が複数のパケットで構成される場合)。ユーザモードのソフトウェアコンポーネント(例えば、図1および2の112)は、転送がこの最大パケットサイズの倍数ではない、転送を要求する場合、汎用USBのデバイスドライバは、自動的にこの転送のサイズを調整することができる。したがって、ユーザのソフトウェアコンポーネントが、装置からすべての可能なデータ転送サイズを処理するために不十分な長さを有するデータ転送を要求する場合、データ転送の長さを増大する。これは、クライアントの(クライアントは、ユーザモードのソフトウェアコンポーネントである)バッファを少なくとも2つに分離した転送に分割することによって、実施することができる(これはまた「セグメンテーション」とも呼ばれる)。第1の転送サイズは、クライアントの要求した転送サイズよりも小さい、最大パケットサイズ(以下で「MaxPacket」)の最大倍数にすることができる。この第1の転送のためのバッファは、クライアントのバッファの第1のN*MaxPacket(ただし、この値は、この第1の下位転送のサイズである)であるので、メモリコピーを必要としない。第2の転送は、MaxPacketバイトである。この第2の転送のためのバッファは、一実施態様では新たに割り振られたバッファである。両方の転送が完了した後、第2の転送からのデータは、クライアントバッファを埋めるか、あるいはショートパケットに到達するまで、クライアントのバッファに戻すようにコピーされる。いずれかのデータが、コピーの後に第2の転送から残される場合、そのエンドポイントのためのパイプのポリシーに基づいて、このデータを次の転送要求のために保存しても保存しなくてもよい。第1の転送内にショートパケットがある場合、第2の転送は決して発行されない場合があることも想定される。
【0032】
また、USBホストコントローラは、USBのコアスタック(例えば、図1および2の106)と共に、特定のサイズまでの転送バッファのみを処理する場合が多い。このサイズは、異なるホストコントローラの実装によって異なる場合がある。汎用USBのデバイスドライバはこれらのサイズ制限を考慮に入れ、クライアントの転送要求がこの制限を越える場合、転送は2つ以上の転送に分割され、すべての転送はこの制限以下である。一実施態様では、これを実装するために必要とされるバッファコピーはなく、理由は、各下位転送のバッファが単にクライアントの元のバッファの一部であるからである。
【0033】
図4に例示するように、方法400はステージ402では、例えば、装置にアクセスするために利用されるデータ構造体を定義することによって、初期化する。初期化ステージは、ポリシー設定をデフォルト値にリセットすることができる(以下で、WinUsb_Initializeなど、例示的APIを参照してさらに説明する)。初期化ステージは、一実施態様では、汎用のユーザモードのライブラリ(例えば、図1および2の110に関連付けられたDLL)が実行することを可能にする。
【0034】
方法400はパイプのポリシーを定義し(404)、パイプのポリシーは、汎用デバイスドライバのビヘイビアを定義することができ、ビヘイビアには例えば、タイムアウト、パケットの終了、エラーからの自動復旧、パケットの終了のガイドライン、ショートパケットの処理、転送されるべきデータの量を予想するために実際のデータに先立ってヘッダを読み取るために使用されるなどの部分的読み取り、重要ではない余分なデータの廃棄、および/または生データの処理(ユーザのソフトウェアコンポーネントが適切なデータ処理を保証中であることを指示する)が含まれ、これを以下で、WinUsb_SetPipePolicyなど、例示的APIを参照してさらに説明する。一実施態様では、各エンドポイントは、個別に構成可能である汎用USBドライバにおいてパイプを有することができる。
【0035】
これらの例示的なパイプのビヘイビアの設定のいくつかを以下で、様々な実施態様によってさらに説明する。
【0036】
・ タイムアウト−このパイプのポリシーを特定のエンドポイントについて設定することができ、結果として、そのエンドポイントに関して、指定された合計時間内で完了しないいかなる転送をキャンセルする。
【0037】
・ パケットの終了のガイダンス−いくつかのUSBデバイスのプロトコルでは、ホストコンピューティングシステムが(ホストから装置への)出力転送の終了時に、ショートパケット(エンドポイントで指定された、しきい値の最大パケットサイズより小さいパケット)によりマークを付けることを必要とする。クライアントの転送がその最大パケットサイズの倍数である場合、ゼロの長さのパケットが送信される。これは、ユーザのソフトウェアコンポーネント(またはクライアント)に対して自動的に行うことができ、クライアントが最大パケットサイズについて、または、転送がこのサイズの倍数であるかどうかを心配する必要がないようにする。
【0038】
・ エラーからの自動復旧−特定のエンドポイント上の特定の転送のためにUSBバス上に転送エラーがある場合、自動復旧メカニズムを使用可能にして、エラー状態をクリアするように試みることができ、さらなる転送が発行されることが可能になるようにする。また、エラー状態が復旧不可能である場合がある(すなわち、さらなる転送は発生しないようになる)ことも想定される。
【0039】
・ ショートパケットの処理−一般に、ショートパケットがUSBデバイス上の特定のエンドポイントから受信される場合、転送は、USBのコアスタック(例えば、図1および2の106)によって完了される。ユーザのソフトウェアコンポーネントは、転送の完了を引き起こすように意図しないこともあれば、むしろ、指定されたバイト数が受信されるまで、装置からの読み取りを続けるようになることもある。一実施態様では、ショートパケットを、このようなイベントを無視してデータを読み取り続けるように汎用USBのデバイスドライバを構成することによって、処理することができる。この処理を、最後に受信されたバイトの1バイト過ぎ示すバッファを用いて、早まって完了された転送を再発行することによって実装することができる。
【0040】
・ 部分的読み取り−いくつかのデバイスプロトコルには転送の開始でヘッダが含まれ、ヘッダは、サイズ情報、転送の型などを含む、データについての情報を含む。いくつかのクライアントは、転送の残りを処理する方法を決定する前に、このヘッダのみを読み取ることを望む場合がある。このようなシナリオに対処するために、クライアントは対応するパイプ(転送がターゲットとされるパイプ)のためのビヘイビアを設定して、クライアントがヘッダのみを読み取ることを可能にすることができ、次いで、汎用USBのデバイスドライバは、そのパケット内のヘッダの後に受信された、いかなる追加のデータをも保存して、この追加のデータがクライアントの後続の転送の開始に追加されるようにすることができる。
【0041】
・ 余分なデータの廃棄−装置が、パケット内でクライアントが要求したよりも多いデータを送信する場合、クライアントは、エンドポイントのための汎用USBのデバイスドライバのビヘイビアを、その余分なデータを廃棄するように、あるいはその余分なデータが後続の転送の開始に追加されるように、構成することができる。
【0042】
・ 生データ−いくつかのクライアントは、汎用USBのデバイスドライバの自動的なビヘイビアの訂正を迂回するために、例えば特定の装置の特徴に関して性能を改善するために、クライアント自体で転送制限を管理する方がよい。これらのクライアントは、特定のエンドポイントに関する汎用USBのデバイスドライバのビヘイビアを構成することができ、クライアントのビヘイビアを訂正するのではなく、その代わりに正しいクライアントのビヘイビアを要求するようにする。したがって、この手法は、すべて正しいビヘイビアのクライアント要求がコアのUSBスタックに直接渡されることを可能にする。
【0043】
一実施態様では、ユーザのソフトウェアコンポーネントは次いで、先入れ先出し(FIFO)のバッファのポリシーを定義することができ(406)(例えば、特定のパイプ(エンドポイント)のため)、装置からFIFOを埋め始めることができ(408)、これを以下で、WinUsb_SetFifoPolicyおよびWinUsb_StartFifoなど、例示的APIを参照してさらに説明する。次いで、FIFOを読み取ることができる(例えば、後述のWinUsb_ReadFifo APIをコールすることによる)。一実施態様では、1つのFIFOがパイプ毎に提供される。また、WinUsb_ReadPipeを使用することによってデータを読み取ることができることも、想定される。したがって、FIFOはデータを読み取るために必要とされない。しかし、FIFOを、任意の時間でデータを生成することができる、あるいは例えば、常にデータをストリームする、特定のクラスの装置のために使用することができる。
【0044】
次いでステージ410で、パイプが読み取られ、あるいは書き込まれる。また、以下で詳述するように、他のAPIがI/O処理のために使用可能であり、これらの他のAPIは、ユーザのソフトウェアコンポーネントがI/O関数をより細かく制御することを可能にする。例えば、一実施態様では、装置が、クライアントバッファにとって大きすぎるパケットにより応答する場合、データは次の転送の開始で追加される(このオプションを、例えば、Allow_Partial_Readsによって使用可能にする場合)。
【0045】
(例示的API)
1つまたは複数の例示的APIを以下で例示し、これらのAPIをMicrosoftのWindows(登録商標)環境内で利用して、図1および2を参照して説明したルーチンを提供することができる。例えば、ルーチン(例えば、図1および2の汎用USBのユーザモードのライブラリ110の中にある)は、以下の動作(以下でさらに説明する)をサポートすることができる。
【0046】
・ USB記述子の装置、構成、インターフェースおよび文字列について問い合わせること、
・ GUIDのデバイスインターフェースのクラスに関連付けられたUSBのデバイスインターフェースを列挙し、ベンダにより供給されたコールバックのルーチンを用いて、これらのインターフェースをフィルタリングすること、
・ USBデバイスのいくつかのインターフェースを選択的に起動状態にし、他のインターフェースを使用しない状態のままにすること、
・ 標準のコントロール転送の要求を生成すること、および/または
・ コントロール、バルク、割り込み、および等時性のデータを伝送すること。
【0047】
後述の例示的APIは、それらがMicrosoftのWindows(登録商標)OSに関する汎用USBのデバイスドライバに対応することを示すために、「WinUSB」によって始められる。他の名前付け規則が利用される場合があることは想定される。また、各APIのためのサンプルのコール、パラメータ、および戻り値を以下で強調する。
【0048】
(1.WinUsb_Initialize)
WinUsb_Initializeの関数は、WinUsbのデータ構造体を初期化する。この関数がコールされる場合、ポリシー設定はデフォルト値にリセットされることに留意されたい。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_Initialize(
IN HANDLE DeviceHandle,
OUT PWINUSB_INTERFACE_HANDLE InterfaceHandle
);
【0049】
(パラメータ)
(DeviceHandle)
ファイルを作成するためのルーチン(例えば、CreateFile)によって戻された装置へのハンドル。WinUsbはオーバーラップされたI/Oを使用して、フラッグ(例えば、FILE_FLAG_OVERLAPPED)がCreateFileコールにおいて指定されるべきであるようにする。
【0050】
(InterfaceHandle)
これは、他のすべてのWinUSBのAPI関数コールのために使用することができる、インターフェースのハンドルである。これは、WinUSBによって生成される不透明なハンドル(opaque handle)である。
【0051】
(戻り値)
この関数は、成功した場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0052】
(2.WinUsb_Free)
WinUsb_Freeの関数は、WinUsb_Initializeによって割り振られたすべてのリソースを解放する。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_Free(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle
);
【0053】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0054】
(戻り値)
この関数は、成功した場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0055】
(3.WinUsb_QueryAlternateInterface)
WinUsb_QueryAlternateInterfaceの関数は、特定のインターフェースのハンドルのための第1の代替のインターフェースの記述子を戻す。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_QueryAlternateInterface(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR AlternateInterfaceNumber,
OUT PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor
);
【0056】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0057】
(AlternateInterfaceNumber)
これは、戻すべき代替のインターフェースを指示する値である。0の値は、第1の代替のインターフェースを指示し、1の値は、第2の代替のインターフェースを指示する、などとなる。
【0058】
(UsbAltInterfaceDescriptor)
コール側によって割り振られたUSB_INTERFACE_DESCRIPTORの構造体へのポインタ。
【0059】
(戻り値)
この関数は、成功し、構造体をポピュレート(populate)した場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0060】
(4.WinUsb_QueryDeviceinformation)
WinUsb_QueryDeviceinformationの関数は、WINUSBインターフェースに関連付けられる物理デバイスについての情報を戻す。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_QueryDeviceInformation(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN ULONG InformationType,
IN OUT PULONG BufferLength,
OUT PVOID Buffer
);
【0061】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0062】
(InformationType)
これは、どのインターフェースの情報の値を検索するべきであるかを指定する値である。
【0063】
(BufferLength)
これは、バイト単位のBufferの長さ、すなわち、読み取るべき最大のバイト数である。このパラメータを、Bufferにコピーされた実際のバイトの数に設定することができる。
【0064】
(Buffer)
これは、要求された値を受信する、コール側によって割り振られたバッファである。
【0065】
(戻り値)
この関数は、成功し、構造をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0066】
(注記)
以下のリストは、可能性のあるInformationTypeの値を説明する。
【0067】
(DEVICE_SPEED(0x01))
この要求は、以下の値のうち1つを、装置の速度に基づいて戻すようになる。
LowSpeed(0x01)
FullSpeed(0x02)
HighSpeed(0x03)
【0068】
(PHYSICAL_DEVICE_ID(0x02))
この値は、装置の物理デバイスの識別子を含む。
【0069】
(5.WinUsb_GetDescriptor)
WinUsb_GetDescriptorの関数は、要求された記述子を戻す。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetDescriptor(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR DescriptorType,
IN UCHAR Index,
IN USHORT LanguageID,
OUT PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred
);
【0070】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0071】
(DescriptorType)
これは、戻すべき記述子のタイプを指定する値である。標準の値については、非特許文献1のUSB仕様を参照することができる。
【0072】
(Index)
これは記述子インデックスであり、非特許文献1のUSB仕様において文書化されている。
【0073】
(LanguageID)
要求された記述子が文字列の記述子である場合、これは言語の識別子を指定する値である。
【0074】
(Buffer)
これは、要求された記述子を受信する、コール側によって割り振られたバッファである。
【0075】
(BufferLength)
これは、バイト単位のBufferの長さ、すなわち、読み取るべき最大のバイト数である。
【0076】
(LengthTransferred)
これは、Bufferにコピーされた実際のバイトの数を受信する。
【0077】
(戻り値)
この関数は、成功し、構造をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0078】
【非特許文献1】http://www.usb.orgで入手可能であるUSB仕様 (6.WinUsb_SetCurrentAlternateInterface) WinUsb_SetCurrentAlternateInterfaceの関数は、インターフェースのための指定された代替のインターフェースの設定を選択する。このAPIをコールするための例示的メソッドは以下の通りである。 BOOL_stdcall WinUsb_SetCurrentAlternateInterface( IN WINUSB_INTERFACE_HANDLE InterfaceHandle, IN UCHAR InterfaceNumber );
【0079】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0080】
(InterfaceNumber)
これは、PUSB_INTERFACE_DESCRIPTORの構造体のbInterfaceNumberメンバに含まれた値であり、WinUsb_QueryAlternateInterfaceによってポピュレートされたものである。
【0081】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0082】
(7.WinUsb_GetCurrentAlternateInterface)
WinUsb_GetCurrentAlternateInterface関数は、インターフェースのための現在の代替のインターフェースの設定を得る。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetCurrentAlternateInterface(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
OUT PUCHAR InterfaceNumber
);
【0083】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeから戻されたインターフェースのハンドルである。
【0084】
(InterfaceNumber)
これは、現在選択された代替のインターフェースを受信するようになる、UCHARへのポインタである。
【0085】
(戻り値)
この関数は、関数が成功し、構造体をポピュレートする場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorへのコールによって検索することができる。
【0086】
(8.WinUsb_QueryPipe)
WinUsb_QueryPipeの関数は、インターフェースに関連付けられる、指定されたパイプについてのパイプの情報を戻す。デフォルトのコントロールのパイプは戻されない場合があることに留意されたい。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_QueryPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR AlternateInterfaceNumber,
IN UCHAR PipeIndex,
OUT PWINUSB_PIPE_INFORMATION PipeInformation
);
【0087】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0088】
(AlternateInterfaceNumber)
これは、情報が戻されるべき先の代替のインターフェースを指定する値である。
【0089】
(PipeIndex)
これは、情報が戻されるべき先のパイプを指定する値である。この値は、一実施態様では、PipeIdと同じではない。そうではなく、この値は、インターフェースのリストにおけるパイプを表現する。0の値は第1のパイプを示し、1の値は第2のパイプを示す、などとなる。この値は、インターフェースの記述子におけるbNumEndpointsより小さくなるべきである。
【0090】
(PipeInformation)
これは、コール側によって割り振られたWINUSB_PIPE_INFORMATIONの構造体へのポインタである。
【0091】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0092】
(注記)
WINUSB_PIPE_INFORMATIONの構造体の定義を、以下のようにすることができる。
typedef struct_WINUSB_PIPE_INFORMATION {
USBD_PIPE_TYPE PipeType;
UCHAR PipeId;
USHORT MaximumPacketSize;
UCHAR Interval;
} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION;
【0093】
PipeIdのメンバは、USBの8ビット(16進)のエンドポイントアドレスであり、このアドレスは7ビットアドレスおよび符号ビット(direction bit)からなる。
【0094】
(9.WinUsb_SetPipePolicy)
WinUsb_SetPipePolicyの関数は、特定のパイプ(エンドポイント)のポリシーを設定する。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_SetPipePolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN ULONG PolicyType,
IN ULONG ValueLength,
IN ULONG_PTR Value
);
【0095】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0096】
(PipeID)
これは、パイプのポリシーを設定するためのパイプに属するパイプの識別子である。
【0097】
(PolicyType)
これは、変更するべきポリシーパラメータを指定する値である。
【0098】
(ValueLength)
これは、Valueが指すバッファの、バイト単位の長さであり、あるいは、Valueがバッファを指さない場合、ゼロである。
【0099】
(Value)
PolicyTypeによって指定されるポリシーのパラメータのための新しい値。
【0100】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0101】
(注記)
以下のリストは、可能性のあるPolicyType値を説明する。
【0102】
(SHORT_PACKET_TERMINATE(0x01))
ValueがTRUEである(ゼロではない)場合、エンドポイントのための最大パケットサイズの倍数であるあらゆるWRITE(OUT)要求は、ゼロの長さのパケットにより終了される。デフォルトはFALSEである。
【0103】
(AUTO_CLEAR_STALL(0x02))
ValueがTRUEである(ゼロではない)場合、停止のPIDは無視されるようになり、先入れ先出し(FIFO)のバッファリングが使用中でない限り、エラーが戻されるようになる。この場合、しかし、パイプは停止されないようになり、データは流れ続けるようになる。このパラメータはCONTROLのパイプに影響を及ぼさない。ホストが自動的に装置の停止状態をクリアすることに留意されたい。デフォルトはFALSEである。
【0104】
(PIPE_TRANSFER_TIMEOUT(0x03))
Valueは、転送が後にキャンセルされるべきである、ミリ秒単位の合計時間である。ゼロの値は、無限大の合計時間を示す。デフォルトは無限大の合計時間である。
【0105】
(IGNORE_SHORT_PACKETS(0x04))
ValueがTRUEである(ゼロではない)場合、読み取り操作は、ショートパケットを受信する場合、完了しないようになる。その代わりに、この操作は、指定されたバイト数が読み取られる場合のみ完了するようになる。ValueがFALSEである場合、読み取り操作は、指定されたバイト数が読み取られるか、あるいはショートパケットを受信する場合、完了するようになる。デフォルトはFALSEである。
【0106】
(ALLOW_PARTIAL_READS(0x05))
ValueがFALSE(ゼロ)である場合、読み取り要求は、装置が要求されたよりも多くのデータを戻す場合、失敗するようになる。ValueがTRUEである場合、余分なデータが保存され、この余分なデータは、次に来る読み取り要求のためのデータの開始で戻される。デフォルトはTRUEである。
【0107】
(AUTO_FLUSH(0x06))
ValueがFALSE(ゼロ)であり、装置が要求されたよりも多くのデータを戻す場合、残りのデータは廃棄されるようになる。ValueがTRUEである場合、ビヘイビアは、ALLOW_PARTIAL_READSの値によって決まる。データは保存され、次いで次に来る読み取り要求のためのデータの開始で戻されるようになるか、あるいは、要求は失敗するようになる。デフォルトはFALSEである。
【0108】
(Raw_IO(0x07))
これは、ユーザのソフトウェアコンポーネント(図1〜2の112など)が適切なデータ処理を保証することを可能にする。ユーザのソフトウェアコンポーネントによって提供されたデータが不適切なフォーマットである場合、データはフラッシュ(flush)される場合がある。
【0109】
(10.WinUsb_GetPipePolicy)
WinUsb_GetPipePolicyの関数は、特定のパイプ(エンドポイント)のポリシーを得る。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetPipePolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN ULONG PolicyType,
IN OUT PULONG ValueLength,
OUT PVOID Value
);
【0110】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0111】
(PipeID)
これは、パイプのポリシーを得るためのパイプに属するパイプの識別子である。
【0112】
(PolicyType)
これは、得るべきポリシーのパラメータを指定する値である。
【0113】
(ValueLength)
これは、Valueが指すバッファの長さへのポインタである。出力で、このパラメータは、Valueのバッファにコピーされたデータの長さを受信する。
【0114】
(Value)
これは、指定されたパイプのポリシーを受信するバッファへのポインタである。
【0115】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0116】
(11.WinUsb_SetFifoPolicy)
WinUsb_SetFifoPolicyの関数は、特定のパイプ(エンドポイント)のポリシーを設定する。このAPIをコールするための例示的メソッドは以下の通りである。
B00L_stdcall
WinUsb_SetFifoPolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN ULONG PolicyType,
IN ULONG ValueLength,
IN ULONG_PTR Value
) ;
【0117】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0118】
(PipeID)
これは、パイプのポリシーを設定するためのパイプに属するパイプの識別子である。
【0119】
(PolicyType)
これは、変更するべきポリシーのパラメータを指定する値である。
【0120】
(ValueLength)
これは、Valueが指すバッファのバイト単位の長さであり、あるいは、Valueがバッファを指さない場合、ゼロである。
【0121】
(Value)
これは、PolicyTypeによって指定されるポリシーのパラメータのための新しい値である。
【0122】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0123】
(注記)
以下のリストは、可能性のあるPolicyTypeの値を説明する。
【0124】
(FIFO_SIZE(0x01))
Valueは、FIFOの入力バッファの、バイト単位のサイズである。デフォルト値は16×MaxPacketSizeである。この制限に到達する場合、データは失われるようになる。
【0125】
(NOTIFICATION_THRESHOLD(0x03))
Valueは、コールバックの関数がコールされる前にFIFOのバッファ内に存在するべきであるバイト数である。IGNORE_SHORT_PACKETSがFALSEであり、ショートパケットを受信する場合、いずれにしてもコールバックの関数がコールされるようになる。
【0126】
(12.WinUsb_GetFifoPolicy)
WinUsb_GetFifoPolicyの関数は、特定のパイプ(エンドポイント
)のポリシーを得る。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetFifoPolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN ULONG PolicyType,
IN OUT PULONG ValueLength,
OUT PVOID Value
) ;
【0127】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0128】
(PipeID)
これは、パイプのポリシーを得るためのパイプに属するパイプの識別子である。
【0129】
(PolicyType)
これは、得るべきポリシーのパラメータを指定する値である。
【0130】
(ValueLength)
これは、Valueが指すバッファの長さへのポインタである。出力で、このパラメータは、Valueバッファにコピーされたデータの長さを受信する。
【0131】
(Value)
これは、指定されたFIFOのポリシーのパラメータを受信するバッファへのポインタである。
【0132】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0133】
(13.WinUsb_StartFifo)
WinUsb_StartFifoの関数は、データを装置からFIFOのバッファに読み込む自動的な読み込みのメカニズムを起動する。データがこのバッファに追加されるとき、FifoDataNotificationの関数がコールされ、この関数は、クライアントにデータの存在を通知する。クライアントは次いで、データをFIFOのバッファから読み取るための要求を発行することができる。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_StartFifo(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN PWINUSB_NOTIFICATION_CALLBACK FifoDataNotification,
IN PVOID FifoDataNotificationContext
);
【0134】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0135】
(PipeID)
これは、影響を及ぼすべきパイプに属するパイプの識別子である。
【0136】
(FifoDataNotification)
これは、通知のしきい値に到達する場合にコールされるべき、オプションのコールバックの関数である。
【0137】
(FifoDataNotificationContext)
これは、FifoDataNotificationのコールバックの関数に渡されるべき、オプションのコンテキストである。
【0138】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0139】
(注記)
PWINUSB_NOTIFICATION_CALLBACKの型宣言は、以下の通りである。
typedef
VOID
(*PWINUSB_NOTIFICATION_CALLBACK)(
WINUSB_INTERFACE_HANDLE InterfaceHandle,
UCHAR PipeID,
ULONG NotificationType,
PVOID NotificationParameter,
PVOID Context
);
【0140】
NotificationTypeのメンバに対する1つの可能な値は、FifoDataAvailable(0x01)である。この値は、FIFOのバッファが、NOTIFICATION_THRESHOLDバイトのReadFifoの要求が即時に完了するために十分なデータを含むことを、指示する。したがって、NotificationParameterのメンバを無視することができる。
【0141】
(14.WinUsb_StopFifo)
WinUsb_StopFifoの関数は、自動的な読み込みのメカニズムを停止させる。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_StopFifo(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID
);
【0142】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0143】
(PipeID)
これは、影響を及ぼすべきパイプに属するパイプの識別子である。
【0144】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0145】
(15.WinUsb_ReadFifo)
WinUsb_ReadFifoの関数は、データをパイプのFIFOのバッファから読み取る。USBのパケットサイズは、読み取り要求のための転送を考慮に入れないことに留意されたい。装置が、クライアントのバッファに対して大きすぎるパケットにより応答する場合、ALLOW_PARTIAL_READSがTRUEである場合は、データは次の転送の開始で追加される。ALLOW_PARTIAL_READSがFALSEである場合、読み取り要求は失敗するようになる。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_ReadFifo(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
OUT PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred,
IN LPOVERLAPPED Overlapped
);
【0146】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0147】
(PipeID)
これは、バッファから読み取るべきパイプの識別子である。
【0148】
(Buffer)
これは、データを読み込むべき、コール側によって割り振られたバッファである。
【0149】
(BufferLength)
これは、バイト単位のBufferの長さ、すなわち、読み取るべき最大のバイト数である。
【0150】
(LengthTransferred)
これは、Bufferにコピーされた実際のバイト数を受信する、ULONGへのポインタである。
【0151】
(Overlapped)
これは、OVERLAPPEDの構造体へのオプションのポインタであり、非同期の操作のために使用される。このパラメータが指定される場合、この関数は即時に戻るようになり、操作が完了するとき、イベントを信号で伝える。
【0152】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0153】
(16.WinUsb_ReadPipe)
WinUsb_ReadPipeの関数は、データをパイプから読み取る。USBのパケットサイズは、読み取り要求のための転送を考慮に入れないことに留意されたい。装置が、クライアントバッファに対して大きすぎるパケットにより応答する場合、ALLOW_PARTIAL_READSがTRUEである場合は、データは次の転送の開始で追加される。ALLOW_PARTIAL_READSがFALSEである場合、読み取り要求は失敗するようになる。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_ReadPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred,
IN LPOVERLAPPED Overlapped
);
【0154】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0155】
(PipeID)
これは、パイプから読み取るべきパイプの識別子である。
【0156】
(Buffer)
これは、データを読み込むべき、コール側によって割り振られたバッファである。
【0157】
(BufferLength)
これは、バイト単位のBufferの長さ、すなわち、読み取るべき最大のバイト数である。
【0158】
(LengthTransferred)
これは、Bufferにコピーされた実際のバイト数を受信する、ULONGへのポインタである。
【0159】
(Overlapped)
これは、OVERLAPPEDの構造体へのオプションのポインタであり、非同期の操作のために使用される。このパラメータが指定される場合、この関数は即時に戻るようになり、操作が完了するとき、イベントを信号で伝える。
【0160】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0161】
(17.WinUsb_WritePipe)
WinUsb_WritePipeの関数は、データをパイプに書き込む。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_WritePipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID,
IN PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred,
IN LPOVERLAPPED Overlapped
);
【0162】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0163】
(PipeID)
これは、書き込むべきパイプの識別子である。
【0164】
(Buffer)
これは、書き込むべきデータを含む、コール側によって割り振られたバッファである。
【0165】
(BufferLength)
これは、書き込むべきバイト数である。
【0166】
(LengthTransferred)
これは、パイプに書き込まれた実際のバイト数を受信する、ULONGへのポインタである。
【0167】
(Overlapped)
これは、OVERLAPPEDの構造体へのオプションのポインタであり、非同期の操作のために使用される。このパラメータが指定される場合、この関数は戻るようになり、操作が完了するとき、イベントを信号で伝える。
【0168】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0169】
(18.WinUsb_ControlTransfer)
WinUsb_ControlTransferの関数は、データを、デフォルトのコントロールのエンドポイントを介して送信する。このAPIをコールするための例示的メ
ソッドは以下の通りである。
BOOL_stdcall
WinUsb_ControlTransfer(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN WINUSB_SETUP_PACKET SetupPacket,
IN PUCHAR Buffer,
IN ULONG BufferLength,
OUT PULONG LengthTransferred,
IN LPOVERLAPPED Overlapped
);
【0170】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0171】
(SetupPacket)
これは、8バイトのセットアップのパケットである。
【0172】
(Buffer)
これは、転送するべきデータを含む、コール側によって割り振られたバッファである。
【0173】
(BufferLength)
これは、転送するべきバイト数であり、セットアップのパケットを含まない。
【0174】
(LengthTransferred)
これは、転送された実際のバイト数を受信する、ULONGへのポインタである。
【0175】
(Overlapped)
これは、OVERLAPPEDの構造体へのオプションのポインタであり、非同期の操作のために使用される。このパラメータが指定される場合、この関数は即時に戻るようになり、操作が完了するとき、イベントを信号で伝える。
【0176】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0177】
(注記)
WINUSB_SETUP_PACKETの構造体宣言は、以下の通りである。
typedef struct_WINUSB_SETUP_PACKET {
UCHAR RequestType;
UCHAR Request;
USHORT Value;
USHORT Index;
USHORT Length;
} WINUSB_SETUP_PACKET, *PWINUSB_SETUP_PACKET;
【0178】
(19.WinUsb_ResetPipe)
WinUsb_ResetPipeの関数は、データのトグルをリセットし、パイプ上の停止状態をクリアする。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_ResetPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID
);
【0179】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0180】
(PipeID)
これは、コントロールのパイプの識別子である。
【0181】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0182】
(20.WinUsb_AbortPipe)
WinUsb_AbortPipeの関数は、パイプに対して保留中の転送をすべてアボートする。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_AbortPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID
);
【0183】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0184】
(PipeID)
これは、コントロールのパイプの識別子である。
【0185】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0186】
(21.WinUsb_FlushPipe)
WinUsb_FlushPipeの関数は、クライアントが要求したよりも多くのデータを装置が戻す結果として、保存されたいかなるデータをも廃棄する。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_FlushPipe(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN UCHAR PipeID
);
【0187】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0188】
(PipeID)
これは、コントロールのパイプの識別子である。
【0189】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0190】
(電源管理)
図5は、汎用デバイスドライバにおける電源管理を提供するための例示的方法500を例示する。一実施態様では、方法500は、コンピューティングシステム(図6を参照して説明するものなど)が、装置(図1〜4を参照して説明したものなど)をコンピューティングシステムに接続する間に、低電力状態に入ることを可能にする。
【0191】
電源管理のポリシーは、接続された装置について、例えば汎用USBのユーザモードのライブラリ(例えば、図1の110)を通じて定義される(502)。電源のポリシーには、自動休止を許可するかどうか、装置が自動復帰可能かどうか、および/または、装置を休止するために、最小の遅延のしきい値を設定するかどうかについての項目(provision)が含まれる場合がある(WinUsb_SetInterfacePowerPolicyなど、例示的APIを参照してさらに説明する)。
【0192】
より具体的には、自動休止は、装置が「アイドル」になっている場合を検出することを含む場合があり、これは場合によっては、指定された合計時間において転送がなかったことを意味し、この時点で汎用USBドライバ(例えば、図1および2の108)は装置を休止して節電することができる。一実施態様では、汎用USBドライバは自動的に、装置が予備の電源を入れる必要がある場合を検出するようになり、適切な時間でそのように行うようになる。
【0193】
自動的にコンピューティングシステムを復帰することに関して、クライアント(図1および2の112など)は、汎用USBのデバイスドライバのビヘイビアを、装置がコンピューティングシステムを低電力状態(例えば、スタンバイまたはハイバネーション)から復帰させることを可能にするように、構成することができる。一実施態様では、汎用USBのデバイスドライバは、装置およびコンピューティングシステムをこの機能のために準備するために必要とされた、すべての操作を処理するようになる。
【0194】
さらに、遅延のしきい値の周期を設定することができ、クライアント(図1および2の112など)が、最後の転送の後から装置を休止する前までに経過するように、汎用USBのデバイスドライバが保証する必要のある合計時間を、指定することができるようにする。したがって、遅延のしきい値は、データ転送の後の周期を指定することができ、コンピューティングシステムは、この周期を、データ転送の後から装置が休止モードに入る前までに経過するよう待機する。
【0195】
休止モードに入るための条件が満たされた後(例えば、実際には電源のポリシーによって)(504)、装置は低電力状態に入る(506)。これは、装置が接続されるコンピューティングシステム(上述のように、配線を通じるか無線かにかかわらず)が低電力状態に入ることを可能にする(508)。
【0196】
方法500は、本明細書で説明した汎用デバイスドライバによって提供された機能を利用することによって、複数の装置がコンピューティングシステムに接続される状況においても、節電を可能にすることが想定される。すなわち、汎用デバイスドライバの構成がないと、コンピューティングシステムに接続された複数の装置は同時に、あるいは、コンピューティングシステムによって、有効で全体的な節電を可能にするために十分な周期に渡って、それらの休止モードに入ることができない可能性がある。
【0197】
様々な実施態様では、以下のリストは、電源管理の状態にわたるビヘイビアを要約する。
【0198】
・ すべてのパイプのハンドル、インターフェースのハンドル、ロックおよび代替設定は、電源管理のイベントに渡って保持される。
【0199】
・ 進行中であるいかなる転送も、低電力状態中に休止され、これらの転送は、システムが動作中であるときに再開される。クライアント(すなわち、ユーザのソフトウェアコンポーネント112)がFIFOのバッファを使用中である場合、そのバッファは、電源管理のコールバック後にリスタートされる。
【0200】
・ 装置特定の構成がリストアされるべきである場合、クライアント(すなわち、ユーザのソフトウェアコンポーネント112)は、システムが動作に戻る場合、そのようにす
るべきである。これを、WM_POWERBROADCASTのメッセージから決定することができる。
【0201】
・ クライアント(すなわち、ユーザのソフトウェアコンポーネント112)は、選択的な休止をサポートするために、WINUSB_SetInterfaceIdleをコールすることによって、インターフェースがアイドルであることを指示することができる。コール側は、装置がアイドルの間にリモートの復帰のために使用可能にされるべきであると指定することができる。直接的な動作は、このコールによって示唆されない。
【0202】
また、以下で詳述するように、電源管理を処理するために他のAPIが使用可能であり、これらのAPIは、ユーザのソフトウェアコンポーネントが電源管理の関数をより細かく制御することを可能にする。
【0203】
(1.WinUsb_SetInterfacePowerPolicy)
WinUsb_SetInterfacePowerPolicyの関数は、装置の電源のポリシーを設定する。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_SetInterfacePowerPolicy(
WINUSB_INTERFACE_HANDLE InterfaceHandle,
ULONG PolicyType,
ULONG ValueLength,
ULONG_PTR Value
);
【0204】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0205】
(PolicyType)
これは、変更するべきポリシーのパラメータを指定する値である。
【0206】
(ValueLength)
これは、Valueが指すバッファのバイト単位の長さであり、あるいは、Valueがバッファを指さない場合、ゼロである。
【0207】
(Value)
これは、PolicyTypeによって指定されるポリシーのパラメータのための新しい値である。
【0208】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0209】
(注記)
以下のリストは、可能性のあるPolicyType値を説明する。
【0210】
(AUTO_SUSPEND(0x01))
ValueがTRUEである(ゼロではない)場合、装置は、転送が保留中でない場合、休止されるようになる。デフォルトはTRUEである。
【0211】
(ENABLE_WAKE(0x02))
装置がWAKEをサポートする場合、ValueをTRUEに設定する。デフォルトはFALSEである。
【0212】
(SUSPEND_DELAY(0x03))
VALUEは、いずれかの転送の後から装置を休止することができるようになる前までに、ドライバが待機するべきである、ミリ秒単位の最小の合計時間である。デフォルトは5秒である。
【0213】
(2.WinUsb_GetInferfacePowerPolicy)
WinUsb_GetInferfacePowerPolicyの関数は、装置の電源のポリシーを得る。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_GetInterfacePowerPolicy(
IN WINUSB_INTERFACE_HANDLE InterfaceHandle,
IN ULONG PolicyType,
IN OUT PULONG ValueLength,
OUT PVOLD Value
);
【0214】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0215】
(PolicyType)
これは、得るべきポリシーのパラメータを指定する値である。
【0216】
(ValueLength)
これは、Valueが指すバッファの長さへのポインタである。出力で、このパラメータは、Valueのバッファにコピーされたデータの長さを受信する。
【0217】
(Value)
これは、指定された電源のポリシーを受信するバッファへのポインタである。
【0218】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0219】
(3.WinUsb_EnableInterfaceIdle)
WinUsb_EnableInterfaceIdleの関数は、インターフェースがアイドルであり、オペレーティングシステムが装置の電源を落とすことができること(USBの休止)を指示する。これは、ユーザモードのクライアントが選択的な休止をどのようにサポートするかである。パイプの1つへのいかなるアクセス(読み取りまたは書き込み)も、自動的にインターフェースをアイドル状態から引き出し、アイドル状態のクエリが提供されないようにする。この関数をコールすることは、装置が休止されるようになることを保証せず、装置がUSBの休止状態を現在サポートすることができるという提案でしかない。FIFOのバッファが実行中である場合、装置が実際に休止されるまで、FIFOのバッファは実行し続けるようになる。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_EnableInterfaceIdle(
WINUSB_INTERFACE_HANDLE InterfaceHandle
);
【0220】
(パラメータ)
(InterfaceHandle)
これは、WinUsb_Initializeによって戻されたインターフェースのハンドルである。
【0221】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0222】
(4.WinUsb_DisableInterfaceIdle)
WinUsb_DisableInterfaceIdleの関数は、装置が休止されることを防止するか、あるいは、装置がすでに休止されている場合、装置を復帰する。このAPIをコールするための例示的メソッドは以下の通りである。
BOOL_stdcall
WinUsb_DisableInterfaceIdle(
WINUSB_INTERFACE_HANDLE InterfaceHandle
);
【0223】
(パラメータ)
(InterfaceHandle)
WinUsb_Initializeによって戻されたインターフェースのハンドル。
【0224】
(戻り値)
この関数は、成功し、構造体をポピュレートした場合、TRUEを戻す。そうでない場合、この関数はFALSEを戻し、エラーログは、GetLastErrorをコールすることによって検索することができる。
【0225】
(セキュリティ)
一実施態様では、セキュリティは、汎用デバイスドライバ108におけるIoRegisterDeviceInterfaceによって作成された名前付きデバイスオブジェクトを通じて提供される。セキュリティの属性をこのシンボリックリンクについて指定し、それを開くことができるものを制限することができる。
【0226】
このような一実施態様では、ただ1つのユーザのソフトウェアコンポーネント(例えば、112)は、いずれかの所与の時間に開かれたリンクを有することができ、そのため、ソフトウェアコンポーネントがリンクを開くとき、他のソフトウェアコンポーネントは、そのソフトウェアコンポーネントが実際のハンドルを得ない限り、インターフェースにアクセスすることができない。
【0227】
物理デバイスのためのコントロールのパイプを、複数のインターフェースの間で共有することができ(例えば、装置によってサポートされた異なる機能のため)、ユーザのソフトウェアコンポーネントがコントロールのコマンドを別のインターフェースに送信可能にすることができることが想定される。これは一実施態様では、コントロールの転送における所定の制約を必要とする場合がある。加えて、シンボリックリンク上のセキュリティのアクセスを、セキュリティの属性をPDO(204)上に設定することによって、処理することができる。
【0228】
(汎用コンピューティング環境)
図6は、本明細書で説明する技術を実装するために使用することができる、汎用コンピュータ環境600を例示する。例えば、コンピュータ環境600を利用して、汎用デバイスドライバ(108)、汎用のユーザモードのライブラリ(110)および/またはユーザのソフトウェアコンポーネント(112)を含む、OSを実行することができる。汎用コンピュータ環境600はコンピューティング環境の一実施例でしかなく、コンピュータおよびネットワークアーキテクチャの使用または機能の範囲についてのいかなる限定をも示唆するように意図されない。汎用コンピュータ環境600はまた、例示的コンピュータ環境600において例示した構成要素のいずれか1つまたは組合せに関係する、いかなる依存性または要件をも有するものとして、解釈されるべきではない。
【0229】
コンピュータ環境600には、コンピュータ602の形態における汎用コンピューティングデバイスが含まれる。コンピュータ602の構成要素には、限定はされないが、1つまたは複数のプロセッサまたは処理装置604(オプションで、暗号プロセッサまたはコプロセッサを含む)、システムメモリ606、および、プロセッサ604を含む様々なシステム構成要素をシステムメモリ606に結合するシステムバス608を含むことができる。
【0230】
システムバス608は、いくつかの種類のバス構造のいずれかの1つまたは複数を表現し、これらのバス構造には、メモリバスまたはメモリコントローラ、周辺バス、accelerated graphics port(AGP)、および様々なバスアーキテクチャのいずれかを使用する、プロセッサまたはローカルバスが含まれる。例として、このようなアーキテクチャには、業界標準アーキテクチャ(ISA)バス、マイクロチャネルアーキテクチャ(MCA)バス、拡張ISA(EISA)バス、Video Electronics Standards Association(VESA)ローカルバス、および、メザニンバスとしても知られるPeripheral Component Interconnect(PCI)バスが含まれる場合がある。
【0231】
コンピュータ602には通常、様々なコンピュータ読取可能な媒体が含まれる。このような媒体は、コンピュータ602によってアクセス可能であるいかなる使用可能な媒体にすることもでき、揮発性および不揮発性の媒体、取り外し可能および固定の媒体が含まれる。
【0232】
システムメモリ606には、ランダムアクセスメモリ(RAM)610など、揮発性メモリの形態、および/または、読み取り専用メモリ(ROM)612など、不揮発性メモリの形態における、コンピュータ読取可能な媒体が含まれる。基本入出力システム(BIOS)614は、起動中など、コンピュータ602内の要素の間で情報を転送する助けとなる基本ルーチンを含み、ROM612に格納される。RAM610は通常、処理装置604によって即時アクセス可能および/または現在操作されるデータおよび/またはプログラムモジュールを含む。
【0233】
コンピュータ602にはまた、他の取り外し可能/固定、揮発性/不揮発性のコンピュータ記憶媒体が含まれる場合もある。例として、図6は、固定、不揮発性の磁気媒体(図示せず)に対する読み取りおよび書き込みを行うためのハードディスクドライブ616、取り外し可能、不揮発性の磁気ディスク620(例えば、「フロッピー(登録商標)ディスク」)に対する読み取りおよび書き込みを行うための磁気ディスクドライブ618、および、CD−ROM、DVD−ROMまたは他の光媒体など、取り外し可能、不揮発性の光ディスク624に対する読み取りおよび/または書き込みを行うための光ディスクドライブ622を例示する。ハードディスクドライブ616、磁気ディスクドライブ618および光ディスクドライブ622は、システムバス608に、1つまたは複数のデータ媒体のインターフェース626によってそれぞれ接続される。代替として、ハードディスクドライブ616、磁気ディスクドライブ618および光ディスクドライブ622を、システムバス608に、1つまたは複数のインターフェース(図示せず)によって接続すること
ができる。
【0234】
ディスクドライブおよびそれらの関連付けられたコンピュータ読取可能な媒体は、コンピュータ602用のコンピュータ読取可能な命令、データ構造、プログラムモジュールおよび他のデータの不揮発性の記憶装置を提供する。この実施例は、ハードディスク616、取り外し可能な磁気ディスク620、および取り外し可能な光ディスク624を例示するが、コンピュータによってアクセス可能であるデータを格納することができる、他の種類のコンピュータ読取可能な媒体もまた、例示的コンピューティングシステムおよび環境を実施するために利用することができ、これらのコンピュータ読取可能な媒体は、磁気カセットもしくは他の磁気記憶装置、フラッシュメモリカード、CD−ROM、デジタル多用途ディスク(DVD)もしくは他の光記憶装置、ランダムアクセスメモリ(RAM)、読み取り専用メモリ(ROM)、電気的に消去可能なプログラム可能読み取り専用メモリ(EEPROM)などであることを理解されたい。
【0235】
いかなる数のプログラムモジュールも、ハードディスク616、磁気ディスク620、光ディスク624、ROM612および/またはRAM610上で格納することができ、これらのプログラムモジュールには、例として、オペレーティングシステム626、1つまたは複数のアプリケーションプログラム628、他のプログラムモジュール630およびプログラムデータ632が含まれる。このようなオペレーティングシステム626、1つまたは複数のアプリケーションプログラム628、他のプログラムモジュール630およびプログラムデータ632の各々(または、それらのある組合せ)は、分散ファイルシステムをサポートする常駐の構成要素の全部または一部を実装することができる。
【0236】
ユーザはコマンドおよび情報をコンピュータ602へ、キーボード634およびポインティングデバイス636(例えば「マウス」)などの入力装置を介して入力することができる。他の入力装置638(特に図示せず)には、マイクロフォン、ジョイスティック、ゲームパッド、衛星放送受信アンテナ、シリアルポート、スキャナおよび/または同種のものが含まれる場合がある。これらおよび他の入力装置は処理装置604へ、システムバス608に結合される入出力インターフェース640を介して接続されるが、パラレルポート、ゲームポートまたはUSB(図1および2を参照して説明したものなど)など、他のインターフェースおよびバス構造によって接続される場合がある。USBポートを利用して、カメラ、携帯情報端末(PDA)、MP3デバイス、ビデオキャプチャデバイス、フラッシュカードリーダーなどをコンピュータ環境600に接続することができる。
【0237】
モニタ642または他の種類の表示装置もまたシステムバス608に、ビデオアダプタ644などのインターフェースを介して接続することができる。モニタ642に加えて、他の周辺出力装置には、スピーカ(図示せず)およびプリンタ646など、コンピュータ602に入出力インターフェース640を介して接続することができる構成要素が含まれる場合がある。
【0238】
コンピュータ602はネットワーク環境において、リモートコンピューティング装置648など、1つまたは複数のリモートコンピュータへの論理接続を使用して操作することができる。例として、リモートコンピューティング装置648は、パーソナルコンピュータ、ポータブルコンピュータ、サーバ、ルータ、ネットワークコンピュータ、ピアデバイスまたは他の共通ネットワークノード、ゲームコンソールなどにすることができる。リモートコンピューティング装置648を、本明細書でコンピュータ602に関連して説明した要素および特徴の多数またはすべてを含むことができる、ポータブルコンピュータとして例示する。
【0239】
コンピュータ602とリモートコンピュータ648との間の論理接続を、ローカルエリアネットワーク(LAN)650および汎用的なワイドエリアネットワーク(WAN)652として示す。このようなネットワーキング環境は、オフィス、企業全体のコンピュータネットワーク、イントラネットおよびインターネットにおいて一般的である。
【0240】
LANのネットワーキング環境において実装される場合、コンピュータ602はローカルネットワーク650に、ネットワークインターフェースまたはアダプタ654を介して接続される。WANのネットワーキング環境において実装される場合、コンピュータ602は通常、モデム656、または、ワイドネットワーク652を介して通信を確立するための他の手段を含む。モデム656は、コンピュータ602の内部または外部とすることができ、システムバス608に、入出力インターフェース640または他の適切なメカニズムを介して接続することができる。例示のネットワーク接続は例示的であり、複数のコンピュータ602と648との間で通信リンクを確立する他の手段を使用することができることは理解されよう。
【0241】
コンピューティング環境600により例示したものなど、ネットワーク環境では、コンピュータ602に関連して示したプログラムモジュールまたはその一部を、リモートメモリ記憶装置に格納することができる。例として、リモートアプリケーションプログラム658は、リモートコンピュータ648のメモリ装置上に存在する。例示のため、アプリケーションプログラム、および、オペレーティングシステムなどの他の実行可能なプログラムのコンポーネントを本明細書で離散的なブロックとして例示するが、このようなプログラムおよびコンポーネントは様々な時間にコンピューティング装置602の異なる記憶装置の構成要素内に存在し、コンピュータのデータプロセッサによって実行されることを理解されたい。
【0242】
様々なモジュールおよび技術を本明細書で一般に、1つまたは複数のコンピュータまたは他の装置によって実行される、プログラムモジュールなどのコンピュータ実行可能命令に関連して説明することができる。一般に、プログラムモジュールには、ルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれ、これらは特定のタスクを実行するか、あるいは特定の抽象データ型を実装する。通常、プログラムモジュールの機能を、様々な実施態様において望まれるように結合または分散することができる。
【0243】
これらのモジュールおよび技術の一実施態様を、所定の形態のコンピュータ読取可能な媒体上に格納することができ、あるいはこれを介して送信することができる。コンピュータ読取可能な媒体を、コンピュータによってアクセスすることができるいかなる使用可能な媒体にすることもできる。例として、限定ではなく、コンピュータ読取可能な媒体には、「コンピュータ記憶媒体」および「通信媒体」が含まれる場合がある。
【0244】
「コンピュータ記憶媒体」には、揮発性および不揮発性、取り外し可能および固定の媒体が含まれ、これらの媒体は、コンピュータ読取可能な命令、データ構造、プログラムモジュールまたは他のデータなど、情報の格納のためのいずれかの方法または技術において実装される。コンピュータ記憶媒体には、限定はされないが、RAM、ROM、EEPROM、フラッシュメモリもしくは他のメモリ技術、CD−ROM、デジタル多用途ディスク(DVD)もしくは他の光記憶装置、磁気カセット、磁気テープ、磁気ディスク記憶装置もしくは他の磁気記憶装置、または、所望の情報を格納するために使用することができ、コンピュータによってアクセスすることができる他のいかなる媒体もが含まれる。
【0245】
「通信媒体」には通常、搬送波もしくは他の伝送メカニズムなどの変調データ信号における、コンピュータ読取可能な命令、データ構造、プログラムモジュールまたは他のデータが含まれる。通信媒体にはまた、いかなる情報配信媒体もが含まれる。「変調データ信号」という用語は、信号における情報をエンコードするような方法でその特性集合の1つまたは複数が設定または変更されている信号を意味する。例として、限定ではなく、通信媒体には、有線ネットワークまたは直接有線接続などの有線媒体、ならびに、音響、無線周波数(RF)、赤外線、Wi−Fi、セルラー、ブルートゥース対応、および他の無線媒体などの無線媒体が含まれる。上記のいずれの組合せもまた、コンピュータ読取可能な媒体の範囲内に含まれる。
【0246】
一実施態様では、情報がアクセスされるハードウェア装置(図1および2を参照して説明したものなど)を、汎用コンピュータ環境600の構成要素(処理装置604など)に結合されたいかなる装置にすることもできる。また、ハードウェア装置を、汎用コンピュータ環境600の周辺装置(マウス636、キーボード634、プリンタ646等など)にすることもできる。
【0247】
(結論)
このように、本発明を、構造的特徴および/または方法論的動作に特有の言語で説明したが、付属の特許請求の範囲において定義された本発明は、説明した特定の特徴または動作に必ずしも限定されるとは限らないことを理解されたい。例えば、本明細書で説明した技術を、有線または無線通信チャネル(ブルートゥース、small computer system interface(SCSI)など)に適用することができる。したがって、特定の特徴および動作は、主張された本発明を実装する例示的形態として開示される。

【特許請求の範囲】
【請求項1】
コンピュータが実行する方法であって、
コンピューティングシステムにプラグインされる電力管理ポリシーを定義するステップであって、前記電力管理ポリシーは、汎用のユーザモードライブラリによって提供される複数のルーチンを介して定義され、前記複数のルーチンは、アプリケーションプログラミングインタフェースとして実行され、別のカーネルモードの汎用デバイスドライバは、前記コンピューティングシステムにプラグインされる各USBデバイスに対して、または、前記USBドライバの各機能に対してロードされ、前記カーネルモードの汎用デバイスドライバは、前記コンピュータシステムにプラグインされるときに複数のUSBドライバが動作可能となるように構成される、ステップと、
前記USBドライバが前記定義された電力管理ポリシーの使用により一時停止状態のモードを使用することを決定するステップと、
前記USBデバイスがユーザモードのソフトウェアコンポーネントを実行することにより低電力状態に切り替えるよう前記一時停止状態のモードを使用開始するステップであって、前記汎用のユーザモードライブラリは、前記ユーザモードのソフトウェアコンポーネントがカーネルモードの環境よりもむしろユーザモードの環境においてルーチンを実行することにより前記USBデバイスを管理する、ステップと、
前記USBデバイスがいったん前記一時停止状態のモードを使用開始すると、前記コンピュータシステムを低電力状態に切り替えるステップと
を含むことを特徴とする方法。
【請求項2】
請求項1に記載の方法をコンピュータに実行させるためのコンピュータ可読命令を格納する1つまたは複数のコンピュータ読み取り可能記憶媒体。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate


【公開番号】特開2012−128865(P2012−128865A)
【公開日】平成24年7月5日(2012.7.5)
【国際特許分類】
【出願番号】特願2012−15734(P2012−15734)
【出願日】平成24年1月27日(2012.1.27)
【分割の表示】特願2005−129812(P2005−129812)の分割
【原出願日】平成17年4月27日(2005.4.27)
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】