USB ドライバーにおけるセレクティブ サスペンド (WDF)

USB ファンクション ドライバーは、USB セレクティブ サスペンドを実装することで、ランタイム アイドル検出をサポートしています。 ここでは、ドライバー開発者向けに、Windows® Driver Foundation (WDF) に基づく USB ドライバーでセレクティブ サスペンドを実装する方法について説明します。

セレクティブ サスペンドについて

セレクティブ サスペンドは、接続先のコンピューターが動作状態 (S0) を維持している間に、USB デバイスの電源をオフにし、後でアイドル状態の USB デバイスを再開する機能です。 特にモバイル PC でエネルギー効率を高めるには、すべての USB デバイスとドライバーがセレクティブ サスペンドをサポートする必要があります。 デバイスがアイドル状態のときに電源をオフにしたが、システムが S0 状態のままの場合、次のように大きなメリットがあります。

  • セレクティブ サスペンドにより、電力が節約されます。
  • セレクティブ サスペンドは、熱負荷やノイズなどの環境要因を軽減するのに役立ちます。

デバイスのハードウェアがアイドル状態の間に電源をオフにできる場合、ドライバーはこの機能をサポートする必要があります。 Windows® Driver Foundation (WDF) に基づく USB ドライバーでのセレクティブ サスペンドのサポートには、基本的なプラグ アンド プレイ サポートに必要なコールバック以外にも、追加のコールバックがいくつか必要です。

USB デバイスのすべてのファンクション ドライバーは、システムの実行中にアイドル状態のデバイスを一時停止する積極的な電源管理を実装する必要があります。 このトピックでは、WDF ベースのドライバーでセレクティブ サスペンドを実装する方法について説明します。 WDF にまだ精通していない場合は、Windows Driver Kit (WDK) と「Windows Driver Foundation を使用したドライバーの開発」をご覧ください。

USB デバイスは、USB セレクティブ サスペンドを通じたランタイム アイドル検出をサポートします。 セレクティブ サスペンドを使用すると、同じハブに接続されている他のデバイスに影響を与えることなく (または多機能デバイスの場合は、デバイス内の他の機能に影響を与えることなく)、アイドル状態のデバイスを一時停止状態にすることができます。 すべてのデバイスまたは機能が一時停止されると、ハブ全体または多機能デバイスの電源をオフにすることができます。

ハードウェアの観点から見ると、セレクティブ サスペンドは USB ポートの物理的な状態です。 ポートに接続されているすべての機能がアイドル状態の場合、ポートはセレクティブ サスペンドに入ることができます。

USB 仕様に準拠するには、すべての USB デバイスがセレクティブ サスペンドをサポートする必要があります。 USB バスがアイドル状態の場合、デバイスの電源をオフにできる必要があります。 マイクロソフトによって提供される USB ハブ ドライバーは、ハードウェア レベルでセレクティブ サスペンドを実装します。

USB ファンクション ドライバーは、バス ドライバーと通信し、デバイスの機能を一時停止および再開するデバイス I/O 制御要求を管理する WDF を通じて個々のデバイス機能のセレクティブ サスペンドを実装する必要があります。 WDF を使用すると、カーネル モード ドライバーとユーザー モード ドライバーの両方でセレクティブ サスペンドをサポートできます。

ファンクション ドライバーの USB セレクティブ サスペンド コードの詳細は、ドライバーがユーザー モードで実行されるかカーネル モードで実行されるかによって異なります。 以下のガイドラインを考慮してください。

  • 可能な限り、ユーザー モード ドライバー フレームワーク (UMDF) を使用して USB ドライバーを実装します。 ユーザー モード ドライバーは、システム データが破損する可能性が低く、カーネル モード ドライバーよりもデバッグが簡単です。
  • ドライバーが等時性エンドポイントを通じてデータをストリーミングする場合、またはカーネル モードでのみ使用できる他の機能やリソースが必要な場合のみ、カーネル モード ドライバー フレームワーク (KMDF) を使用します。

電源ポリシーの所有権、I/O キュー、セレクティブ サスペンド

デバイス スタックの電源ポリシー所有者 (PPO) は、デバイスが任意の時点でどの電源状態にあるかを決定するドライバーです。 各デバイス スタック内の 1 つのドライバーのみ PPO にすることができます。 通常、ファンクション ドライバーはデバイスの PPO です。

USB ドライバーがセレクティブ サスペンドをサポートし、デバイス スタックの PPO の上に階層化されている場合、ドライバーは電源管理キューを使用してはなりません。 これは、UMDF ドライバーと KMDF ドライバーの両方に当てはまります。 デバイスが一時停止されているときに電源管理キューの要求が到着した場合、デバイス スタック全体がストールする可能性があります。

図 1 は、その I/O キューを通じた USB ドライバーへの I/O 要求のフローを示しています。

Flowchart of requests to a WDF USB driver.

図では、USB ドライバーの要求が到着しています。 フレームワークが要求を適切なキューに追加します。

キューが電源管理されていない場合、フレームワークは、ドライバーがキュー用に構成したディスパッチの種類 (シーケンシャル、並列、または手動) に従ってドライバーに要求を提示します。 その後、ドライバーが要求を処理します。

キューが電源管理されていて、デバイスが一時停止されていない場合、フレームワークは、構成されたディスパッチの種類に従ってドライバーに要求を提示します。

ただし、デバイスが一時停止されている場合、フレームワークのアクションは、ドライバーがデバイス スタックの PPO であるかどうかによって異なります。 ドライバーが PPO の場合、フレームワークは USB 親ドライバーと通信してデバイスの電源をオンにします。 デバイスが再開されると、フレームワークはドライバーに要求を提示します。

ドライバーが PPO でない場合、デバイスを再開できるのは PPO のみであるため、フレームワークはそれ以上のアクションを実行しません。 要求はキューに残ります。 デバイスを再開する原因となる要求を PPO が受け取らない場合、デバイス スタックはストールします。

このセクションの内容

トピック 説明
UMDF ドライバーにおけるセレクティブ サスペンド このトピックでは、KMDF ファンクション ドライバーが USB セレクティブ サスペンドをサポートする方法について説明します。
USB KMDF 機能ドライバーにおけるセレクティブ サスペンド このトピックでは、KMDF ファンクション ドライバーが USB セレクティブ サスペンドをサポートする方法について説明します。