(57)【要約】【課題】周辺機器に対するアクセスエラーを防止すること。【解決手段】本発明に係る情報処理装置９１は、クラスドライバ９１３の下位のフィルタドライバ９１４において、クラスドライバ９１３によって変更された周辺機器９２の電力状態が、通常状態よりも低消費電力であるが動作が制限される低電力状態である場合、アプリケーションプログラム９１２からのクラスドライバ９１３を介さない制御要求に応じた周辺機器９２の制御を、周辺機器９２の電力状態が通常状態に戻るまで保留する。【選択図】図４１
2016045706.tif 000002
【特許請求の範囲】
【請求項１】
周辺機器の制御要求を送信する第１のアプリケーションプログラムと、
前記第１のアプリケーションプログラムが動作するオペレーションシステム上で動作して、周辺機器の制御要求を送信する第２のアプリケーションプログラムと、
前記第１のアプリケーションプログラムからの制御要求を中継するクラスドライバと、
前記クラスドライバの下位において、前記第１のアプリケーションプログラムからの前記クラスドライバを介した制御要求に応じて前記周辺機器を制御するとともに、前記第２のアプリケーションプログラムからの前記クラスドライバを介さない制御要求に応じて前記周辺機器を制御するフィルタドライバと、を備え、
前記フィルタドライバは、
前記クラスドライバからの前記周辺機器の電力状態の変更要求に応じて、前記周辺機器の電力状態を変更するとともに、変更後の前記周辺機器の電力状態を認識する電力状態管理部と、
前記第１のアプリケーションプログラム及び前記第２のアプリケーションプログラムからの制御要求に応じて、前記周辺機器の制御を実行する制御部と、を有し、
前記制御部は、
前記電力状態管理部によって認識される前記周辺機器の電力状態が、低電力状態である場合、前記第２のアプリケーションプログラムからの制御要求に応じた前記周辺機器の制御を、前記周辺機器の電力状態が前記通常状態に戻るまで保留する、
情報処理装置。
【請求項２】
前記電力状態管理部が示す前記周辺機器の電力状態が前記低電力状態であるときに、前記フィルタドライバは、前記第２のアプリケーションプログラムからの制御要求を受信した場合、前記周辺機器の電力状態を前記通常状態に変更するように制御する、
請求項１に記載の情報処理装置。
【請求項３】
前記フィルタドライバは、前記第２のアプリケーションプログラムからの制御要求に応じて前記周辺機器を制御しているときに、前記クラスドライバから前記低電力状態への変更を要求する変更要求を受信した場合、前記周辺機器の電力状態の前記低電力状態への変更を前記第２のアプリケーションプログラムからの制御要求に応じた前記周辺機器の制御が完了するまで保留する、
請求項１に記載の情報処理装置。
【請求項４】
前記情報処理装置は、さらに、前記フィルタドライバの下位において、前記周辺機器に対する所定の操作に応じて、通常状態への復帰を要求する復帰要求を、前記フィルタドライバを介して前記クラスドライバに送信するホストコントローラドライバを備え、
前記クラスドライバは、前記ホストコントローラドライバからの復帰要求に応じて、前記周辺機器の電力状態を前記通常状態へ変更するための変更要求を前記フィルタドライバに送信するものであり、
前記電力状態管理部が示す前記周辺機器の電力状態が前記低電力状態であるときに、前記第２のアプリケーションプログラムからの制御要求を受信した場合、前記フィルタドライバは、前記復帰要求を疑似的に前記クラスドライバに送信することで、前記周辺機器の電力状態を前記通常状態に変更する、
請求項２に記載の情報処理装置。
【請求項５】
前記ホストコントローラドライバは、前記所定の操作が行われた場合は、前記復帰要求が成功を示すように生成して前記クラスドライバに送信し、前記クラスドライバから前記所定の操作に応じた前記復帰要求の送信のキャンセルが指示された場合には、前記復帰要求がキャンセルを示すように生成して前記クラスドライバに送信し、
前記クラスドライバは、前記復帰要求が成功を示す場合に、前記通常状態への変更要求を送信するものであり、
前記電力状態管理部が示す前記周辺機器の電力状態が前記低電力状態であるときに、前記第２のアプリケーションプログラムからの制御要求を受信した場合、前記フィルタドライバは、前記所定の操作に応じた前記復帰要求の送信のキャンセルを前記ホストコントローラドライバに指示するとともに、前記ホストコントローラドライバから前記クラスドライバに送信される復帰要求が成功を示すように変更することで、前記復帰要求を疑似的に前記クラスドライバに送信する、
請求項４に記載の情報処理装置。
【請求項６】
前記フィルタドライバは、
前記第２のアプリケーションプログラムからの制御要求に応じて前記通常状態の周辺機器を制御しているときに、前記クラスドライバから前記低電力状態への変更を要求する変更要求を受信した場合、前記周辺機器の電力状態を前記低電力状態に変更させずに、前記周辺機器の電力状態を前記低電力状態に変更したことを前記クラスドライバに通知し、
前記周辺機器の制御の完了後に、前記復帰要求を疑似的に前記クラスドライバに送信することで、前記周辺機器の電力状態を前記通常状態に変更して、前記周辺機器の電力状態を前記通常状態に変更したことを前記クラスドライバに通知する、
請求項４に記載の情報処理装置。
【請求項７】
前記制御部は、前記周辺機器の制御として、前記第１のアプリケーションプログラム及び前記第２のアプリケーションプログラムからの制御要求を送信し、
前記情報処理装置は、さらに、前記フィルタドライバの下位において、前記フィルタドライバからの制御要求に応じて、前記周辺機器の制御を実行するホストコントローラドライバを備え、
前記ホストコントローラドライバは、前記周辺機器の電力状態を前記通常状態に変更する第１のホストコントローラ関数と、前記周辺機器の電力状態を前記低電力状態に変更する第２のホストコントローラ関数とを有し、
前記フィルタドライバは、前記第１のホストコントローラ関数を呼び出す第１のフィルタ関数と、前記第２のホストコントローラ関数を呼び出す第２のフィルタ関数とを有し、
前記クラスドライバは、前記周辺機器の電力状態の変更要求として、前記第１のフィルタ関数及び前記第２のフィルタ関数を呼び出し、
前記電力状態管理部は、前記第２のアプリケーションプログラムからの制御要求を受信した場合、前記第１のホストコントローラ関数を呼び出すことで、前記周辺機器の電力状態を前記通常状態に変更する、
請求項２に記載の情報処理装置。
【請求項８】
前記電力状態管理部は、前記周辺機器を制御しているときに、前記クラスドライバから前記第２のフィルタ関数が呼び出された場合、前記第２のフィルタ関数をエラーで返す、
請求項７に記載の情報処理装置。
【請求項９】
前記クラスドライバは、前記第１のホストコントローラ関数及び前記第２のホストコントローラ関数のアドレス要求を、前記フィルタドライバを介して前記ホストコントローラドライバに送信し、
前記クラスドライバは、前記アドレス要求に応じて、前記第１のホストコントローラ関数及び前記第２のホストコントローラ関数のアドレスを、前記フィルタドライバを介して前記クラスドライバに送信し、
前記フィルタドライバは、さらに、前記ホストコントローラドライバから送信された前記第１のホストコントローラ関数及び前記第２のホストコントローラ関数のアドレスを、前記第１のフィルタ関数及び前記第２のフィルタ関数で呼び出すために取得するとともに、前記第１のホストコントローラ関数及び前記第２のホストコントローラ関数のアドレスに代えて前記第１のフィルタ関数及び前記第２のフィルタ関数のアドレスを前記クラスドライバに送信するインタフェース中継制御部を有する、
請求項７に記載の情報処理装置。
【請求項１０】
前記周辺機器は、USB機器であり、
前記第２のアプリケーションプログラムは、USB Power Deliveryにおける制御要求を送信する、
請求項１に記載の情報処理装置。
【請求項１１】
前記周辺機器は、前記周辺機器で実行されるプログラムが格納された不揮発記憶装置を有し、
前記第２のアプリケーションプログラムは、前記不揮発記憶装置に格納されたプログラムを書き換える制御要求を送信する、
請求項１に記載の情報処理装置。
【請求項１２】
第１のアプリケーションプログラムからのクラスドライバを介した制御要求に応じて周辺機器を制御する第１の制御ステップと、
前記クラスドライバからの前記周辺機器の電力状態の変更要求に応じて、前記周辺機器の電力状態を変更するとともに、変更後の前記周辺機器の電力状態を認識する電力状態管理ステップと、
前記第１のアプリケーションプログラムが動作するオペレーションシステム上で動作する第２のアプリケーションプログラムからの前記クラスドライバを介さない制御要求に応じて前記周辺機器を制御する第２の制御ステップと、を備え、
前記第２の制御ステップでは、前記認識される前記周辺機器の電力状態が、低電力状態である場合、前記第２のアプリケーションプログラムからの制御要求に応じた前記周辺機器の制御を、前記周辺機器の電力状態が前記通常状態に戻るまで保留する、
周辺機器制御方法。
【請求項１３】
第１のアプリケーションプログラムからの周辺機器の制御要求を中継するクラスドライバの下位において、前記第１のアプリケーションプログラムに対して前記クラスドライバを介して制御要求に応じて前記周辺機器を制御するとともに、前記第１のアプリケーションプログラムが動作するオペレーションシステム上で動作する第２のアプリケーションプログラムからの前記クラスドライバを介さない制御要求に応じて前記周辺機器を制御するフィルタドライバであって、
前記クラスドライバからの前記周辺機器の電力状態の変更要求に応じて、前記周辺機器の電力状態を変更するとともに、変更後の前記周辺機器の電力状態を認識する電力状態管理処理と、
前記第１のアプリケーションプログラム及び前記第２のアプリケーションプログラムからの制御要求に応じて、前記周辺機器を制御する制御処理と、をコンピュータに実行させ、
前記制御処理では、前記認識される前記周辺機器の電力状態が、低電力状態である場合、前記第２のアプリケーションプログラムからの制御要求に応じた前記周辺機器の制御を、前記周辺機器の電力状態が前記通常状態に戻るまで保留する、
フィルタドライバ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、周辺機器制御方法、及びフィルタドライバに関し、例えば周辺機器の電力状態を制御する技術に関する。
【背景技術】
【０００２】
USB（Universal Serial Bus）は、コンピュータと周辺機器とを接続してデータ入出力を行う汎用バスとして、広く利用されている。そのため、USBに関しては、様々な技術が検討されている。
【０００３】
その技術として、フィルタドライバがある（例えば、特許文献１〜４）。フィルタドライバは、主に、デバイスドライバの下位に挿入され、そのデバイスドライバがサポートしていない付加的な機能を提供する。また、他の技術として、セレクティブサスペンドがある（例えば、特許文献５）。セレクティブサスペンドは、USBデバイスをその稼働状態に応じて選択的にサスペンド状態（低電力状態）に移行させることで、省電力化を実現する技術である。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１３−１６１６６号公報
【特許文献２】特許４７２０９５９号明細書
【特許文献３】特許４９５９７６６号明細書
【特許文献４】米国特許第６０６７６２８号明細書
【特許文献５】米国特許第８３８６８１３号明細書
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上述のセレクティブサスペンドは、省電力化を実現する上で非常に有効な技術である。しかしながら、セレクティブサスペンドを採用した場合には、USBデバイスに対してアクセスするときに、USBデバイスの電力状態に注意する必要がある。すなわち、サスペンド状態となっているUSBデバイスにアクセスしてしまうと、エラーが発生してしまうという問題がある。この問題は、選択的にサスペンド状態に移行されるものであれば、USBデバイスに限られず、各種周辺機器についても同様のことが言える。
【０００６】
その他の課題と新規な特徴は、本明細書の記述および添付図面から明らかになるであろう。
【課題を解決するための手段】
【０００７】
一実施の形態によれば、情報処理装置は、クラスドライバによって変更された周辺機器の電力状態が、低電力状態である場合、アプリケーションプログラムからのクラスドライバを介さない制御要求に応じた周辺機器の制御を、周辺機器の電力状態が通常状態に戻るまで保留するものである。
【発明の効果】
【０００８】
前記一実施の形態によれば、周辺機器に対するアクセスエラーを防止することができる。
【図面の簡単な説明】
【０００９】
【図１】第1の比較例に係るパーソナルコンピュータの構成図である。
【図２】第2の比較例に係るパーソナルコンピュータの構成図である。
【図３】第3の比較例に係るパーソナルコンピュータの構成図である。
【図４】第3の比較例に係るフィルタドライバの構成図である。
【図５】第3の比較例に係るパーソナルコンピュータの転送処理を示すシーケンス図である。
【図６】セレクティブサスペンドを説明するための図である。
【図７】比較例に係るセレクティブサスペンド処理を示すシーケンス図である。
【図８】比較例に係るレジューム処理を示すシーケンス図である。
【図９】比較例に係るパーソナルコンピュータの問題点を説明するためのシーケンス図である。
【図１０】比較例に係るパーソナルコンピュータの問題点を説明するためのシーケンス図である。
【図１１】実施の形態1に係るフィルタドライバの機能ブロック図である。
【図１２】実施の形態1に係る電力状態管理機能の機能ブロック構成図である。
【図１３】実施の形態1に係る転送状態管理機能の機能ブロック構成図である。
【図１４】実施の形態1に係るフィルタドライバの転送要求受信時の処理を示すフローチャートである。
【図１５】実施の形態1に係るフィルタドライバのSet Power（D2）要求受信時の処理を示すフローチャートである。
【図１６】実施の形態1に係るフィルタドライバのUSBハブ制御アプリケーションからの転送要求の結果受信時の処理を示すフローチャートである。
【図１７】実施の形態1に係るフィルタドライバのSet Power（D2）要求の結果受信時の処理を示すフローチャートである。
【図１８】実施の形態1に係るフィルタドライバのSet Power（D0）要求の結果受信時の処理を示すフローチャートである。
【図１９】実施の形態1に係るパーソナルコンピュータの処理を示すシーケンス図である。
【図２０】実施の形態1に係るパーソナルコンピュータの処理を示すシーケンス図である。
【図２１】実施の形態2に係る電力状態管理機能の機能ブロック構成図である。
【図２２】実施の形態2に係るフィルタドライバのWait Wake要求の受信時の処理を示すフローチャートである。
【図２３】実施の形態2に係るフィルタドライバの転送要求受信時の処理を示すフローチャートである。
【図２４】実施の形態2に係るフィルタドライバのWait Wake要求の結果受信時の処理を示すフローチャートである。
【図２５】実施の形態2に係るフィルタドライバのSet Power（D2）要求の結果受信時の処理を示すフローチャートである。
【図２６】実施の形態2に係るフィルタドライバの転送要求の結果受信時の処理を示すフローチャートである。
【図２７】実施の形態2に係るフィルタドライバのSet Power（D0）要求の結果受信時の処理を示すフローチャートである。
【図２８】実施の形態2に係るパーソナルコンピュータの処理を示すシーケンス図である。
【図２９】実施の形態2に係るパーソナルコンピュータの処理を示すシーケンス図である。
【図３０】実施の形態2の変形例に係るパーソナルコンピュータの処理を示すシーケンス図である。
【図３１】比較例に係るパーソナルコンピュータの問題点を説明するためのシーケンス図である。
【図３２】実施の形態3に係るフィルタドライバの機能ブロック図である。
【図３３】実施の形態3に係るサスペンド制御インタフェース中継機能の機能ブロック図である。
【図３４】実施の形態3に係るフィルタドライバの転送要求受信時の処理を示すフローチャートである。
【図３５】実施の形態3に係るフィルタドライバのサスペンド関数呼び出し時の処理を示すフローチャートである。
【図３６】実施の形態3に係るパーソナルコンピュータの処理を示すシーケンス図である。
【図３７】実施の形態3に係るパーソナルコンピュータの処理を示すシーケンス図である。
【図３８】実施の形態4に係るパーソナルコンピュータの構成図である。
【図３９】実施の形態5に係るパーソナルコンピュータの構成図である。
【図４０】実施の形態6に係るフィルタドライバの転送要求の結果受信時の処理を示すフローチャートである。
【図４１】一実施の形態に係る情報処理装置の構成図である。
【発明を実施するための形態】
【００１０】
以下に図面を参照しながら、本発明の好適な実施形態について説明する。以下の実施形態に示す具体的な数値等は、発明の理解を容易とするための例示にすぎず、特に断る場合を除き、それに限定されるものではない。また、以下の記載及び図面では、説明の明確化のため、当業者にとって自明な事項等については、適宜、省略及び簡略化がなされている。
【００１１】
＜実施の形態の比較例＞
（第1の比較例に係るパーソナルコンピュータの構成）
まず、図1を参照して、第1の比較例に係るパーソナルコンピュータ1の構成について説明する。図1に示すように、パーソナルコンピュータ1は、USBホストコントローラ10と、オペレーティングシステム20と、アプリケーションプログラム30とを有する。以下、パーソナルコンピュータを「PC」とも呼ぶ。オペレーティングシステムを、「OS」とも呼ぶ。また、アプリケーションプログラムを、「アプリケーション」とも呼ぶ。
【００１２】
PC1は、USB機器として、USBハブ2及びUSBデバイス3が接続される。図1では、PC1がUSBハブ2を介してUSBデバイス3と接続される例について示しているが、PC1がUSBハブ2を介さずに直接USBデバイス3と接続されるようにしてもよい。PC1は、USBハブ2を介して、USBデバイス3との間で各種データの送受信を行う。また、PC1は、USBデバイス3でなく、USBハブ2との間で各種データを送受信する場合もある。
【００１３】
USBハブ2は、PC1とUSBデバイス3との間で送受信されるデータを中継する。USBハブ2には、1つのUSBデバイス3が接続されてもよく、複数のUSBデバイス3が接続されるようにしてもよい。
【００１４】
USBデバイス3は、例えば、ヒューマンインタフェースデバイス、文書関連機器、映像機器、音響機器、外部記憶機器、及び通信機器などである。ヒューマンインタフェースデバイスは、例えば、キーボード、マウス、及び液晶ディスプレイなどである。文書関連機器は、例えば、プリンター及び複合機などである。映像機器は、例えば、デジタルカメラ及びWebカメラなどである。音響機器は、例えば、スピーカー及びヘッドフォンなどである。外部記憶機器は、例えば、USBメモリ、ハードディスクドライブ、光学ドライブ、及びフロッピー（登録商標）ディスクドライブなどである。通信機器は、例えば、モデム及びBluetooth（登録商標）アダプタなどである。
【００１５】
USBホストコントローラ10は、OS20から要求に応じて、USBハブ2及びUSBデバイス3を制御する半導体チップである。USBホストコントローラ10は、OS20からの制御に応じて、USBハブ2及びUSBデバイス3との間で各種データを送受信する。
【００１６】
OS20は、複数のアプリケーションをスケジューリングして実行する。この複数のアプリケーションには、上述のアプリケーション30が含まれる。また、OS20は、USBホストコントローラドライバ21と、USBハブクラスドライバ22と、複数のUSBデバイスクラスドライバ23とを有する。OS20は、このドライバ21〜23により、その上位のプログラムであるアプリケーション30に対してUSB機器2、3を制御する機能を提供する。
【００１７】
USBホストコントローラドライバ21は、USBハブクラスドライバ22からの要求に応じて、USBホストコントローラ10を制御する。USBホストコントローラドライバ21は、USB機器2、3の制御として、USBホストコントローラ10に対して、そのUSB機器2、3の制御を要求する。すなわち、USBホストコントローラドライバ21は、USBハブクラスドライバ22の下位のプログラムである。
【００１８】
USBハブクラスドライバ22は、自らUSBハブ2を制御するとともに、各USBデバイスクラスドライバ23からの要求に応じて、USBデバイス3を制御する。USBハブクラスドライバ22は、USB機器2、3の制御として、USBホストコントローラドライバ21に対して、そのUSB機器2、3の制御を要求する。すなわち、USBハブクラスドライバ22は、複数のUSBデバイスクラスドライバ23の下位のプログラムである。
【００１９】
また、USBハブクラスドライバ22は、複数のUSBデバイスクラスドライバ23の違いを吸収する役割も担っている。よって、異なるUSBデバイスクラスドライバ23からのUSBデバイス3の制御の要求に対する要求であっても、USBハブクラスドライバ22からUSBホストコントローラドライバ21に対しては統一されたインタフェースで制御の要求が行われる。
【００２０】
USBデバイスクラスドライバ23は、アプリケーション30からの要求に応じて、USBデバイス3を制御する。USBデバイスクラスドライバ23は、USBデバイス3の制御として、USBハブクラスドライバ22に対して、そのUSBデバイス3の制御を要求する。すなわち、USBデバイスクラスドライバ23は、OS20上で動作するアプリケーション30の下位のプログラムである。
【００２１】
アプリケーション30は、任意の処理を実行するプログラム（ソフトウェア）である。アプリケーション30の処理には、USBデバイス3を制御する処理が含まれている。アプリケーション30は、USBデバイスクラスドライバ23を利用することで、USBデバイス3を制御する。アプリケーション30は、USBデバイス3の制御として、USBデバイスクラスドライバ23に対してUSBデバイス3の制御を要求する。
【００２２】
ここで、USBデバイスクラスドライバ23は、USBデバイス3の種類ごとに用意されている。このUSBデバイス3の種類は、デバイスクラスとも呼ばれ、USB規格において定義されている。USBデバイスクラスドライバ23は、自身に対応する種類のUSBデバイス3を制御するインタフェースをOS20上で動作するアプリケーション30に提供する。よって、アプリケーション30は、USBデバイス3を制御する場合、そのUSBデバイス3の種類に対応するUSBデバイスクラスドライバ23を利用することで、そのUSBデバイス3を制御する。
【００２３】
このように、OS20は、USB機器2、3に関して、USB規格で定められた機能を実現するためのドライバ21〜23が実装されている。これにより、USB機器2、3をPC1に接続するだけで、それらを制御することができる。しかし、USB規格で定められた機能とは異なる付加的な機能は、OS20に標準実装されたドライバ21〜23だけでは実現することができない。あるいは、USB規格として新たに追加された機能で、OS20に標準実装されたドライバ21〜23が対応していない機能についても、同様である。これらの機能を実現するための方法として、次の二通りの方法が考えられる。
【００２４】
（第2の比較例に係るパーソナルコンピュータの構成）
図2を参照して、一つ目の方法に係るPC1の構成について説明する。以下、図1を参照して説明した内容と同様の内容については、適宜省略する。図2に示すPC1は、図1に示すPC1と比較して、USBハブクラスドライバ22に代えて独自USBハブドライバ24を有する。また、図2に示すPC1は、図1に示すPC1と比較して、さらに、USBハブ制御アプリケーション40を有する。
【００２５】
USBハブ制御アプリケーション40は、任意の処理を実行するプログラム（ソフトウェア）である。USBハブ制御アプリケーション40の処理には、USBハブ2を制御する処理が含まれている。ここで、USBハブ制御アプリケーション40の処理には、アプリケーション30とは異なり、上述の付加的な機能についてUSBハブ2を制御する処理が含まれている。USBハブ制御アプリケーション40は、付加的な機能についてUSBハブ2を制御する場合、直接、独自USBハブドライバ24を利用することで、USBハブ2を制御する。
【００２６】
独自USBハブドライバ24は、USBハブクラスドライバ22と比較して、さらに、上位のUSBハブ制御アプリケーション40に対して、上述の付加的な機能についてUSBハブ2を制御する機能を提供する。すなわち、独自USBハブドライバ24は、付加的な機能についても、USBホストコントローラドライバ21に対して、そのUSBハブ2の制御を要求することができる。
【００２７】
この構成によれば、USBハブ制御アプリケーション40は、独自USBハブドライバ24を直接利用することで、付加的な機能についてUSBハブ2を制御することが可能である。
【００２８】
（第3の比較例に係るパーソナルコンピュータの構成）
続いて、図3を参照して、二つ目の方法に係るPC1の構成について説明する。以下、図1及び図2を参照して説明した内容と同様の内容については、適宜省略する。図3に示すPC1は、図1に示すPC1と比較して、さらに、USBハブ制御アプリケーション40と、USBハブフィルタドライバ25とを有する。ここで、USBハブフィルタドライバ25は、USBホストコントローラドライバ21とUSBハブクラスドライバ22の間に挿入される形で追加されている。すなわち、図3に示すPC1は、フィルタドライバとして、USBハブフィルタドライバ25が追加された構成となる。
【００２９】
USBハブ制御アプリケーション40は、独自USBハブドライバ24ではなく、USBハブフィルタドライバ25を利用する点が、図2に示すUSBハブ制御アプリケーション40と異なる。すなわち、図3に示すUSBハブ制御アプリケーション40は、付加的な機能に基づいてUSBハブ2を制御する場合、USBハブクラスドライバ22を利用せず、直接、USBハブフィルタドライバ25を利用することで、USBハブ2を制御する。
【００３０】
また、図3に示すUSBハブクラスドライバ22は、USBホストコントローラドライバ21に直接ではなく、USBハブフィルタドライバ25を介してUSB機器2、3の制御を要求する点が、図１に示すUSBハブクラスドライバ22と異なる。
【００３１】
USBハブフィルタドライバ25は、USBハブクラスドライバ22からの要求に応じて、USB機器2、3を制御する。USBハブフィルタドライバ25は、USB機器2、3の制御として、USBホストコントローラドライバ21に対して、そのUSB機器2、3の制御を要求する。すなわち、USBハブフィルタドライバ25は、USBハブクラスドライバ22の下位のプログラムである。
【００３２】
また、USBハブフィルタドライバ25は、USBハブ制御アプリケーション40に基づいた、上述の付加的な機能を実現するためにUSBハブ2を制御する機能を提供する。すなわち、USBハブフィルタドライバ25は、付加的な機能についても、USBホストコントローラドライバ21に対して、そのUSBハブ2の制御を要求することができる。
【００３３】
よって、USBホストコントローラドライバ21は、直接的には、USBハブクラスドライバ22からの要求ではなく、USBハブフィルタドライバ25からの要求に応じて、USBホストコントローラ10を制御する点が、図1に示すUSBホストコントローラドライバ21と異なる。
【００３４】
この構成によれば、USBハブ制御アプリケーション40は、USBハブフィルタドライバ25を直接利用することで、付加的な機能についてUSBハブ2を制御することが可能である。
【００３５】
（比較例に係るフィルタドライバの構成）
続いて、図4を参照して、USBハブフィルタドライバ25の機能ブロック構成について説明する。図4に示すように、USBハブフィルタドライバ25は、ハブクラス転送要求中継機能251と、電力管理要求中継機能252と、アプリケーション転送要求中継機能253とを有する。
【００３６】
上述のUSBハブ2の制御の要求には、USBハブ2に対してデータの転送を要求する転送要求と、USBハブ2の電力状態の変更などを要求する電力管理要求とがある。また、電力管理要求には、Wait Wake要求と、Set Power（D2）要求と、Set Power（D0）要求とがある。Set Power（D2）要求は、USBハブ2を通常稼働状態から低電力状態に遷移（サスペンド）させる要求である。Wait Wake要求は、USBハブ2のリモートウェイクを有効化させる要求である。Set Power（D0）要求は、USBハブ2を低電力状態から通常稼働状態に遷移（レジューム）させる要求である。低電力状態は、通常稼働状態よりもUSBハブ2の消費電力が少なく動作が制限された状態である。転送要求及び電力管理要求は、PC1内で送受信可能な形式の情報である。
【００３７】
ハブクラス転送要求中継機能251は、USBハブクラスドライバ22とUSBホストコントローラドライバ21との間で転送要求を中継する。電力管理要求中継機能252は、USBハブクラスドライバ22とUSBホストコントローラドライバ21との間で電力管理要求を中継する。
【００３８】
ハブクラス転送要求中継機能251は、要求受信機能2511と、要求送信機能2512と、結果受信機能2513と、結果通知機能2514とを有する。
【００３９】
要求受信機能2511は、USBハブクラスドライバ22から転送要求を受信する。要求送信機能2512は、要求受信機能2511が受信した転送要求を、USBホストコントローラドライバ21に送信する。結果受信機能2513は、USBホストコントローラドライバ21から転送要求に応じた処理の結果を示す情報である転送結果を受信する。結果通知機能2514は、結果受信機能2513が受信した転送結果を、USBハブクラスドライバ22に通知する。
【００４０】
電力管理要求中継機能252は、要求受信機能2521と、要求送信機能2522と、結果受信機能2523と、結果通知機能2524とを有する。
【００４１】
要求受信機能2521は、USBハブクラスドライバ22から電力管理要求を受信する。要求送信機能2522は、要求受信機能2521が受信した電力管理要求を、USBホストコントローラドライバ21に送信する。結果受信機能2523は、USBホストコントローラドライバ21から電力管理要求に応じた処理の結果を示す情報である電力管理結果を受信する。結果通知機能2524は、結果受信機能2523が受信した電力管理結果を、USBハブクラスドライバ22に通知する。
【００４２】
USBハブ制御アプリケーション40からUSBハブフィルタドライバ25に対して行われる要求には、USBハブ2に対するデータの転送を要求する転送要求がある。アプリケーション転送要求中継機能253は、USBハブ制御アプリケーション40とUSBホストコントローラドライバ21との間で転送要求を中継する。
【００４３】
アプリケーション転送要求中継機能253は、要求受信機能2531と、要求送信機能2532と、結果受信機能2533と、結果通知機能2534とを有する。
【００４４】
要求受信機能2531は、USBハブ制御アプリケーション40から転送要求を受信する。要求送信機能2532は、要求受信機能2531が受信した転送要求を、USBホストコントローラドライバ21に送信する。結果受信機能2533は、USBホストコントローラドライバ21から転送要求に応じた処理の結果を示す転送結果を受信する。結果通知機能2534は、結果受信機能2533が受信した転送結果を、USBハブ制御アプリケーション40に通知する。
【００４５】
（比較例に係るパーソナルコンピュータのデータ転送処理）
続いて、図5を参照して、第3の比較例に係るPC1の転送処理について説明する。ここでは、USBハブフィルタドライバ25が、USBハブ制御アプリケーション40からの要求に従ってUSBハブ2に対してデータの転送を行う場合における処理について説明する。
【００４６】
USBハブ制御アプリケーション40は、USBハブ2にデータを転送する場合、USBハブ2へのデータの転送を要求する転送要求をUSBハブフィルタドライバ25に送信する（S1）。USBハブフィルタドライバ25の要求受信機能2531は、USBハブ制御アプリケーション40からの転送要求を受信する。USBハブフィルタドライバ25の要求送信機能2532は、その転送要求をUSBホストコントローラドライバ21に送信する（S2）。USBホストコントローラドライバ21は、USBハブフィルタドライバ25からの転送要求に応じて、USBホストコントローラ10に対してUSBハブ2へのデータの転送開始を指示する（S3）。
【００４７】
USBホストコントローラ10は、USBホストコントローラドライバ21からの指示に応じて、USBハブ2への転送を開始する（S4）。より具体的には、転送要求には、USBハブ2に対して転送するデータが含まれている。USBホストコントローラドライバ21は、このUSBハブ2に対して転送するデータを、USBホストコントローラ10に対して送信する。USBホストコントローラ10は、USBホストコントローラドライバ21からのデータをUSBハブ2に送信する。これにより、USBハブ制御アプリケーション40がUSBハブ2に対して転送を要求したデータが、USBハブ2に転送される。
【００４８】
ここで、このデータは、例えば、USBハブ制御アプリケーション40からUSBハブ2に対して所望の動作を要求する情報を含む。この要求として、例えば、USBハブ2の状態の通知の要求、及びUSBハブ2の動作設定の要求などがある。例えば、USBハブ2は、USBハブ2の各ポートの状態の通知が要求された場合、USBハブ2の各ポートの状態を示す情報をUSBホストコントローラ10に送信する。USBホストコントローラ10は、USBハブ2から受信した情報を、USBホストコントローラドライバ21及びUSBハブフィルタドライバ25を介して、USBハブ制御アプリケーション40に送信する。
【００４９】
USBホストコントローラ10は、USBハブ2への全てのデータの転送が完了すると、USBホストコントローラドライバ21に対して割り込みにより転送完了を通知する（S5）。USBホストコントローラドライバ21は、USBホストコントローラ10からの転送完了を通知する割り込みに応じて、転送要求の正常完了を通知する転送結果をUSBハブフィルタドライバ25に送信する（S6）。USBハブフィルタドライバ25の結果受信機能2533は、USBホストコントローラドライバ21からの転送結果を受信する。USBハブフィルタドライバ25の結果通知機能2534は、その転送結果をUSBハブ制御アプリケーション40に送信する（S7）。
【００５０】
（セレクティブサスペンド）
続いて、図6を参照して、USBのセレクティブサスペンドについて説明する。USBデバイスクラスドライバ及びUSBハブクラスドライバは、対応するUSB機器（USBハブ及びUSBデバイス）の稼働状態に応じて、PCが稼働中であっても対応するUSB機器を低電力状態（サスペンド状態）に遷移させる機能を有する。この機能は、一般的に、「セレクティブサスペンド」と呼ばれている。
【００５１】
例えば、USBデバイスクラスドライバ23は、一定時間の間、対応するUSBデバイス3における動作が検出されなかった場合、そのUSBデバイス3を低電力状態に遷移させる。
【００５２】
USBハブクラスドライバ25は、USBハブ2の全ての下流ポートにおいて、USBデバイス3が未接続であるか、USBデバイス3又は別のUSBハブ2が接続されているが低電力状態である場合、そのUSBハブ2を低電力状態に遷移させる。USBデバイス3又はUSBハブ2が低電力状態になると、そのUSBデバイス3又はUSBハブ2と、その上流のUSBハブ2又はUSBホストコントローラ10との間の通信リンクが使用不可の状態となり、その低電力状態のUSBデバイス3又はUSBハブ2に対するデータ転送が遮断される。
【００５３】
図6は、PC1に、2つのUSBハブ2ａ、2bと、2つのUSBデバイス3ａ、3bとが接続された例について示している。USBハブ2ａは、1つの上流ポートと、４つの下流ポート2001a〜2004aを有する。USBハブ2bは、１つの上流ポートと、4つの下流ポート2001b〜2004bとを有する。PC1のUSBホストコントローラ10は、USBハブ2aの上流ポートと接続されている。USBハブ2ａは、下流ポート2001aがUSBハブ2bの上流ポートと接続されており、下流ポート2002a、2003aが未接続であり、下流ポート2004aがUSBデバイス3ａと接続されている。USBハブ2bは、下流ポート2001b、2002b、2004bが未接続であり、下流ポート2003bがUSBデバイス3bと接続されている。
【００５４】
下流ポート2003bに接続されるUSBデバイス3bは低電力状態である。そのため、USBハブ2bも、低電力状態になっている。USBハブ2ａは、下流ポート2001aに接続されるUSBハブ2bが低電力状態であり、下流ポート2002a、2003aが未接続であるが、下流ポート2004aに接続されるUSBデバイス3ａが通常稼働状態である。そのため、USBハブ2ａは、通常稼働状態のままとなる。
【００５５】
低電力状態のUSBハブ2bにおいて、未接続の下流ポート2001b、2002b、2004bに新たなUSBデバイス3が接続された場合、下流ポート2003bに接続されているUSBデバイス3bが切断された場合、又は、下流ポート2003bに接続された低電力状態のUSBデバイス3bから通常稼働状態への復帰の要求する情報（リモートウェイク）が通知された場合、そのUSBハブ2bは、自分自身を通常稼働状態に復帰させるために上流のUSBハブ2ａを介してUSBホストコントローラ10に対してリモートウェイクを通知する。ここで、USBデバイス3bは、例えば、USBデバイス3bがマウスであれば、ユーザからマウスに対して操作がされたときに、リモートウェイクを通知する。このように、リモートウェイクは、USB機器2、3に対して所定の操作が行われた場合に発行される。
【００５６】
（比較例に係るパーソナルコンピュータのセレクティブサスペンド処理）
続いて、図7を参照して、第3の比較例に係るPC1のセレクティブサスペンド処理について説明する。ここでは、USBハブクラスドライバ22がUSBハブ2を低電力状態に遷移させる場合における処理について説明する。
【００５７】
USBハブクラスドライバ22は、USBハブ2を低電力状態に遷移させる前に、USBハブ2のリモートウェイク通知機能を有効にするためにWait Wake要求をUSBハブフィルタドライバ25に送信する（S11）。USBハブフィルタドライバ25の要求受信機能2521は、USBハブクラスドライバ22からのWait Wake要求を受信する。USBハブフィルタドライバ25の要求送信機能2522は、そのWait Wake要求をUSBホストコントローラドライバ21に送信する（S12）。
【００５８】
USBホストコントローラドライバ21は、Wait Wake要求をすぐに完了させるのではなく、Wait Wake要求を保留する（S13）。また、USBホストコントローラドライバ21は、USBホストコントローラ10を介して、USBハブ2に対してSet Feature（DEVICE_REMOTE_WAKEUP）リクエストを送信する（S14）。Set Feature （DEVICE_REMOTE_WAKEUP）リクエストは、USBハブ2に対するリモートウェイク通知機能の有効化を要求する情報である。USBハブ2は、USBホストコントローラドライバ21からのSet Feature（DEVICE_REMOTE_WAKEUP）リクエストに応じて、リモートウェイク通知機能を有効にする（S15）。
【００５９】
続いて、USBハブクラスドライバ22は、Set Power（D2）要求をUSBハブフィルタドライバ25に送信する（S16）。USBハブフィルタドライバ25の要求受信機能2521は、USBハブクラスドライバ22からのSet Power（D2）要求を受信する。USBハブフィルタドライバ25の要求送信機能2522は、そのSet Power（D2）要求をUSBホストコントローラドライバ21に送信する（S17）。USBホストコントローラドライバ21は、USBハブフィルタドライバ25からのSet Power（D2）要求に応じて、USBホストコントローラ10に対してUSBハブ2が接続されたポートをサスペンドするように指示する（S18）。USBホストコントローラ10は、USBホストコントローラドライバ21からの指示に応じて、USBハブ2が接続されたポートを低電力状態に遷移させる（S19）。
【００６０】
ポートのサスペンド処理が完了すると、USBホストコントローラドライバ21は、Set Power（D2）要求の正常完了を通知する電力管理結果をUSBハブフィルタドライバ25に送信する（S20）。USBハブフィルタドライバ25の結果受信機能2523は、USBホストコントローラドライバ21からの電力管理結果を受信する。USBハブフィルタドライバ25の結果通知機能2524は、その電力管理結果をUSBハブクラスドライバ22に送信する（S21）。
【００６１】
（比較例に係るパーソナルコンピュータのレジューム処理）
続いて、図8を参照して、第3の比較例に係るPC1のレジューム処理について説明する。ここでは、図7を参照して説明した処理の実行後に、セレクティブサスペンド中のUSBハブ2の下流ポートにUSBデバイス3を接続したことにより、USBハブ2からリモートウェイクが通知されて、USBハブ2を通常稼働状態に復帰させる場合における処理について説明する。
【００６２】
USBハブ2は、USBデバイス3が接続されたことを検出すると（S31）、USBホストコントローラ10に対してリモートウェイクを送信する（S32）。USBホストコントローラ10は、USBハブ2からのリモートウェイクに応じて、そのリモートウェイクを割り込みによりUSBホストコントローラドライバ21に通知する（S33）。USBホストコントローラドライバ21は、USBホストコントローラ10からのリモートウェイクの通知に応じて、ステップS13で保留していたWait Wake要求の正常完了を通知する電力管理結果をUSBハブフィルタドライバ25に送信する（S34）。USBハブフィルタドライバ25の結果受信機能2523は、USBホストコントローラドライバ21からの電力管理結果を受信する。USBハブフィルタドライバ25の結果通知機能2524は、その電力管理結果をUSBハブクラスドライバ22に送信する（S35）。
【００６３】
ここで、転送要求及び電力管理要求は、典型的には、I/O要求パケット（IRP：I/O Request Packet）と呼ばれるものである。I/O要求パケットをサポートするOS20では、ドライバは、I/O要求パケットにおける要求の正常完了がそのドライバに通知された際に実行される完了ルーチンを登録することが可能である。そのため、USBホストコントローラドライバ21は、上述したようにWait Wake要求を保留し、USBハブ2からのリモートウェイクの通知に応じてWait Wake要求の正常完了をUSBハブクラスドライバ22に通知するようにしている。これにより、USBハブクラスドライバ22は、Wait Wake要求の発行時にOS20に対して登録した完了ルーチンを実行することが可能となる。ここでは、USBハブクラスドライバ22がWait Wake要求に対して登録した完了ルーチンは、次に説明するSet Power（D0）要求を送信する処理である。
【００６４】
USBハブクラスドライバ22は、USBホストコントローラドライバ21からの結果情報に応じて、Set Power (D0）要求をUSBハブフィルタドライバ25に送信する（S36）。USBハブフィルタドライバ25の要求受信機能2521は、USBハブクラスドライバ22からのSet Power（D0）要求を受信する。USBハブフィルタドライバ25の要求送信機能2522は、そのSet Power（D0）要求をUSBホストコントローラドライバ21に送信する（S37）。USBホストコントローラドライバ21は、USBホストコントローラドライバ21からのSet Power (D0）要求に応じて、USBホストコントローラ10に対してUSBハブ2が接続されたポートをレジュームするように指示する（S38）。USBホストコントローラ10は、USBホストコントローラドライバ21からの指示に応じて、ポートをレジュームして通常稼働状態に復帰させる（S39）。
【００６５】
ポートのレジュームが完了すると、USBホストコントローラドライバ21は、Set Power （D0）要求の正常完了を通知する電力管理結果をUSBハブフィルタドライバ25に送信する（S40）。USBハブフィルタドライバ25の結果受信機能2523は、USBホストコントローラドライバ21からの電力管理結果を受信する。USBハブフィルタドライバ25の結果通知機能2524は、その電力管理結果をUSBハブクラスドライバ22に送信する（S41）。
【００６６】
その後、USBハブクラスドライバ22は、USBハブフィルタドライバ25、USBホストコントローラドライバ21及びUSBホストコントローラ10を介して、USBハブ2にアクセスして下流ポートに接続されたUSBデバイス3の検出および初期化処理を開始する（S42）。すなわち、USBハブクラスドライバ22は、USBデバイス3の接続を検出した場合、USBデバイス3の構成情報の取得、及びデバイスアドレスの割り当てなどを行う。
【００６７】
（比較例における問題点）
しかしながら、比較例に係るUSBハブフィルタドライバ25では、USBハブクラスドライバ22からのUSBハブ2の電力状態の制御と、USBハブ制御アプリケーション40からUSBハブフィルタドライバ25経由でのUSBハブ2へのアクセスとを共存させることが考慮されていない。このように、第3の比較例に係るUSBハブフィルタドライバ25では、アプリケーション転送要求中継機能253が、ハブクラス転送要求中継機能251及び電力管理要求中継機能252とは独立して動作する。そのため、USBハブクラスドライバ22からのUSBハブ2に対する電源管理要求が、USBハブ制御アプリケーション40からのUSBハブ2に対する転送要求と独立して行われることになり、これら二つの処理の競合が発生する可能性がある。以下、二つの処理の競合が発生する例について詳細に説明する。
【００６８】
まず、図9を参照して、一つ目の例について説明する。以下、説明の簡略化のため、図5及び図7で説明した処理と同様の処理については、同一の符号を付し、適宜その説明を省略する。
【００６９】
この例は、先にUSBハブクラスドライバ22がUSBハブ2を低電力状態に遷移させた後（S16〜S21）、USBハブフィルタドライバ25がUSBハブ制御アプリケーション40からの転送要求に応じて、USBハブ2へのデータの転送を開始した（S1〜S3）場合の処理を示している。この場合、USBホストコントローラドライバ21がステップS3でUSBホストコントローラ10に対して転送開始を指示しても、USBハブ2は既に低電力状態になっているため、その転送を正常に行うことはできない。そのため、USBホストコントローラ10は、USBホストコントローラドライバ21に対して割り込みにより転送エラーを通知する（S51）。USBホストコントローラドライバ21は、USBホストコントローラ10からの転送エラーを通知する割り込みに応じて、転送要求のエラーでの完了を通知する転送結果をUSBハブフィルタドライバ25に送信する（S52）。USBハブフィルタドライバ25の結果受信機能2533は、USBホストコントローラドライバ21からの転送結果を受信する。USBハブフィルタドライバ25の結果通知機能2534は、その転送結果をUSBハブ制御アプリケーション40に送信する（S53）。これにより、USBハブ制御アプリケーション40からのUSBハブ2に対する転送要求は、エラーで完了する。
【００７０】
次に、図10を参照して、二つ目の例について説明する。以下、説明の簡略化のため、図5、図7、及び図9で説明した処理と同様の処理については、同一の符号を付し、適宜その説明を省略する。
【００７１】
この例は、先にUSBハブフィルタドライバ25がUSBハブ制御アプリケーション40から転送要求を受けて、USBハブ2へのデータの転送を開始した後に（S1〜S4）、そのデータの転送が完了する前にUSBハブクラスドライバ22がUSBハブ2を低電力状態に遷移させた（S16〜S21）場合の処理を示している。この場合、USBホストコントローラドライバ21は、USBハブ2へのデータの転送が未完了であるにも関わらず、USBハブクラスドライバ22から受信したSet Power（D2）要求に応じて、ポートを低電力状態に遷移させるため、残りのデータの転送を正常に行うことができなくなる。そのため、USBホストコントローラ10は、転送エラーをUSBホストコントローラドライバ21に通知する（S51）。したがって、USBホストコントローラドライバ21は、USBハブフィルタドライバ25からの転送要求をエラーで完了させる（S52）。USBハブフィルタドライバ25も、USBハブ制御アプリケーション40からの転送要求をエラーで完了させる（S53）。
【００７２】
このように、第3の比較例に係るPC1では、USBハブクラスドライバ22による電源管理要求と、USBハブ制御アプリケーション40からのUSBハブクラスドライバ22を介さない転送要求とが競合した場合、転送要求がエラーしてしまうという問題があった。すなわち、USBハブクラスドライバ22は、USBハブ2の電力状態を制御するために、USBハブ2の電力状態を認識している。そのため、アプリケーション30からの転送要求は、USBハブクラスドライバ22を介して送信されるため、USBハブ2が低電力状態の場合は、USBハブクラスドライバ22でその転送要求を抑止することが可能である。例えば、USBハブクラスドライバ22で、アプリケーション30からの転送要求をUSBハブ2の電力状態が通常稼働状態になるまで保留するなどの制御を実施することが可能である。それに対して、USBハブ制御アプリケーション40からの転送要求は、USBハブクラスドライバ22を介して送信されず、直接USBハブフィルタドライバ25に送信される。そのため、USBハブ2の電力状態が低電力状態であっても、USBハブ制御アプリケーション40からの転送要求は抑止されず、USBハブ2に対する転送が行われてエラーが発生してしまう。以下、このような問題を解決するための実施の形態について説明していく。
【００７３】
＜実施の形態1＞
（実施の形態1に係るパーソナルコンピュータの構成）
続いて、実施の形態1に係るPC1について説明する。なお、これまでに説明した内容と同様の内容については、同一の符号を付し、適宜その説明を省略する。実施の形態1に係るPC1の構成については、図3に示すPC1の構成と同様であるため、その説明を省略する。
【００７４】
なお、PC1は、CPU（Central Processing Unit）及び記憶部を有し、CPUが記憶部に格納されたアプリケーション30、40及びOS20（ドライバ21〜23、25）を実行することで、後述の処理を実現する。以降の各実施の形態においても、PC1で実行されるプログラムについては同様のことが言える。記憶部は、上述のプログラム20、30、40を格納可能な記憶装置の少なくとも１つを含む。記憶装置は、例えば、メモリ及びハードディスクなどである。
【００７５】
（実施の形態1に係るUSBハブフィルタドライバの構成）
図11を参照して、実施の形態1に係るUSBハブフィルタドライバ25の機能ブロック構成について説明する。実施の形態1に係るUSBハブフィルタドライバ25は、図4に示すUSBハブフィルタドライバ25と比較して、さらに、電力状態管理機能254と、転送状態管理機能255とを有する。電力管理転送要求中継機能252、アプリケーション転送要求中継機能253、電力状態管理機能254、及び転送状態管理機能255は、相互に連携して動作する。
【００７６】
電力状態管理機能254は、USBハブクラスドライバ22からの電力状態変更要求を監視してUSBハブ2の電力状態を管理する。電力状態管理機能254は、電力管理要求中継機能252において要求受信機能2521から要求送信機能2522に伝送される電力管理要求と、電力管理要求中継機能252において結果受信機能2523から結果通知機能2524に伝送される電力管理結果とを中継する。電力状態管理機能254は、電力管理要求及び電力管理結果を中継する際に、その電力管理要求及び電力管理結果に基づいてUSBハブ2の電力状態を認識する。
【００７７】
転送状態管理機能255は、USBハブ制御アプリケーション40からの転送要求の処理状態を管理する。転送状態管理機能255は、アプリケーション転送要求中継機能253において要求受信機能2531から要求送信機能2532に伝送される転送要求と、アプリケーション転送要求中継機能253において結果受信機能2533から結果通知機能2534に伝送される転送結果とを中継する。転送状態管理機能255は、USBハブ制御アプリケーション40からの転送要求及び転送結果を中継する際に、その転送要求及び転送結果に基づいて転送要求の制御及び転送要求の実行状況の認識をする。
【００７８】
続いて、図12を参照して、実施の形態1に係る電力状態管理機能254の機能ブロック構成について説明する。電力状態管理機能254は、USBハブ2の現在の電力状態2541を以下の4つの状態のいずれかとして認識することで管理する。
【００７９】
Working: 通常稼働状態
Suspend Pending: 低電力状態（サスペンド状態）への遷移途中の状態
Suspended: 低電力状態（サスペンド状態）
Resume Pending: 通常稼働状態への復帰途中の状態
【００８０】
また、電力状態管理機能254は、レジューム要求発行機能2542と、サスペンド要求保留機能2543を有する。レジューム要求発行機能2542は、低電力状態のUSBハブ2に対してUSBハブ制御アプリケーション40から転送要求があった場合にUSBハブ2を通常稼働状態に遷移（レジューム）させる。サスペンド要求保留機能2543は、USBハブ2に対するデータの転送中にUSBハブクラスドライバ22からSet Power（D2）要求があった場合にそのSet Power（D2）を転送が完了するまで保留する。
【００８１】
電力状態管理機能254は、USBハブクラスドライバ22から、USBハブ2の通常稼働状態から低電力状態への遷移を要求する電力管理要求（Set Power（D2）要求）を受信し、それをUSBホストコントローラドライバ21に送信する際に、電力状態をSuspend Pendingに変更する。さらに、電力状態管理機能254は、USBホストコントローラドライバ21から、電力管理要求（Set Power（D2）要求）の正常完了を通知する電力管理結果を受信した場合、電力状態をSuspendedに更新する。一方、電力状態管理機能254は、USBハブ2のサスペンド処理が失敗し、USBホストコントローラドライバ21から、電力管理要求（Set Power（D2）要求）のエラーでの完了を通知する電力管理結果を受信した場合は、電力状態をWorkingに戻す。
【００８２】
一方、電力状態管理機能254は、USBハブクラスドライバ22から、低電力状態のUSBハブ2に対して通常稼働状態への復帰を要求する電力管理要求（Set Power（D0）要求）を受信し、それをUSBホストコントローラドライバ21に送信する際に、電力状態をResume Pendingに変更する。さらに、電力状態管理機能254は、USBホストコントローラドライバ21から、電力管理要求（Set Power（D0）要求）の正常完了を通知する電力管理結果を受信した場合、電力状態をWorkingに更新する。電力状態管理機能254は、USBハブ2のレジューム処理が失敗し、USBホストコントローラドライバ21から、電力管理要求（Set Power（D0）要求）のエラーでの完了を通知する電力管理結果を受信した場合は、電力状態をSuspendedに戻す。
【００８３】
USBハブ制御アプリケーション40から転送要求を受信した時点で電力状態がSuspendedの場合、USBハブフィルタドライバ25は、USBハブ2をレジュームさせて、電力状態2541がWorkingになった後、USBハブ2への転送を開始する。USBハブ制御アプリケーション40から転送要求を受信した時点で電力状態2541がResume Pendingの場合、USBハブフィルタドライバ25は、既にレジューム処理が開始されているため、その時点では何も行わず、電力状態2541がWorkingになるのを待って、USBハブ2への転送を開始する。USBハブ制御アプリケーション40から転送要求を受信した時点で電力状態がSuspend Pendingの場合、USBハブフィルタドライバ25は、現在サスペンド処理の途中であることから、その時点では何も行わず、電力状態がSuspendedになるのを待ってからUSBハブ2を再度レジュームさせ、電力状態がWorkingになった後、USBハブ2への転送を開始する。
【００８４】
続いて、図13を参照して、実施の形態1に係る転送状態管理機能255の機能ブロック構成について説明する。図13に示すように、転送状態管理機能255は、転送要求カウンタ2551と、転送要求カウンタ更新機能2552と、転送要求キュー2553と、転送要求保留機能2554と、保留転送実行機能2555とを有する。
【００８５】
転送要求カウンタ2551は、USBハブ制御アプリケーション40から要求されて処理中であり、まだ完了していない転送要求の数を示すように転送要求カウンタ更新機能2552によって更新される。より具体的には、転送要求カウンタ2551として、PC1が有する記憶部が利用される。転送要求カウンタ更新機能2552は、転送要求カウンタ2551を更新する。より具体的には、転送要求カウンタ更新機能2552は、要求受信機能2531による転送要求の受信時に呼び出されて転送要求カウンタ2551を1増加（インクリメント）する。また、転送要求カウンタ更新機能2552は、結果受信機能2533による転送結果の受信時に呼び出されて転送要求カウンタ2551を1減少（デクリメント）する。よって、転送要求カウンタ2551が0の場合、USBハブ制御アプリケーション40に要求されて処理中の転送要求が全く存在しないことを意味し、転送要求カウンタ2551が0以外の場合は、USBハブ制御アプリケーション40に要求されて処理中の転送要求が存在することを意味する。
【００８６】
転送要求キュー2553は、保留される転送要求が格納される。より具体的には、転送要求キュー2553として、USBハブ制御アプリケーション40から要求された転送要求のポインタを格納するために、PC1が有する記憶部が利用される。転送要求保留機能2554は、USBハブ2が低電力状態などのすぐに転送を開始できない状態である場合に、USBハブ制御アプリケーション40からの転送要求を転送要求キュー2553に挿入して保留する。保留転送実行機能2555は、USBハブ2が通常稼働状態に遷移して転送要求を処理可能となった場合に、転送要求キュー2553に挿入された保留中の転送要求を取り出して、取り出した転送要求を送信する。
【００８７】
（実施の形態1に係るUSBハブフィルタドライバの処理）
続いて、図14〜図18を参照して、実施の形態1に係るUSBハブフィルタドライバ25の処理について説明する。まず、図14を参照して、USBハブフィルタドライバ25がUSBハブ制御アプリケーション40から転送要求を受信した際の処理について説明する。
【００８８】
要求受信機能2531がUSBハブ制御アプリケーション40から転送要求を受信した場合、転送要求カウンタ更新機能2552は、転送要求カウンタ2551を1インクリメントする（S101）。転送状態管理機能255は、電力状態管理機能254から現在の電力状態2541を取得し、それがWorkingであるか否かを判定する（S102）。現在の電力状態2541がWorkingである場合（S102：Yes）、転送状態管理機能255は、要求送信機能2532を介して、USBホストコントローラドライバ21に転送要求を送信する（S103）。現在の電力状態2541がWorking以外である場合（S102：No）、転送状態管理機能255は、転送要求保留機能2554を介して転送要求を転送要求キュー2553に挿入して保留する（S104）。
【００８９】
さらに、転送状態管理機能255は、電力状態管理機能254から取得した現在の電力状態2541がSuspendedであるか否かを判定する（S105）。現在の電力状態2541がSuspendedである場合（S105：Yes）、電力状態管理機能254は、現在の電力状態2541をResume Pendingに変更する。その後、レジューム要求発行機能2542は、要求送信機能2522を介して、USBハブ2の通常稼働状態への復帰を要求する電力管理要求（Set Power（D0）要求）をUSBホストコントローラドライバ21に送信する（S107）。現在の電力状態2541がSuspended以外である場合（S105：No）、上述の現在の電力状態2541の変更及び電力管理要求は行われない。
【００９０】
続いて、図15を参照して、USBハブフィルタドライバ25がUSBハブクラスドライバ22から低電力状態への遷移を要求する電力管理要求（Set Power（D2）要求）を受信した際の処理について説明する。
【００９１】
要求受信機能2521がUSBハブクラスドライバ22から電力管理要求（Set Power（D2）要求）を受信すると、電力状態管理機能254は、転送状態管理機能255から現在の転送要求カウンタ2551を取得し、その値が0であるか否かを判定する（S201）。転送要求カウンタ2551が0である場合（S201：Yes）、電力状態管理機能254は、現在の電力状態2541をSuspend Pendingに変更する（S202）。その後、電力状態管理機能254は、要求送信機能2522を介してSet Power（D2）要求をUSBホストコントローラドライバ21に対して送信する（S203）。一方、転送要求カウンタ2551が0以外である場合（S201：No）、電力状態管理機能254は、USBハブ制御アプリケーション40に要求されて処理中の転送が存在するため、サスペンド要求保留機能2543を介してSet Power（D2）要求を保留する（S204）。
【００９２】
続いて、図16を参照して、USBハブフィルタドライバ25がUSBホストコントローラドライバ21からUSBハブ制御アプリケーション40からの転送要求の正常完了を通知する転送結果を受信した際の処理について説明する。
【００９３】
結果受信機能2533がUSBホストコントローラドライバ21から転送結果を受信すると、転送要求カウンタ更新機能2552は、転送要求カウンタ2551を1デクリメントする（S301）。結果通知機能2534は、転送要求が完了したことを通知する転送結果をUSBハブ制御アプリケーション40に送信する（S302）。その後、電力状態管理機能254は、サスペンド要求保留機能2543に、低電力状態への遷移を要求する電力管理要求（Set Power（D2）要求）が保留されているか否かを判定する（S303）。ステップS204で電力管理要求（Set Power（D2））要求が保留されている場合は、電力状態管理機能254は、転送状態管理機能255から転送要求カウンタ2551の値を取得し、それが0であるか否かを判定する（S304）。転送要求カウンタ2551が0である場合（S304：Yes）、USBハブ制御アプリケーション40から要求された全ての転送が完了済みであるため、ステップS202、S203と同様の処理が実行される（S305、S306）。これにより、USBハブ2が低電力状態に遷移する。
【００９４】
続いて、図17を参照して、USBハブフィルタドライバ25がUSBホストコントローラドライバ21からSet Power（D2）要求の正常完了を通知する電力管理結果を受信した際の処理について説明する。
【００９５】
結果受信機能2523がUSBホストコントローラドライバ21から電力管理結果を受信すると、電力状態管理機能254は、現在の電力状態2541をSuspendedに変更する（S401）。その後、電力状態管理機能254は、転送状態管理機能255を介して、転送要求キュー2553に保留中の転送要求が存在するか否かを判定する（S402）。保留中の転送要求が存在する場合（S402：Yes）、現在の電力状態をResume Pendingに変更する（S403）。その後、レジューム要求発行機能2542は、要求送信機能2522を介して、USBハブ2の通常稼働状態への復帰を要求する電力管理要求（Set Power（D0）要求）をUSBホストコントローラドライバ21に送信する（S404）。
【００９６】
続いて、図18を参照して、USBハブフィルタドライバ25がUSBホストコントローラドライバ21からSet Power (D0)要求の正常完了を通知する電力管理結果を受信した際の処理について説明する。
【００９７】
結果受信機能2523がUSBホストコントローラドライバ21からSet Power（D0）要求に対する電力管理結果を受信すると、電力状態管理機能254は、現在の電力状態2541をWorkingに変更する（S501）。転送状態管理機能255は、転送要求キュー2553に保留中の転送要求が存在するか否かを判定し（S503）、保留中の転送要求が存在する場合は、保留転送実行機能2555を介して、転送要求キュー2553に保留中の転送要求がなくなるまで、以下の(1)、(2)の処理を繰り返す（S503）。
(1)  転送要求キュー2553から保留中の転送要求を取得する（S504）。
(2)  要求送信機能2532を介して、取得した転送要求をUSBホストコントローラドライバ21に対して送信する（S505）。
【００９８】
（実施の形態1に係るパーソナルコンピュータの処理）
続いて、図19を参照して、USBハブ2がセレクティブサスペンドにより低電力状態になっているときに、USBハブフィルタドライバ25がUSBハブ制御アプリケーション40から転送要求を受信した場合の処理について説明する。
【００９９】
USBハブフィルタドライバ25は、USBハブクラスドライバ22からSet Power（D2）要求を受信すると（S16）、現在の電力状態2541をSuspend Pendingに変更してから（S202）、Set Power（D2）要求をUSBホストコントローラドライバ21に送信する（S203、S17）。これにより、USBハブ2が低電力状態に遷移する（S18、S19）。
【０１００】
Set Power（D2）要求の正常完了を通知する電力管理結果をUSBホストコントローラドライバ21から受信すると（S20）、USBハブフィルタドライバ25は、USBハブ2の現在の電力状態2541をSuspendedに変更して、USBハブ2が低電力状態であることを記憶する（S401）。USBハブフィルタドライバ25は、そのSet Power（D2）要求の正常完了を通知する電力管理結果をUSBハブクラスドライバ22に送信する（S21）。
【０１０１】
その後、USBハブ制御アプリケーション40からUSBハブ2への転送要求を受信すると（S1）、USBハブフィルタドライバ25は、転送要求カウンタ2551をインクリメントした後（S101）、現在の電力状態2541がSuspendedである（すなわち、USBハブ2が低電力状態である）ことから、その転送要求をすぐにUSBホストコントローラ21に送らずに、以下の処理を行う。これにより、ステップS37〜S39と同様の処理が実行され、USBハブ2が通常稼働状態に復帰する。
(1)  転送要求を転送要求キュー2553に挿入して保留する（S104）。
(2)  現在の電力状態2541をResume Pendingに変更する（S106）。
(3)  Set Power（D0）要求をUSBホストコントローラドライバ21に送信する（S107）。
【０１０２】
USBホストコントローラドライバ21からSet Power（D0）要求の正常完了を通知する電力管理結果を受信すると（S40）、USBハブフィルタドライバ25は、現在の電力状態2541をWorkingに変更して（S501）、Set Power（D0）要求の正常完了を通知する電力管理結果をUSBハブクラスドライバ22に送信する（S41）。また、USBハブフィルタドライバ25は、転送要求キュー2553に保留していた転送要求を取得し（S503）、USBホストコントローラドライバ21に送信する（S2）。これにより、USBハブ2への転送が開始される（S3〜S4）。この時点では、USBハブ2は既に通常稼働状態に復帰しているため、USBハブ2への転送は、正常に処理されて完了する（S5〜S7）。
【０１０３】
続いて、図20を参照して、USBハブ2への転送を実行中に、USBハブクラスドライバ22がUSBハブ2をセレクティブサスペンドしようとした場合の処理について説明する。
【０１０４】
USBハブフィルタドライバ25は、転送要求に応じたUSBハブ2への転送中に（S1〜S4）、USBハブクラスドライバ22からSet Power（D2）要求を受信すると（S16）、現在の転送要求カウンタ2551が0以外である（すなわち、USBハブ2への転送要求が未完了である）ため、Set Power（D2）要求を一旦保留する（S204）。
【０１０５】
その後、USBホストコントローラドライバ21からUSBハブ2への転送要求の正常完了を通知する転送結果を受信すると（S5、S6）、USBハブフィルタドライバ25は、転送要求カウンタ2551をデクリメントした後（S301）、その転送結果をUSBハブ制御アプリケーション40に送信する（S7）。さらに、USBハブフィルタドライバ25は、転送要求カウンタ2551が0になっていることから、現在の電力状態2541をSuspend Pendingに変更した後（S305）、保留していたSet Power（D2）要求をUSBホストコントローラドライバ21に送信する（S306）。これにより、USBハブ2のサスペンド処理が開始される（S17〜S19）。USBホストコントローラドライバ21からSet Power（D2）要求の正常完了を通知する電力管理結果を受信すると（S20）、USBハブフィルタドライバ25は、現在の電力状態2541をSuspendedに変更した後（S401）、その電力管理結果をUSBハブ制御アプリケーション40に送信する（S21）。
【０１０６】
ここで、USBホストコントローラ21から転送要求の完了を通知する転送結果を受信した後、保留していたSet Power（D2）要求の処理を行うまでに、一定時間の遅延を設けるようにしてもよい。そして、その一定時間の間にUSBハブ制御アプリケーション40から新たな転送要求を受信した場合は、Set Power（D2）要求の処理を再度保留し、USBホストコントローラドライバ21に転送要求を送信してUSBハブ2への新たな転送を先に行うようにしてもよい。このようにすることで、USBハブ制御アプリケーション40が転送を要求する頻度が高い場合に、不要なサスペンド・レジューム処理を回避し、転送完了までに要する時間を短縮することができる。
【０１０７】
実施の形態1に係るUSBハブフィルタドライバ25は、USBハブクラスドライバ22がUSBホストコントローラドライバ21に対して発行するUSBハブ2の電力状態管理要求（すなわち、Set Power（D2）要求やSet Power（D0）要求）をUSBハブフィルタドライバ25において中継する際に、電力状態管理要求に基づいてUSBハブ2の電力状態を更新することで、USBハブ2の電力状態2541を管理する電力状態管理機能254を有する。すなわち、電力状態管理機能254は、Set Power（D2）要求が正常に完了した場合、USBハブ2が低電力状態（Suspended）に遷移したと記憶し、Set Power（D0）要求が正常に完了した場合、USBハブ2が通常稼働状態（Working）に復帰したと記憶する。
【０１０８】
また、実施の形態1に係るUSBハブフィルタドライバ25は、USBハブ制御アプリケーション40から低電力状態のUSBハブ2に対して転送要求を受信した場合に、その転送要求を保留するとともに、処理中の転送要求の情報を管理する転送状態管理機能255を有する。
【０１０９】
転送状態管理機能255は、USBハブ制御アプリケーション40からUSBハブ2への転送要求を受信した際に、USBハブ2の現在の電力状態2541を確認し、低電力状態（Suspended）である場合は、その転送要求を保留する。電力状態管理機能254は、USBハブ2を通常稼働状態に復帰させるためにUSBホストコントローラドライバ21に対してSet Power（D0）要求を発行する。転送状態管理機能255は、そのSet Power（D0）要求が正常完了してUSBハブ2が通常稼働状態（Working）に復帰した後、USBハブ2に対する転送を開始する。
【０１１０】
また、電力状態管理機能254は、USBハブクラスドライバ22からSet Power（D2）要求を受信した際に、USBハブ制御アプリケーション40からの転送要求を処理中であるか否かを確認し、処理中の転送が存在する場合は、そのSet Power（D2）要求を保留する。そして、電力状態管理機能254は、全ての転送要求の処理が完了した後、Set Power（D2）要求をUSBホストコントローラドライバ21に送信して、USBハブ2のサスペンド処理を開始する。
【０１１１】
これによって、低電力状態のUSBハブ2に対して転送を実行することで、その転送がエラーになってしまうという課題を解決することができる。すなわち、USBハブ制御アプリケーション40の指示によるUSBハブ2への転送と、USBハブクラスドライバ22によるセレクティブサスペンド制御とを共存させることができる。言い換えると、USBハブ制御アプリケーション40から転送要求を受信した時点でUSBハブ2が低電力状態である場合も、USBハブ制御アプリケーション40からの転送要求の処理中にUSBハブクラスドライバ22から低電力状態への遷移の電力管理要求を受信した場合にも、USBハブ2への転送を正常に完了させることができる。
【０１１２】
＜実施の形態2＞
（実施の形態2に係るパーソナルコンピュータの構成）
続いて、実施の形態2に係るPC1について説明する。なお、これまでに説明した内容と同様の内容については、同一の符号を付し、適宜その説明を省略する。実施の形態2に係るPC1の構成については、実施の形態1に係るPC1の構成と同様であるため、その説明を省略する。
【０１１３】
（実施の形態2に係るUSBハブフィルタドライバの構成）
実施の形態2に係るUSBハブフィルタドライバ25の機能ブロック構成については、図11に示すUSBハブフィルタドライバ25と同様であるため、その説明を省略する。実施の形態2に係る転送状態管理機能255の機能ブロック構成についても、図13に示す転送状態管理機能255の機能ブロック構成と同様であるため、その説明を省略する。
【０１１４】
続いて、図21を参照して、実施の形態2に係る電力状態管理機能254の機能ブロック構成について説明する。図21に示すように、実施の形態2に係る電力状態管理機能254は、図12に示す電力状態管理機能254と比較し、レジューム要求発行機能2542及びサスペンド要求保留機能2543に代えて、疑似リモートウェイク発生機能2544及びサスペンド要求変更機能2545を有する。
【０１１５】
疑似リモートウェイク発生機能2544は、低電力状態のUSBハブ2を通常稼働状態に復帰させるために、USBハブ2からリモートウェイクが通知された状況を疑似的に発生させる。サスペンド要求変更機能2545は、USBハブ2への転送中にUSBハブクラスドライバ22から低電力状態への遷移を要求する電力管理要求（Set Power（D2）要求）を受信した場合に、サスペンド処理が行われないように電力管理要求の内容を変更してUSBホストコントローラドライバ21に送信する。
【０１１６】
続いて、図22を参照して、USBハブフィルタドライバ25がUSBハブクラスドライバ22からリモートウェイクの有効化を要求する電力管理要求（Wait Wake要求）を受信した際の処理について説明する。
【０１１７】
要求受信機能2521がUSBハブクラスドライバ22から電力管理要求（Wait Wake要求）を受信すると、疑似リモートウェイク発生機能2544は、受信したWait Wake要求のポイントを示すポインタ情報を内部に保存し（S601）、要求送信機能2522よりWait Wake要求をUSBホストコントローラドライバ21に送信する（S602）。
【０１１８】
ここで、転送要求及び電力管理要求（Wait Wake要求、Set Power（D2）要求、Set Power（D0）要求など）は、その発行の際にPC1が有する記憶部に確保された領域に保持された情報となる。そして、各ドライバ21〜23、25間での転送要求及び電力管理要求の送受信は、厳密には、そのポインタ（記憶部に確保した領域のアドレス）を送受信している。ここで、上述したように、転送要求及び電力管理要求は、典型的には、I/O要求パケットと呼ばれるものである。そのため、上述のように、Wait Wake要求のポインタ情報を保存しておくことで、Wait Wake要求を他のドライバに送信しても、任意のタイミングで保存したポインタ情報に基づいて、送信したWait Wake要求に対する制御を実施することが可能となる。
【０１１９】
続いて、図23は、USBハブフィルタドライバ25がUSBハブ制御アプリケーション40から転送要求を受信した際の処理について説明する。
【０１２０】
図23に示す処理は、図14を参照して説明した実施の形態1に係る処理と比較して、現在の電力状態2541がSuspendedである場合（S105：Yes）、ステップS106、S107に代えて、ステップS111を実行する点が異なる。現在の電力状態2541がSuspendedである場合（S105：Yes）、疑似リモートウェイク発生機能2544は、ステップS601で保存したWait Wake要求のポインタ情報に基づいて、USBホストコントローラドライバ21に送信したWait Wake要求をキャンセルする（S111）。
【０１２１】
続いて、図24を参照して、USBホストコントローラドライバ21からWait Wake要求の完了を通知する電力管理結果を受信した際の処理について説明する。
【０１２２】
結果受信機能2523がUSBホストコントローラドライバ21から電力管理結果を受信すると、疑似リモートウェイク発生機能2544は、その電力管理結果で完了が通知されたWait Wake要求の完了ステータスがCanceledであるか否かを判定する（S701）。すなわち、USBホストコントローラドライバ21は、USBハブフィルタドライバ25からWait Wake要求のポインタを指定してキャンセルが指示されると、そのポインタに対応するWait Wake要求の完了ステータスをCanceledとして電力管理結果をUSBハブフィルタドライバ25に送信する。
【０１２３】
完了ステータスがCanceledである（すなわち、このWait Wake要求がキャンセルされたものである）場合（S701：Yes）、疑似リモートウェイク発生機能2544は、そのWait Wake要求が、先にステップS111で自身がキャンセルしたWait Wake要求であるか否かを判定する（S702）。
【０１２４】
ここで、I/O要求パケットは、その要求の処理結果を示す完了ステータスのフィールドが含まれている。上位のドライバから送信されたI/O要求パケットは、下位のドライバで完了ステータスが設定されて、再び要求元の上位のドライバに要求の処理結果を示す情報として戻される。すなわち、I/O要求パケットは、その要求に対する処理が完了して要求元に戻されるまでPC1上に保持され続ける情報となる。よって、転送結果及び電力管理結果は、より具体的には、それぞれ、転送要求及び電力管理要求において完了ステータスが設定された情報となる。そのため、疑似リモートウェイク発生機能2544は、ステップS601で保存したポインタと、電力管理結果（完了ステータスが設定された電力管理要求）のポインタとが一致する場合、完了が通知されたWait Wake要求が、先に自身がキャンセルしたWait Wake要求であると判定する。
【０１２５】
完了が通知されたWait Wake要求が、自分がキャンセルしたWait Wake要求である場合（S702：Yes）、疑似リモートウェイク発生機能2544は、Wait Wake要求の完了ステータスをSuccessに変更する（S703）。ステップS701でNoの場合、すなわち、完了ステータスがCanceledではない場合、および、ステップS702でNoの場合、すなわち、自分がキャンセルしたWait Wake要求ではない場合、および、ステップS703の実行（Wait Wake要求の完了ステータスをSuccessに変更した）後は、Wait Wake要求の完了を通知する電力管理結果をUSBハブクラスドライバ22に送信する（S704）。よって、USBハブクラスドライバ22に通知される電力管理結果は、ステップS701でNoの場合はUSBホストコントローラドライバ21が設定した完了ステータスとなり、ステップS702でNoの場合はCanceledとなり、ステップS703を実行した場合はSuccessとなる。
【０１２６】
続いて、図25を参照して、USBハブフィルタドライバ25がUSBハブクラスドライバ22からSet Power (D2)要求を受信した際の処理について説明する。
【０１２７】
図25に示す処理は、図15を参照して説明した実施の形態1に係る処理と比較して、転送要求カウンタ2551が0以外である場合（S201：No）、ステップS204に代えて、ステップS211、S212が実行される点が異なる。転送要求カウンタ2551が0以外である場合（S201：No）、サスペンド要求変更機能2545は、電力管理要求（Set Power要求）で指定された電力状態をD2からD0に変更する（S211）。よって、サスペンド要求変更機能2545は、要求送信機能2522を介して、USBハブ2の通常稼働状態への復帰を要求する電力管理要求（Set Power（D0）要求）をUSBホストコントローラドライバ21に対して送信する（S212）。
【０１２８】
続いて、図26を参照して、USBハブフィルタドライバ25がUSBホストコントローラドライバ21からUBSハブ制御アプリケーション40からの転送要求の完了を通知する転送結果を受信した際の処理について説明する。
【０１２９】
図26に示す処理は、図16を参照して説明した実施の形態1に係る処理と比較して、ステップS302の実行後に、ステップS303〜S306に代えて、ステップS311、S312が実行される点が異なる。ステップS302の実行後、疑似リモートウェイク発生機能2544は、Wait Wake要求のポインタ情報が保存されているか否かを判定する（S311）。Wait Wake要求のポインタ情報が保存されている場合（S311：Yes）、疑似リモートウェイク発生機能2544は、ステップS111と同様の処理を実行する（S312）。これにより、Wait Wake要求がキャンセルされる。
【０１３０】
続いて、図27を参照して、USBハブフィルタドライバ25がUSBホストコントローラドライバ21からSet Power（D0）要求が正常完了したことを通知する電力管理結果を受信した際の処理について説明する。
【０１３１】
図27に示す処理は、図18を参照して説明した実施の形態1に係る処理と比較して、さらに、ステップS511が実行され、ステップS511でNoの場合にステップS501〜S505が実行され、ステップS511でYesの場合にステップS512、S513が実行される点が異なる。結果受信機能2523がUSBホストコントローラドライバ21から電力管理結果を受信すると、サスペンド要求変更機能2545は、その電力管理要求が、ステップS211で電力状態を変更したSet Power要求の完了を通知する電力管理結果であるか否かを判定する（S511）。この判定は、上述のWait Wake要求の場合と同様に、Set Power要求のポインタ情報を保存しておき、そのSet Power要求と電力管理結果のポインタを比較することで実施すればよい。電力管理要求が電力状態を変更したSet Power要求の完了を通知するものである場合（S511：Yes）、サスペンド要求変更機能2545は、電力管理結果（完了ステータスが設定されたSet Power要求）で指定された電力状態をD0からD2に変更する（S512）。よって、サスペンド要求変更機能2545は、結果通知機能2524を介して、USBハブ2の低電力状態への復帰を要求する電力管理要求（Set Power（D2）要求）の正常完了を通知する電力管理結果をUSBハブクラスドライバ22に対して送信することになる（S513）。
【０１３２】
（実施の形態2に係るパーソナルコンピュータの処理）
続いて、図28を参照して、USBハブ2がセレクティブサスペンドにより低電力状態になっているときに、USBハブフィルタドライバ25がUSBハブ制御アプリケーション40から転送要求を受信した場合の処理について説明する。
【０１３３】
USBハブフィルタドライバ25は、USBハブクラスドライバ22からWait Wake要求を受信すると（S11）、そのWait Wake要求のポインタを内部に保存する（S601）。その後、USBハブフィルタドライバ25は、そのWait Wake要求をUSBホストコントローラドライバ21に送信する（S12）。USBホストコントローラドライバ21は、Wait Wake要求をすぐには完了させず、内部に保留する（S13）。以降、図7に示すステップS14、15も実行されるが、図示を省略している。次に、図19での説明と同様に、USBハブ2が低電力状態に遷移され、USBハブフィルタドライバ25が管理する現在の電力状態2541がSuspendedに変更される（S16〜S21、S401）。
【０１３４】
USBハブフィルタドライバ25は、USBハブ制御アプリケーション40から転送要求を受信すると（S1）、USBハブフィルタドライバ25は、転送要求カウンタ2551をインクリメントした後（S101）、現在の電力状態2541がSuspendedであることから、その転送要求を転送要求キュー2553に挿入して一旦保留する（S104）。USBハブフィルタドライバ25は、先にステップS601で保存したWait Wake要求のポインタ情報を用いて、USBホストコントローラドライバ21に対してそのWait Wake要求のキャンセルを指示する（S111）。USBホストコントローラドライバ21は、Wait Wake要求のキャンセル指示に応じて、保留していたWait Wake要求のキャンセル処理を実行する（S61）。USBホストコントローラドライバ21は、完了ステータスをCanceledとして、Wait Wake要求のキャンセルによる完了を通知する電力管理結果をUSBハブフィルタドライバ25に送信する（S62）。
【０１３５】
USBハブフィルタドライバ25は、自分がキャンセルを指示したWait Wake要求が完了ステータスCanceledで完了したことを通知する電力管理結果を受信すると、その完了ステータスをSuccessに変更して（S703）、Wait Wake要求の正常完了を通知する電力管理結果をUSBハブクラスドライバ22に送信する（S35）。USBハブクラスドライバ22は、Wait Wake要求の正常完了を受信すると、実際にUSBハブ2からリモートウェイクが発生したと判断し、USBハブ2を通常稼働状態に復帰させる処理を行うために、USBホストコントローラドライバ21に対してUSBハブフィルタドライバ25を介してSet Power（D0）要求を発行する（S36）。以降の処理（S37〜S41、S501、S2〜S7）については、図19での説明と同様であるため、その説明を省略する。これにより、USBハブ2が通常稼働状態に復帰し、USBハブ2への転送が正常に完了する。ここで、Wait Wake要求の完了ステータスがCanceledである場合、USBハブクラスドライバ22は、その電力管理結果に応じてSet Power（D0）要求を発行しない。それに対して、上述の処理によれば、Wait Wake要求の完了ステータスをSuccessに変更しているため、USBハブクラスドライバ22にSet Power（D0）要求を発行させて、USBハブ2を通常稼働状態に復帰させてのUSBハブ2への転送を実施することができる。
【０１３６】
続いて、図29を参照して、USBハブ2への転送を実行中に、USBハブクラスドライバ22がUSBハブ2をセレクティブサスペンドしようとした場合の処理について説明する。
【０１３７】
USBハブフィルタドライバ25は、転送要求に応じたUSBハブ2への転送中に（S1〜S4）、USBハブクラスドライバ22からWait Wake要求を受信すると（S11）、Wait Wake要求のポインタを内部に保存する（S601）。その後、USBハブフィルタドライバ25は、そのWait Wake要求をUSBホストコントローラドライバ21に送信する（S12）。以降、図7に記載のステップS13〜15も実行されるが、図示を省略している。
【０１３８】
続いて、USBハブフィルタドライバ25は、USBハブクラスドライバ22からSet Power（D2）要求を受信すると（S16）、Set Power要求にて指定された遷移先の電力状態をD2からD0に変更し（S211）、Set Power（D0）要求としてUSBホストコントローラドライバ21に送信する（S37）。USBホストコントローラドライバ21は、USBハブ2が元々通常稼働状態（D0）であるので、何も行わずにSet Power（D0）要求の正常完了を通知する電力管理結果をUSBハブフィルタドライバに送信する（S40）。USBハブフィルタドライバ25は、ホストコントローラドライバ21からSet Power（D0）要求の正常完了を通知する電力管理結果を受信すると、Set Power要求にて指定された遷移先の電力状態をD0からD2に変更されたとみなし（S512）、Set Power（D2）要求の正常完了を通知する電力管理結果としてUSBハブクラスドライバ22に送信する（S21）。
【０１３９】
これにより、USBハブクラスドライバ22は、自分が発行したSet Power（D2）要求が正常に実行され、USBハブ2が低電力状態になったと認識する。一方、USBハブ2は通常稼働状態のままなので、先にハブ制御アプリケーション40から要求されて実行されていたUSBハブ2への転送が継続され正常に完了する（S5〜S7）。なお、USBハブフィルタドライバ25がSet Power要求を変更してUSBホストコントローラドライバ21に送信せずに、USBハブフィルタドライバ25自身がSet Power（D2）要求の受信に応じて、Set Power（D2）要求の正常完了をUSBハブクラスドライバ22に通知するようにしてもよい。
【０１４０】
ここまでの処理では、USBハブクラスドライバ22はUSBハブ2が低電力状態であると認識しているが、実際には通常稼働状態であるという双方の状態の不一致が生じてしまう。そこで、USBハブフィルタドライバ25は、USBハブ制御アプリケーション40から要求されたUSBハブ2への転送が完了すると、先にUSBハブクラスドライバから発行されていたWait Wake要求をキャンセルする（S312）。以降の処理（S61、S62、S703、S35）については、図28での説明と同様であるため、その説明を省略する。
【０１４１】
その後、USBハブクラスドライバ22は、Wait Wake要求の正常完了を通知する電力管理結果の受信に応じて、USBハブ2を通常稼働状態に復帰させるために、Set Power（D0）要求を、USBハブフィルタドライバ25を介してUSBホストコントローラドライバ21に送信する（S36、S37）。USBホストコントローラドライバ21は、Set Power（D0）要求を受信するが、USBハブ2は既に通常稼働状態であるため、何も実行せずにSet Power（D0）要求を完了する（S40、S41）。この段階で、USBハブクラスドライバ22が認識しているUSBハブ2の電力状態が、実際の電力状態と一致する。
【０１４２】
その後、再度USBハブクラスドライバ22がセレクティブサスペンド処理を開始したときは、その時点でUSBハブ制御アプリケーション40からの転送要求が存在しなければ、USBハブフィルタドライバ25は通常通りSet Power（D2）要求をUSBホストコントローラドライバ21に送信するため、USBハブ2は低電力状態に遷移する。
【０１４３】
実施の形態2は、実施の形態1と同様、USBハブ2が通常稼働状態に復帰してから転送要求を発行するため、低電力状態のUSBハブ2に対して転送を開始することにより転送がエラーになるという課題を解決することができる。
【０１４４】
さらに、実施の形態1では、USBハブフィルタドライバ25が直接USBホストコントローラドライバ21に対してSet Power（D0）要求を送ってUSBハブ2を通常稼働状態に復帰させる処理を起動している。それに対して、実施の形態2では、USBハブクラスドライバ21からのWait Wake要求を正常完了させることによって、疑似的にUSBハブ2からリモートウェイクが発生した状態を作り出してUSBハブクラスドライバ22に対して通知している。そのため、USBハブクラスドライバ22がリモートウェイク通知を受けた際の通常の処理を行うことにより、USBハブ2を通常稼働状態に復帰させることができるという特徴がある。すなわち、USBハブクラスドライバ22がWait Wake要求に対して登録した完了ルーチンにより、Set Power（D0）要求を発行してUSBハブ2を通常稼働状態に復帰させることができる。これによれば、既存のUSBハブクラスドライバ22の処理を流用して簡易に低コストでシステム構築をすることができる。
【０１４５】
また、実施の形態1では、USBハブクラスドライバ22からのSet Power（D2）要求をUSBハブフィルタドライバ25の内部に保留するため、USBハブ2への転送に時間がかかる場合は、Set Power（D2）要求の完了にも時間がかかってしまう。一方、実施の形態2では、USBハブクラスドライバ22からのSet Power（D2）要求自体は即座に処理されるため、USBハブクラスドライバ22のセレクティブサスペンド処理に時間がかかるという問題を回避することができるという特徴がある。
【０１４６】
（実施の形態2に係るパーソナルコンピュータの変形例）
ここで、図30を参照して、実施の形態2に係るパーソナルコンピュータの変形例について説明する。図30は、疑似リモートウェイク発生機能2544の処理を変形した場合における処理を示したものである。図30に示す処理は、図28に示す処理に関して変更が加えられたものである。
【０１４７】
この変形例では、USBハブクラスドライバ22からのWait Wake要求のポインタ情報を保存し、そのWait Wake要求を一旦USBホストコントローラドライバ21に転送した後でキャンセルするのではなく、USBハブフィルタドライバ25自身がUSBハブクラスドライバ22からのWait Wake要求を保留する（S11、S1001）。すなわち、USBハブフィルタドライバ25は、USBホストコントローラドライバ21にはWait Wake要求を送信しない。その後、図28と同様にステップS16〜21、S401の処理が実行される。そして、USBハブフィルタドライバ25は、USBハブ制御アプリケーション40から転送要求を受信した時点でUSBハブ2が低電力状態である場合は、保留していたWait Wake要求をUSBハブフィルタドライバ25自身が直接正常完了させる（S1002）。すなわち、図28と同様にステップS35〜S41、S501、S2〜S7の処理が実行される。このようにして、疑似的にUSBホストコントローラドライバ21と連携せずにUSBハブフィルタドライバ25のみで、USBハブ2からリモートウェイクが発生したように見せかけるようにしてもよい。
【０１４８】
＜実施の形態3＞
（実施の形態3の比較例に係るパーソナルコンピュータの問題点）
実施の形態1及び実施の形態2は、USBハブクラスドライバ22がUSBハブ2をセレクティブサスペンドさせる方法として、通常の電力状態変更要求（Set Power）を用いるものであるが、実施の形態3は、別の方法を用いてUSBハブ2が接続されたポートを低電力状態に変更する場合において、同様の課題を解決する方法を示している。
【０１４９】
続いて、図31を参照して、USBハブクラスドライバ22が別の方法でセレクティブサスペンドさせるケースでの問題点について説明する。このUSBハブクラスドライバ22は、USBホストコントローラドライバ21が提供するインタフェース関数群（すなわち、サスペンド関数及びレジューム関数）を直接呼び出すことにより、USBハブ2が接続されたUSBホストコントローラ10のポートのサスペンド及びレジュームを行う。
【０１５０】
USBハブクラスドライバ22は、初期化時にUSBホストコントローラドライバ21に対してインタフェース取得要求（Query Interface）を送信する（S71）。USBホストコントローラドライバ21は、この要求に応じて、自身のインタフェース関数情報（サスペンド関数及びレジューム関数の参照情報）をUSBハブクラスドライバ22に送信する（S72）。より具体的には、このインタフェース関数情報は、USBホストコントローラドライバ21の関数（サスペンド関数及びレジューム関数）のポインタ（アドレス）を示す情報となる。
【０１５１】
その後、USBハブクラスドライバ22は、USBハブ2をセレクティブサスペンドさせる場合、USBホストコントローラドライバ21からのインタフェース関数情報に基づいて、サスペンド関数を呼び出す（S73）。USBホストコントローラドライバ21のサスペンド関数では、サスペンド対象のUSBハブ2が接続されたホストコントローラ10のポートを低電力状態に遷移させる処理（S18）が実行される。これにより、USBハブ2が低電力状態に遷移する。その処理の完了後、サスペンド関数が正常完了し、呼び出し元のUSBハブクラスドライバ22に復帰する（S74）。
【０１５２】
このケースにおいても、USBハブ制御アプリケーション40から低電力状態のUSBハブ2に対する転送要求を受信し、USBハブフィルタドライバ25がUSBハブ2への転送を行おうとすると、その転送がエラーしてしまう（S51〜S53）という問題が発生する。以下、このような問題を解決するための実施の形態について説明していく。
【０１５３】
（実施の形態3に係るパーソナルコンピュータの構成）
続いて、実施の形態3に係るPC1について説明する。なお、これまでに説明した内容と同様の内容については、同一の符号を付し、適宜その説明を省略する。実施の形態1に係るPC1の構成については、実施の形態1に係るPC1の構成と同様であるため、その説明を省略する。
【０１５４】
（実施の形態3に係るUSBハブフィルタドライバの構成）
続いて、図32を参照して、実施の形態3に係るUSBハブフィルタドライバ25の機能ブロック構成について説明する。図32に示すように、実施の形態3に係るUSBハブフィルタドライバ25は、図11を参照して説明した実施の形態1に係るUSBハブフィルタドライバ25と比較して、さらに、サスペンド制御インタフェース中継機能256を有する。
【０１５５】
サスペンド制御インタフェース中継機能256は、USBハブクラスドライバ22からのインタフェース取得要求（Query Interface）および各インタフェース関数(サスペンド関数、レジューム関数)を中継する。サスペンド制御インタフェース中継機能256は、電力状態管理機能254と連携して、USBハブ2の電力状態を管理する。
【０１５６】
続いて、図33を参照して、サスペンド制御インタフェース中継機能256の機能ブロック構成について説明する。図33に示すように、サスペンド制御インタフェース中継機能256は、インタフェース情報取得要求中継機能2561を有する。
【０１５７】
インタフェース情報取得要求中継機能2561は、USBハブクラスドライバ22がUSBホストコントローラドライバ21に対して送信するインタフェース取得要求（Query Interface）を中継する。
【０１５８】
また、サスペンド制御インタフェース中継機能256は、USBハブフィルタドライバ25がUSBハブクラスドライバ22に対して提供するサスペンド関数2562とレジューム関数2563を有する。さらに、サスペンド制御インタフェース中継機能256は、USBホストコントローラドライバ21内のサスペンド関数211とレジューム関数212の参照情報2564を内部に保存する。より具体的には、参照情報2564は、PC1が有する記憶部に格納される。
【０１５９】
インタフェース情報取得要求中継機能2561は、要求受信機能25611と、要求送信機能25612と、結果受信機能25613と、結果通知機能25614と、インタフェース情報保存機能25615と、インタフェース情報変更機能25616とを有する。
【０１６０】
要求受信機能25611は、USBハブクラスドライバ22からのインタフェース取得要求を受信する。要求送信機能25612は、USBホストコントローラドライバ21に対してインタフェース取得要求を送信する。結果受信機能25613は、USBホストコントローラドライバ21からインタフェース取得結果を受信する。結果通知機能25614は、USBハブクラスドライバ22に対してインタフェース取得結果を送信する。インタフェース取得要求及びインタフェース取得結果は、PC1内で送受信可能な形式の情報である。
【０１６１】
インタフェース情報保存機能25615は、結果受信機能25613においてインタフェース取得結果を受信すると、そのインタフェース取得結果としてUSBホストコントローラドライバ21から返されたサスペンド関数211とレジューム関数212の参照情報2564を保存する。すなわち、インタフェース取得結果は、サスペンド関数211とレジューム関数212の参照情報2564を含む。インタフェース情報変更機能25616は、結果通知機能25614を介してインタフェース取得結果をUSBハブクラスドライバ22に送信する前に、そのインタフェース取得結果が示すサスペンド関数211とレジューム関数212の参照情報をUSBハブフィルタドライバ25内のサスペンド関数2562とレジューム関数2563の参照情報に変更する。
【０１６２】
（実施の形態1に係るUSBハブフィルタドライバの処理）
続いて、図34及び図35を参照して、実施の形態3に係るUSBハブフィルタドライバ25の処理について説明する。まず、図34を参照して、USBハブフィルタドライバ25がUSBハブ制御アプリケーション40から転送要求を受信した際の処理について説明する。
【０１６３】
図34に示す処理は、図14を参照して説明した実施の形態1に係る処理と比較して、ステップS106の実行後に、ステップS107に代えて、ステップS121、S122を実行する点が異なる。現在の電力状態2541がSuspendedである場合（S105：Yes）、現在の電力状態2541がResume Pendingに変更された後（S106）、サスペンド制御インタフェース中継機能256は、保存した参照情報2564に基づいて、USBホストコントローラドライバ21のレジューム関数212を呼び出す（S121）。これにより、USBハブ2が通常稼働状態に復帰する。その後、転送状態管理機能255の保留転送実行機能2555は、レジューム完了時の処理（S501、S503〜S505）を実行する（S122）。
【０１６４】
続いて、図35を参照して、USBハブクラスドライバ22からUSBハブフィルタドライバ25のサスペンド関数2562が呼び出された際の処理について説明する。
【０１６５】
図35に示す処理は、図15を参照して説明した実施の形態1に係る処理と比較して、ステップS203に代えてステップS221、S222を実行し、ステップS204に代えてステップS223を実行する点が異なる。転送要求カウンタ2551が0の場合（S201：Yes）、サスペンド制御インタフェース中継機能256は、現在の電力状態2541をSuspend Pendingに変更した後（S202）、USBホストコントローラドライバ21のサスペンド関数211を呼び出す（S221）。これにより、USBハブ2が低電力状態に遷移する。その後、現在の電力状態2541をSuspendedに変更する（S222）。一方、現在の転送要求カウンタ2551の値が0以外の場合（S201：No）、サスペンド関数2562をエラーで返す（S223）。
【０１６６】
（実施の形態3に係るパーソナルコンピュータの処理）
続いて、図36を参照して、USBハブ2がセレクティブサスペンドにより低電力状態になっているときに、USBハブフィルタドライバ25がUSBハブ制御アプリケーション40から転送要求を受信した場合の処理について説明する。
【０１６７】
USBハブフィルタドライバ25は、USBハブクラスドライバ22からのインタフェース取得要求をUSBホストコントローラドライバ21に中継する（S71）。USBハブフィルタドライバ25は、USBホストコントローラドライバ21からインタフェース取得結果を受信した際に（S72）、そのインタフェース取得結果としてUSBホストコントローラドライバ21から返されたインタフェース関数情報（サスペンド関数211とレジューム関数212の参照情報）を保存するとともに、そのインタフェース関数情報をUSBハブフィルタドライバ25内部のインタフェース関数情報（サスペンド関数2562とレジューム関数2563の参照情報）に差し替えてUSBハブクラスドライバ22に送信する（S81）。
【０１６８】
USBハブクラスドライバ22は、USBハブ2をセレクティブサスペンドさせる際に、先のインタフェース取得要求に応じて返されたサスペンド関数（すなわち、USBハブフィルタドライバ25によって提供されるサスペンド関数2562）を呼び出す（S82）。USBハブフィルタドライバ25のサスペンド関数2562が呼び出されると、USBハブフィルタドライバ25は、先に内部に保存していたUSBホストコントローラドライバ21のサスペンド関数211を呼び出す（S73）。これにより、USBハブ2が低電力状態に遷移し（S18、S19）、サスペンド関数211が正常完了する（S74）。その後、USBハブフィルタドライバ25は、USBハブ2の現在の電力状態2541をSuspendedに変更する（S222）。そして、サスペンド関数2562が正常完了する（S83）。
【０１６９】
この状態でUSBハブ制御アプリケーション40から転送要求を受信すると（S1）、USBハブフィルタドライバ25は、USBホストコントローラドライバ21のレジューム関数212を呼び出す（S84）。これにより、USBハブ2が通常稼働状態に復帰する（S38、S39）。USBハブフィルタドライバ25は、現在の電力状態2541をWorkingに変更した後（S501）、USBハブ2への転送を開始する（S2〜S4）。USBハブ2は通常稼働状態に復帰しているため、USBハブ2への転送は正常に処理されて完了する（S5〜S7）。
【０１７０】
続いて、図37を参照して、USBハブ2への転送を実行中に、USBハブクラスドライバ22からサスペンド関数2562が呼び出された場合の処理について説明する。
【０１７１】
USBハブフィルタドライバ25は、転送要求に応じたUSBハブ2への転送中に（S1〜S4）、USBハブフィルタドライバ25のサスペンド関数2562が呼び出されると（S82）、USBハブフィルタドライバ25は、現在の転送要求カウンタ2551が0以外であるため、そのサスペンド関数2562をエラーで返して、サスペンド要求を拒否する（S223）。これにより、転送実行中にUSBハブ2のサスペンド処理が行われることはなく、USBハブ2に対する転送は正常に完了する（S5〜S7）。
【０１７２】
その後、USBハブフィルタドライバ25が転送を要求していない状態でUSBハブクラスドライバ22が再度サスペンド関数2562を呼び出してきた場合は、USBハブフィルタドライバ25は、USBホストコントローラドライバ21のサスペンド関数211を呼び出してUSBハブ2のサスペンド処理を行う。
【０１７３】
このように、USBハブクラスドライバ22が、インタフェース関数（サスペンド関数とレジューム関数）を呼び出してUSBハブ2のセレクティブサスペンドを制御するケースにおいても、低電力状態のUSBハブ2に対して転送を実行することで転送がエラーになるという問題を解決することができる。
【０１７４】
＜実施の形態4＞
続いて、実施の形態4に係るPC1について説明する。実施の形態4は、上述したUSBハブ制御アプリケーションプログラム40の第1の具体例を示すものである。
【０１７５】
図38を参照して、実施の形態4に係るPC1の構成について説明する。図38に示すように、PC1は、USBハブ制御アプリケーションプログラム40として、USB Power Deliveryシステムポリシー管理アプリケーションプログラム60を有する。以下、「システムポリシー管理アプリケーション60」とも呼ぶ。また、PC1には、USBハブ2に代えて、USB Power Delivery規格に対応したUSBハブ4が接続されている。
【０１７６】
また、PC1は、USBハブ汎用制御ライブラリ50を有する。USBハブ汎用制御ライブラリ50は、USBハブフィルタドライバ25を通してUSBハブ4への転送を行うための汎用アプリケーションプログラミングインタフェース（API）501をシステムポリシー管理アプリケーション60に対して提供するものである。これによれば、システムポリシー管理アプリケーション60が直接OS20のシステムコール関数を呼び出してUSBハブフィルタドライバ25に転送要求を送信するのではなく、システムポリシー管理アプリケーション60が転送要求の内容を指定してUSBハブ汎用制御ライブラリ50を呼び出すことで、USBハブフィルタドライバ25に転送要求が送信される。このUSBハブ汎用制御ライブラリ50を用いることで、他のアプリケーションにおいても、USBハブフィルタドライバ25を直接制御する、又は、専用のフィルタドライバを別途用意することなく、容易に付加的な機能についてUSBハブ4を制御することができる。
【０１７７】
システムポリシー管理アプリケーション60は、付加的な機能として、USB Power Delivery規格における機能に関して、USBハブ4を制御する。USB Power Deliveryは、USBケーブルを通したUSB機器3、4間の電力供給（給電）に関するUSBの新しい規格である。USB Power Deliveryに対応したUSBハブ4は、下流ポートに接続されたデバイスからの要求に従って、ポートから供給する電力を調整する機能を有する。USB Power Deliveryでは、電力供給可否の判断をUSBハブ4が単独で行うだけでなく、PC1上のシステムポリシー管理アプリケーション60及びユーザが介在してシステムレベルの電力供給状態を制御することもできるように、システムポリシー管理アプリケーション60とUSBハブ4との間で、電力供給状態に関する情報取得、及び、電力供給状態の制御を行うための転送要求の内容が追加定義されている。
【０１７８】
上述したように、USBハブ4に転送されるデータには、所望の動作を要求する情報を含めることができるが、本実施の形態4では、この情報として以下の情報を含めることができる。
(1)  USBハブ4の各ポートの給電能力、すなわち各ポートから供給可能な電力の情報をを取得し、システムポリシー管理アプリケーション60に対して通知する要求
(2)  USBハブ4の各ポートに接続されたUSBデバイス3から受信した給電要求をシステムポリシー管理アプリケーション60に対して通知する要求
(3)  USBハブ4の各ポートに接続されたUSBデバイス3から受信した給電要求を受け付けるか拒否するかをUSBハブ4に対して指示する要求
【０１７９】
これによれば、システムポリシー管理アプリケーション60は、USBハブ4からUSBデバイス3に供給する電力を変更する、又は、USBハブ4から通知されたUSBデバイス3へ供給している電力をPC1に接続された表示装置（例えば液晶ディスプレイなど）に表示してユーザに提示する等をすることができる。
【０１８０】
＜実施の形態5＞
続いて、実施の形態5に係るPC1について説明する。実施の形態5は、上述したUSBハブ制御アプリケーションプログラム40の第2の具体例を示すものである。
【０１８１】
図39を参照して、実施の形態5に係るPC1の構成について説明する。図39に示すPC1は、PC1は、USBハブ制御アプリケーションプログラム40として、USBハブROM書き込みアプリケーションプログラム70を有する。
【０１８２】
USBハブROM書き込みアプリケーション70は、付加的な機能として、USBハブ2が有するROM（例えばフラッシュROM）に格納されたデータを書き換えるようにUSBハブ2を制御する。このROMに格納されるデータは、典型的には、USBハブ2が有するCPUが実行するファームウェアである。上述したように、USBハブ2に転送されるデータには、所望の動作を要求する情報を含めることができるが、本実施の形態2では、この情報として、データの書き換えの要求と、書き換えるデータとが含まれる。
【０１８３】
これによれば、USBハブROM書き込みアプリケーション70は、USBハブ2におけるファームウェアをアップデートすることができる。
【０１８４】
＜実施の形態6＞
続いて、実施の形態6について説明する。PC1は、実施の形態2と実施の形態3を組み合わせて、次に説明するような処理とすることもできる。図40を参照して、実施の形態2と実施の形態3を組み合わせた場合において、USBハブフィルタドライバ25がUSBハブ制御アプリケーション40から転送要求を受信した際の処理について説明する。
【０１８５】
図40に示す処理は、図23を参照して説明した実施の形態2に係る処理、及び、図34を参照して説明した実施の形態3に係る処理と比較して、さらに、ステップS131を有し、ステップS131でNoの場合にステップS111が実行され、ステップS131でYesの場合にステップS106、S121、S122が実行される点が異なる。
【０１８６】
すなわち、現在の電力状態2541がSuspendedの場合（S105）に、事前にUSBハブクラスドライバ22からのインタフェース取得要求によって、USBハブフィルタドライバ25が、USBホストコントローラドライバ21のレジューム関数212の参照情報2564を取得しているか否かによってその動作が異なる。
【０１８７】
USBホストコントローラドライバ21のレジューム関数212の参照情報2564を取得している場合、USBハブフィルタドライバ25は、実施の形態3の処理に従って、ステップS106で電力状態2541をResume Pendingに変更した後（S106）、USBホストコントローラドライバ21のレジューム関数212を呼び出して、USBハブ2をレジュームさせる（S121）。その後、USBハブフィルタドライバ25は、電力状態2541をWorkingに変更してから、保留されている全ての転送要求をUSBホストコントローラドライバ21に送信する（S501、S502〜S505）。
【０１８８】
USBホストコントローラドライバ21のレジューム関数212の参照情報2564を取得していない場合は、USBハブフィルタドライバ25は、実施の形態2の処理に従って、疑似リモートウェイク発生機能2544を用いて、Wait Wake要求をキャンセルすることにより（S111）、USBハブ2をレジュームさせる。
【０１８９】
以上に説明したUSBハブフィルタドライバ25を用いることにより、一つのUSBハブフィルタドライバ25で、実施の形態2のように関数呼び出しによりUSBハブ2の電力状態を制御しないUSBハブクラスドライバ22にも、実施の形態3のように関数呼び出しによりUSBハブ2の電力状態を制御するUSBハブクラスドライバ22にも対応することができる。よって、上述したUSBハブフィルタドライバ25は、いずれのUSBハブクラスドライバ22においても、転送要求がエラーしてしまうという問題を解決することができる。
【０１９０】
＜実施の形態の概要＞
ここで、図41を参照して、上述の実施の形態1乃至6から抽出される一実施の形態に係る情報処理装置について説明する。図41に示すように、情報処理装置91は、第１のアプリケーションプログラム911と、第２のアプリケーションプログラム912と、クラスドライバ913と、フィルタドライバ914とを有する。
【０１９１】
第１のアプリケーションプログラム911は、周辺機器92の制御要求を送信する。第１のアプリケーションプログラム911は、アプリケーションプログラム30に対応する。第２のアプリケーションプログラム912は、第１のアプリケーションプログラム911が動作するオペレーションシステム上で動作して、周辺機器92の制御要求を送信する。第２のアプリケーションプログラム912は、USBハブ制御アプリケーションプログラム40、USB Power Deliveryシステムポリシー管理アプリケーションプログラム60、及びUSBハブROM書き込みアプリケーションプログラム70に対応する。
【０１９２】
クラスドライバ913は、第１のアプリケーションプログラム911からの制御要求を中継する。クラスドライバ913は、USBハブクラスドライバに対応する。
【０１９３】
フィルタドライバ914は、クラスドライバ913の下位において、第１のアプリケーションプログラム911からのクラスドライバ913を介した制御要求に応じて周辺機器92を制御するとともに、第２のアプリケーションプログラム912からのクラスドライバ913を介さない制御要求に応じて周辺機器92を制御する。フィルタドライバ914は、USBハブフィルタドライバ25に対応する。
【０１９４】
フィルタドライバ914は、電力状態管理部9141と、制御部9142とを有する。電力状態管理部9141は、クラスドライバ913からの周辺機器92の電力状態の変更要求に応じて、周辺機器92の電力状態を変更するとともに、変更後の周辺機器92の電力状態を認識する。電力状態管理部9141は、電力状態管理機能254に対応する。制御部9142は、第１のアプリケーションプログラム911及び第２のアプリケーションプログラム912からの制御要求に応じて、周辺機器92の制御を実行する。制御部9142は、転送状態管理機能255に対応する。
【０１９５】
ここで、制御部9142は、電力状態管理部9141によって認識される周辺機器92の電力状態が、低電力状態である場合、第２のアプリケーションプログラム912からの制御要求に応じた周辺機器92の制御を、周辺機器92の電力状態が通常状態に戻るまで保留する。
【０１９６】
以上に説明した構成では、フィルタドライバ914が周辺機器92の電力状態を認識するようにしている。そして、フィルタドライバ914は、認識した電力状態が低電力状態である場合、第２のアプリケーションプログラム912からの転送要求を保留するようにしている。これによれば、第２のアプリケーションプログラム912から、周辺機器92の電力状態を制御するクラスドライバ913を介さずにフィルタドライバ914に対して直接周辺機器92の制御要求が行われる場合であっても、低電力状態の周辺機器92にアクセスしてエラーが発生することを防止することができる。
【０１９７】
ここで、上述したプログラム21〜25、30、40、50、60、70は、様々なタイプの非一時的なコンピュータ可読媒体（ｎｏｎ−ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）を用いて格納され、コンピュータ（PC1）に供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（ｔａｎｇｉｂｌｅ  ｓｔｏｒａｇｅ  ｍｅｄｉｕｍ）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Ｐｒｏｇｒａｍｍａｂｌｅ  ＲＯＭ）、ＥＰＲＯＭ（Ｅｒａｓａｂｌｅ  ＰＲＯＭ）、フラッシュＲＯＭ、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（ｔｒａｎｓｉｔｏｒｙ  ｃｏｍｐｕｔｅｒ  ｒｅａｄａｂｌｅ  ｍｅｄｉｕｍ）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【０１９８】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は既に述べた実施の形態に限定されるものではなく、その要旨を逸脱しない範囲において種々の変更が可能であることはいうまでもない。
【０１９９】
なお、上述の実施の形態では、パーソナルコンピュータにおいて上述の内容を実施する場合について説明したが、これに限られない。上述の内容は、パーソナルコンピュータ、サーバ、テレビジョン、及びゲーム機などのUSB機器が接続される各種情報処理装置において実施することが可能である。
【０２００】
また、上述の実施の形態では、情報処理装置からの制御対象となる周辺機器が、USB機器である場合について説明したが、USB以外の他の規格における周辺機器を対象としてもよい。
【０２０１】
また、上述の実施の形態では、USBハブ2に対して制御する場合について説明したが、PC1にUSBハブ2を介さずにUSBデバイス3が接続された場合にUSBデバイス3に対しても同様の制御を行うようにしてもよい。
【符号の説明】
【０２０２】
1  PC
2、4  USBハブ
3  USBデバイス
10  USBホストコントローラ
20  オペレーティングシステム
21  USBホストコントローラドライバ
22  USBハブクラスドライバ
23  USBデバイスクラスドライバ
24  独自USBハブドライバ
25  USBハブフィルタドライバ
30  アプリケーションプログラム
40  USBハブ制御アプリケーションプログラム
50  USBハブ汎用制御ライブラリ
60  USB Power Deliveryシステムポリシー管理アプリケーションプログラム
70  USBハブROM書き込みアプリケーションプログラム
211、2562  サスペンド関数
212、2563  レジューム関数
251  ハブクラス転送要求中継機能
252  電力管理要求中継機能
253  アプリケーション転送要求中継機能
254  電力状態管理機能
255  転送状態管理機能
256  サスペンド制御インタフェース中継機能
501  汎用アプリケーションプログラミングインタフェース
2001、2002、2003、2004  ポート
2511、2521、2531、25611  要求受信機能
2512、2522、2532、25612  要求送信機能
2513、2523、2533、25613  結果受信機能
2514、2524、2534、25614  結果通知機能
2541  電力状態
2542  レジューム要求発行機能
2543  サスペンド要求保留機能
2544  疑似リモートウェイク発生機能
2545  サスペンド要求変更機能
2551  転送要求カウンタ
2552  転送要求カウンタ更新機能
2553  転送要求キュー
2554  転送要求保留機能
2555  保留転送実行機能
2561  インタフェース情報取得要求中継機能
2564  インタフェース関数参照情報
25615  インタフェース情報保存機能
25616  インタフェース情報変更機能
【図１】
2016045706.tif 000003
【図２】
2016045706.tif 000004
【図３】
2016045706.tif 000005
【図４】
2016045706.tif 000006
【図５】
2016045706.tif 000007
【図６】
2016045706.tif 000008
【図７】
2016045706.tif 000009
【図８】
2016045706.tif 000010
【図９】
2016045706.tif 000011
【図１０】
2016045706.tif 000012
【図１１】
2016045706.tif 000013
【図１２】
2016045706.tif 000014
【図１３】
2016045706.tif 000015
【図１４】
2016045706.tif 000016
【図１５】
2016045706.tif 000017
【図１６】
2016045706.tif 000018
【図１７】
2016045706.tif 000019
【図１８】
2016045706.tif 000020
【図１９】
2016045706.tif 000021
【図２０】
2016045706.tif 000022
【図２１】
2016045706.tif 000023
【図２２】
2016045706.tif 000024
【図２３】
2016045706.tif 000025
【図２４】
2016045706.tif 000026
【図２５】
2016045706.tif 000027
【図２６】
2016045706.tif 000028
【図２７】
2016045706.tif 000029
【図２８】
2016045706.tif 000030
【図２９】
2016045706.tif 000031
【図３０】
2016045706.tif 000032
【図３１】
2016045706.tif 000033
【図３２】
2016045706.tif 000034
【図３３】
2016045706.tif 000035
【図３４】
2016045706.tif 000036
【図３５】
2016045706.tif 000037
【図３６】
2016045706.tif 000038
【図３７】
2016045706.tif 000039
【図３８】
2016045706.tif 000040
【図３９】
2016045706.tif 000041
【図４０】
2016045706.tif 000042
【図４１】
2016045706.tif 000043