Windows 8 以降では、電源管理フレームワーク (PoFx) を使用すると、ドライバーはデバイス内の個々のコンポーネントの電源状態を管理できます。 コンポーネント レベルの電源管理は、デバイス レベルの電源管理と並行して存在します。 概要については、「 Power Management Framework の概要」を参照してください。
このページでは、Component-Level Power Management 用の PoFx API について説明します。
PoFx によって管理されるデバイスを登録するために、ドライバーは PoFxRegisterDevice ルーチンを呼び出します。 ドライバーは、このルーチンに、他のデータとともに PO_FX_COMPONENT 構造体の配列を含む PO_FX_DEVICE 構造体を渡します。 この配列内の各要素は、デバイス内のコンポーネントの Fx 電源状態と各 Fx 状態の属性を記述します。 (少なくとも、コンポーネント レベルの電源管理をサポートしていないコンポーネントでは、F0 状態のみが実装されます)。特定のコンポーネントの特定の Fx 電源状態の属性は、次の値を含む PO_FX_COMPONENT_IDLE_STATE 構造体によって記述されます。
- 遷移の待機時間。この Fx 状態から F0 (完全にオン) 状態に移行するために必要な時間です。
- 常駐要件とは、コンポーネントがこの Fx 状態に滞留することが価値ある状態遷移をするために必要な時間のことです。
- この Fx 状態においてコンポーネントが消費する力率定格の電力。
PoFx では、この情報 (他のシステム全体の入力と依存関係に加えて) を使用して、どの Fx 電源状態を特定の時点でコンポーネントにする必要があるかについてインテリジェントな決定を行います。 PoFx は、2 つの競合する目標のバランスを取る必要があります。 まず、アイドル状態のコンポーネントは、できるだけ電力を消費するように構成する必要があります。 次に、常にオンで常に接続されているデバイスの外観を維持するのに十分な速さで、低電力 Fx 状態から F0 に切り替えるコンポーネントを準備する必要があります。
コンポーネント レベルの電源管理は、デバイスが D0 (完全にオン) の電源状態にある場合にのみ実行できます。 デバイスが D1 (ほぼオン)、D2 (ほぼオフ)、または D3 電源状態の場合、デバイスにアクセスできません。 デバイスが D0 状態の場合、ドライバーがアクティブに使用しているコンポーネントのみが F0 状態のままである必要があります。 アイドル状態のコンポーネントは、低電力 Fx 状態に切り替えて、電力消費量を削減できる可能性があります。
デバイスが D0 電源状態にある間、ドライバーは単純なプロトコルに従ってコンポーネント レベルの電源管理を有効にします。 ドライバーがコンポーネントにアクセスする必要がある場合、ドライバーは PoFxActivateComponent ルーチンを呼び出して、コンポーネントへのアクセスを要求します。 この呼び出しが発生したときにコンポーネントが低電力 Fx 状態の場合、PoFx は F0 状態への遷移を開始し、この遷移が完了したときにドライバーに通知します。 その後、ドライバーはコンポーネントにアクセスできます。 ドライバーがコンポーネントにアクセスする必要がなくなった場合、ドライバーは PoFx に通知する PoFxIdleComponent ルーチンを呼び出します。 この呼び出しに応じて、PoFx はコンポーネントを低電力 Fx 状態に切り替えることができます。
アクセス可能なコンポーネントは、 アクティブな状態にあります。 アクセスできないコンポーネントが アイドル状態にあります。 デバイス内のコンポーネントのアクセシビリティを追跡するために、PoFx は各コンポーネントのアクティブ化参照カウントを維持します。 PoFxActivateComponent 呼び出しでは、指定したコンポーネントのカウントが 1 ずつインクリメントされ、PoFxIdleComponent 呼び出しによってカウントが 1 ずつデクリメントされます。
PoFxActivateComponent 呼び出しがカウントを 0 から 1 にインクリメントする場合、PoFx はアイドル状態からアクティブな条件への移行を開始し、この遷移が完了したときにドライバーに通知します。 コンポーネントが既にアクティブな状態にあるときに PoFxActivateComponent が発生した場合、コンポーネントはアクティブな状態のままになり、ドライバーは通知を受け取らなくなります。
PoFxIdleComponent 呼び出しがカウントを 1 から 0 に減らした場合、PoFx はアクティブな状態からアイドル状態への移行を開始し、この遷移が完了したときにドライバーに通知します。 PoFxIdleComponent 呼び出しでカウントがデクリメントされるが、カウントが 0 以外のままである場合、コンポーネントはアクティブな状態のままであり、ドライバーは通知を受け取らなくなります。
アクティブ化参照カウントは、同じドライバー内の 2 つ以上のコード パスがデバイス内の同じコンポーネントに同時にアクセスする必要がある場合に便利に処理します。 この数を維持することで、PoFx を使用すると、ドライバーのさまざまな部分が、コンポーネントへのアクセスを一元的に管理する必要なく、コンポーネントへのアクセスを個別に維持できます。
コンポーネントのアクティブ/アイドル状態は、ドライバーがコンポーネントにアクセスできるかどうかを判断するための唯一の信頼できる手段です。 F0 電源状態にあるがアイドル状態のコンポーネントは、低電力 Fx 状態に切り替えようとしている可能性があります。
アクティブな状態にあるコンポーネントは、常に F0 状態です。 コンポーネントは、アイドル状態になるまで F0 を残すことはできません。 アイドル状態のコンポーネントは、F0 または低電力 Fx 状態である可能性があります。 PoFxActivateComponent 呼び出しがアイドル状態からアクティブ状態への遷移を開始するときに、コンポーネントが低電力 Fx 状態の場合、コンポーネントがアクティブな条件に入る前に、まずコンポーネントを F0 に切り替える必要があります。