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

USB 関数ドライバーでは、USB 選択的サスペンドを実装することで、ランタイム アイドル検出がサポートされます。 Windows® Driver Foundation (WDF) に基づく USB ドライバーで選択的サスペンドを実装する方法に関するドライバー開発者向けのコンテンツを次に示します。

選択的中断について

選択的な中断は、電源を切り、接続されているコンピューターが動作状態 (S0) のまま、アイドル状態の 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 バスがアイドル状態の場合、デバイスの電源を切ることができる必要があります。 Microsoft 提供の USB ハブ ドライバーは、ハードウェア レベルで選択的な中断を実装します。

USB 関数ドライバーは、バス ドライバーと通信し、デバイス機能を中断および再開するデバイス I/O 制御要求を管理する WDF を介して、個々のデバイス機能の選択的な中断を実装する必要があります。 WDF を使用すると、カーネル モード ドライバーとユーザー モード ドライバーの両方で選択的な中断をサポートできます。

ファンクション ドライバーの USB 選択的中断コードの詳細は、ドライバーがユーザー モードで実行されるかカーネル モードで実行されるかによって異なります。 次のガイドラインを考慮してください。

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

電源ポリシーの所有権、I/O キュー、選択的中断

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

USB ドライバーが選択的サスペンドをサポートし、デバイス スタック内の PPO の上に階層化されている場合、ドライバーは電源管理キューを使用しないでください。 これは、UMDF ドライバーと KMDF ドライバーの両方に当てはまります。 デバイスが中断されている間に電源管理キューの要求が到着すると、デバイス スタック全体が停止する可能性があります。

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

WDF USB ドライバーへの要求のフローチャート。

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

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

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

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

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

このセクションの内容

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