モダン スタンバイ プラットフォームの近距離近接通信 (NFP) 電源管理
近距離近接通信 (NFP) デバイスは、Windows PC が他の NFP 搭載コンピューターと関連付け、ペアリングできる近距離無線送信および受信デバイスです。
NFP デバイスは、GUID_DEVINTERFACE_NFP プラグ アンド プレイ (PnP) インターフェイスを介して Windows オペレーティング システムに公開されます。 NFP デバイス ベンダーによって提供されるサードパーティのドライバーは、GUI_DEVINTERFACE_NFP インターフェイスの実装と物理 NFP デバイスの電源管理を担当します。 NFP デバイスは、通常、System on a Chip (SoC) またはコア シリコン上のシステムの I2C インターフェイス ピンに接続されます。
一般に、近接パブリケーションまたはサブスクリプションを持つソフトウェア クライアントがない場合、またはすべてのパブリケーションとサブスクリプションが無効になっている場合、NFP デバイスは低電力モード (スタンバイ モードまたは電源切断モード) に入ります。 ドライバー開発の観点から見て、この状態は、デバイスで未処理のハンドルがない場合に発生します。 開いて有効になっているデバイスへのハンドルがない場合は、NFP デバイスをスタンバイ モードまたは電源切断モードにする必要があります。
プラットフォームがモダン スタンバイに入り、ディスプレイがオフになっている場合、NFP デバイスはスタンバイ モードまたは電源切断電源モードに入る必要があります。 スタンバイ モードでの NFP デバイスの電力消費量が平均で 1 ミリワットを超える場合、デバイスは 0 ワット の電力切断モードに入る必要があります。
プラットフォームがモダン スタンバイに入って終了すると、NFP デバイス ドライバーに直接通知されません。 代わりに、モダン スタンバイに入るときにドライバーへのハンドルを無効にし、モダン スタンバイからの終了時にこれらの同じハンドルを有効にすることで、Windows からドライバーに間接的に通知します。 プラットフォームがモダン スタンバイに移行すると、Windows から開いている各ハンドルに無効通知が送信されます。 プラットフォームがモダン スタンバイを終了すると、Windows から過去に無効にした各ハンドルに有効にする通知が送信されます。 モダン スタンバイに入る前に既に無効だった開いているハンドルは、モダン スタンバイからの終了後も無効のままです。
デバイスの電源管理モード
Windows 8 より、モダン スタンバイ プラットフォーム用の NFP デバイスには、電源切断モード (このモードでは、NFP デバイスへのすべての電源入力が、デバイスの外部のハードウェア メカニズムによってオフにされています) に加えて、"アクティブ"、"アイドル"、"スタンバイ" の 3 つの電源モードが必要です。 デバイスでサポートされている電源管理モードの詳細については、NFP デバイスのハードウェア ベンダーにお問い合わせください。
次の表では、NFP デバイスのデバイス電源モードについて説明します。
デバイスの電源モード | 説明 | 平均電力消費量 | アクティブまでの終了待機時間 | 切り替えメカニズム |
---|---|---|---|---|
アクティブ |
NFP デバイスは、近くのコンピューターの別の NFP デバイスとアクティブに通信しています。 |
< 50 ミリワット |
該当なし |
該当なし |
アイドル |
NFP デバイスは、NFP を備えた別のコンピューターが近接するのを待機中です。 NFP デバイスのドライバーには、開かれたパブリケーションとサブスクリプションがあります。 |
< 5 ミリワット |
< 10 ミリ秒 (標準) |
ハードウェア自律 |
Standby |
NFP デバイスに電力が適用されていますが、未処理のパブリケーションまたはサブスクリプションがありません (開いているハンドルはありません)。 |
< 1 ミリワット (デバイスに依存) |
< 50 ミリ秒 (標準) |
SoC またはコア シリコンからのドライバー コマンドまたは GPIO ピン。 |
電源切断 |
プラットフォームの電源が入っていないか、外部エンティティが電源オフになっているため、NFP デバイスに電力が適用されていません。 |
0 ワット |
< 100 ミリ秒 |
外部エンティティでは、D3 IRP に応答して、ACPI ファームウェア経由で電源が削除されるか、電源が適用されます。 |
Note
- 上記の表では、standby という用語は、モダン スタンバイ (プラットフォーム全体の電源状態) とは異なるデバイス電源モードを表しています。
- 上の表では、D3 IRP という用語は、DevicePowerState 型の IRP_MN_SET_POWER 要求を指しています。
スタンバイ モードでの NFP デバイスの指定電力消費量は、部品番号と製造元によって異なります。 システム設計者は、デバイス固有のスタンバイ電力の消費量を把握するために、デバイス ベンダーと協力する必要があります。 スタンバイ モードでの電力消費が 1 ミリワットを超える場合は、デバイスがモダン スタンバイ中に電源切断モードになるように、NFP デバイスを切り替え可能な電源レールに接続する必要があります。
ソフトウェア電源管理のメカニズム
Windows は、NFP デバイスを電源管理するサードパーティ製のドライバーの提供について、NFP デバイスのベンダに依存しています。 Windows では、このドライバーが、NFP デバイス ドライバーに対する現在の開いているハンドルの数と、これらのハンドルの状態を監視して、NFP デバイスを低電力モードにするタイミングを決定します。
NFP ドライバー開発者は、ユーザーモード ドライバー フレームワーク (UMDF) を使用してドライバーを開発することをお勧めします。 UMDF には、デバイスのランタイム電源管理の開発を容易にするさまざまな機能が含まれています。
D3 のサポート
NFP ドライバーの開発者は、デバイスへのすべてのハンドルが閉じられたとき、またはデバイスに対して開いているハンドルがすべて IOCTL_NFP_DISABLE 通知を受信したときに、NFP デバイスを D3 状態にすることをお勧めします。 プラットフォームがモダン スタンバイ状態になり、ユーザーのデスクトップがロックされた後、すべての開いているハンドルが IOCTL_NFP_DISABLE 通知を受け取ります。
NFP デバイスがアイドル電源モードで 1 ミリワット未満の電力消費を達成できる場合でも、すべてのハンドルが閉じられているか、IOCTL_NFP_DISABLE 通知を受信している場合は、D3 への切り替えをお勧めします。 D3 への切り替えを実行すると、NFP デバイスのドライバー スタック内のすべてのドライバーで、ハードウェアが低電力モードに入っていることが通知されます。 さらに、D3 への切り替えは、Windows に組み込まれているインストルメンテーションによって検出できます。 Windows Performance Toolkit とその他のパフォーマンス診断ツールを使用して、この切り替えを観察できます。 この組み込みの診断サポートによって、NFP デバイスが IOCTL_NFP_DISABLE 電源管理を正しく実行していることを確認するシステムインテグレーターのコストが削減されます。
一部のバスでは、バス コントローラーが低電力状態になる前に、バス上のデバイスを D3 に切り替える必要があります。 I2C 接続された NFP デバイスの場合、I2C バス コントローラーの電源を切るために D3 に入るエンドポイント NFP デバイスにはこのような依存関係はありません。
ただし、将来のモダン スタンバイ プラットフォームで、NFP デバイスに接続するためにユニバーサル シリアル バス (USB) を使用する場合、USB ホスト コントローラーの電源を切り、モダン スタンバイ中に SoC またはコアシリコンを低電力アイドル状態にできるように、NFP デバイスが D3 に入ることができる必要があります。 NFP デバイス ドライバーの開発者は、基になるバスに関係なく低電力モードにする準備ができたら、デバイスを D3 に切り替えて、将来のドライバーの再利用と簡単な電源管理診断を可能にすることをお勧めします。
スタンバイ電源モードに移行する場合、NFP デバイスでは、NFP デバイス ドライバーから通信バス経由でコマンドを送信する必要があります。このコマンドは、ドライバーの D3 への切り替えの一部として送信する必要があります。
NFP デバイスで SoC の GPIO ピンをスタンバイ電源モードに切り替える必要がある場合は、D3 への切り替えが必要です。 D3 への切り替えを開始すると、ACPI 名前空間の NFP デバイスに実装されている _PS3 制御メソッドを実行する、Windows ACPI ドライバー Acpi.sys に通知がいきます。 _PS3 メソッドでは、GPIO 操作領域を介して GPIO を切り替えることができます。 NFP デバイス ドライバーの移植性を高めるには、プラットフォーム固有の遅延またはその他のタイミング制約をプラットフォーム ファームウェアに実装する必要があります。これにより、NFP デバイス ドライバーを特定のプラットフォーム用にカスタマイズする必要がなくなります。
デバイスがアイドル状態で、プラットフォームが S0 (動作) システム電源状態にあるときに、NFP デバイスから D3 への切り替えを有効にするために、UMDF ドライバーから IWDFDevice2::AssignS0IdleSettingsEx メソッドが呼び出されます。 この呼び出しでは、ドライバーから WUDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 構造体へのポインターが入力パラメーターとして提供され、この構造体の DxState メンバーが PowerDeviceD3 に設定されます。
スタンバイ モードの NFP デバイスの電力消費量が 1 ミリワット を超える場合は、すべてのハンドルが閉じられたとき、またはすべてのハンドルに IOCTL_NFP_DISABLE 通知が送信されたときに、デバイスを電源切断モードにする必要があります。 基になるファームウェアとハードウェアが NFP デバイスから電力を切断するには、デバイスが既に D3 (つまり、D3hot) に入っている必要があります。また、NFP デバイス ドライバーにより、以前に D3cold への切り替えが有効にされている必要があります。 D3cold を有効にすると、すべての電源をデバイスから切断できるように、D3 への切り替え前にデバイスのハードウェア状態が NFP デバイスのドライバーにより保存されることが示唆されます。 電源をオンにした後で、デバイスは通常の動作を再開でき (つまり、デバイスは D3cold を終了します)、ドライバーによりデバイスのハードウェア状態が復元されるようにする必要があります。 D3cold を有効にするために、UMDF ドライバーから IWDFDevice2::AssignS0IdleSettingsEx メソッドが呼び出されます。 この呼び出しでは、ドライバーから WUDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 構造体へのポインターが提供され、この構造体の ExcludeD3Cold メンバーが WdfFalse に設定されます。
詳細については、「ドライバーでの D3cold のサポート」をご覧ください。
ラジオ マネージャー
NFP デバイスが RF (無線) メカニズムを使用して近接イベントを検出する場合、NFP デバイス ベンダーは、NFP デバイス ドライバーに加えてラジオ マネージャーを提供する必要があります。 ラジオ マネージャーは、無線管理ユーザー インターフェイス API を実装し、NFP デバイス ドライバーとプライベートに通信する COM DLL です。 ユーザーが Windows 設定アプリケーションで NFP デバイスのオンまたはオフ状態を変更すると、NFP デバイス ドライバーではラジオ マネージャーを通じて変更の通知を受信します。 ドライバー開発者は、ラジオ マネージャー COM オブジェクトと NFP デバイス ドライバーとの間で無線管理状態を通信するプライベート インターフェイスを定義する必要があります。 NFP デバイス ドライバーがラジオ マネージャー オブジェクトからコマンドを受信し、デバイスのラジオのオンまたはオフ状態がオフに設定された場合、ドライバーによりデバイスのハードウェア状態が保存され、NFP デバイスに関連付けられている RF コンポーネントがオフになり、デバイスが D3 に切り替えられる必要があります。 デバイスが D3 に入ったときに既に開いている GUID_DEVINTERFACE_NFP インターフェイスのすべてのハンドルの数量と状態を保持する必要があることに注意してください。
ラジオ マネージャーによって、NFP デバイスの RF コンポーネントが有効かつ電源がオンにする必要があることが示された後、次のいずれかが発生すると、NFP デバイスを直ちに D0 に戻す必要があります。
- クライアントは、NFP デバイス ドライバーへの新しいハンドルを開きます。
- 既に開いているハンドルは、IOCTL_NFP_ENABLE 通知を受け取ります。
プラットフォームがモダン スタンバイ状態になり、ユーザーがパスワードを入力すると、Windows によって IOCTL_NFP_ENABLE 通知が NFP デバイス ドライバーに送信されます。
ラジオ マネージャーにより NFP デバイスの RF コンポーネントを無効にし、電源をオフにする必要があると示された場合、新しいハンドルが開いている場合や既存のハンドルが有効になっている場合でも、ラジオ マネージャーにより RF コンポーネントを有効にし、電源をオンにする必要があると示されるまで、NFP デバイスを D3 に残す必要があります。
NFP デバイスをアイドル モードに戻すために NFP デバイスからコマンドの送信が要求される場合、このコマンドは通信バス (通常は I2C) を介して送信でき、NFP デバイス ドライバーの D0 への切り替えの完了の一部として発生する必要があります。
NFP デバイスを D0 に切り替えると、ACPI 名前空間のデバイス下にある _PS0 制御メソッドを実行できるようになります。 必要に応じて、この制御方法を使用して、SoC から NFP デバイスに GPIO ラインを切り替え、デバイスをアイドル モードに戻すことができます。
サポートされているハードウェア電源の構成
NFP デバイスは、ハードウェア プラットフォームがモダン スタンバイ状態である場合、平均で 1 ミリワット未満の消費電力である必要があります。 デバイスがスタンバイ モードになっているときに 1 ミリワットを超える電力を消費していない場合、デバイスが使用されていないときに、NFP デバイス ドライバーによってデバイスがスタンバイモードに設定されることが可能です。 それ以外の場合、システム設計者は、デバイスが使用されていないときにオフにできる専用の電源レールにデバイスを接続する必要があります。
スタンバイ電力が 1 ミリワット未満
NFP デバイスがスタンバイ モードで 1 ミリワット未満の電力を消費している場合は、NFP デバイスを任意のシステム電源レールに配置し、このレールを他の任意の数のデバイスと共有できます。 デバイスのスタンバイ電源モードへの切り替えは、D3 への切り替えの一環として行われます。
NFP デバイスのスタンバイ モードへの移行は、通信バス (通常は I2C) を介してコマンドを送信するか、NFP デバイスにルーティングされる SoC GPIO ラインを切り替えることによって開始できます。
NFP デバイスがスタンバイ モードに移行するために、GPIO ラインを SoC から切り替える必要がある場合、ACPI 名前空間の GPIO 操作領域で GPIO ラインを記述する必要があります。 システム インテグレーターは、ACPI 名前空間の NFP デバイスの下に _PS3 および _PS0 メソッドを実装する必要があります。 _PS3 メソッドを実装するには、NFP デバイスをスタンバイ モードに切り替えるように GPIO ラインを切り替える必要があります。 _PS0 メソッドを実装するには、NFP デバイスをスタンバイ モードからアイドル モードに切り替えるように GPIO ラインを切り替える必要があります。 このラインの切り替えは、プラットフォーム固有またはデバイス固有のタイミング制約の対象となる場合があります。
前に説明したように、NFP デバイス ドライバーでは、すべてのハンドルが閉じているか、すべてのハンドルが IOCTL_NFP_DISABLE 通知を受信したか、または、ラジオ マネージャーから NFP デバイスの RF コンポーネントをオフにするように要求された場合に、D3 への切り替えを開始する必要があります。
スタンバイ電力が 1 ミリワットを超える
スタンバイ モードの NFP デバイスの電力消費が 1 ミリワットを超える場合、NFP デバイスは、SoC の GPIO の制御下で個別にオンまたはオフにできる専用の電源レールに配置する必要があります。 すべてのハンドルが閉じられた場合、またはすべてのハンドルが IOCTL_NFP_DISABLE 通知を受信した場合、またはラジオ マネージャーから RF コンポーネントをオフにするように要求された場合、NFP デバイスは最初に D3 に切り替えられ、その後電源レールがオフになると電源切断モードに切り替わります。
切り替え可能な電源レールは、SoC またはコア シリコンの GPIO ラインで制御する必要があります。 GPIO ラインは、ACPI 名前空間の GPIO 操作領域の一部として記述されている必要があります。 さらに、ACPI 名前空間には、切り替え可能な電源レールを記述し、_ON および _OFF コントロール メソッドを実装する電源リソースを含める必要があります。 _ON と _OFF コントロール メソッドにより、GPIO 操作領域に記述されている GPIO ラインを切り替え、電源レールのオンとオフを切り替えます。 _PR3 および _PR0 パッケージは、ACPI 名前空間の NFP デバイスの下に配置する必要があります。また、電源レールを記述する電源リソースにリンクする必要があります。
前述のように、NFP デバイス ドライバーで D3cold を有効にする必要があります。 さらに、ドライバーでは、すべてのハンドルが閉じているか、すべてのハンドルが IOCTL_NFP_DISABLE 通知を受信したか、または、ラジオ マネージャーから RF コンポーネントをオフにするように要求された場合に、D3 への切り替えを開始する必要があります。 ACPI ドライバーが D3 IRP を受け取ると、_PR3 パッケージによって示される電源リソースで _OFF メソッドが実行されます。 このメソッドは、電源切り替えハードウェアを制御する GPIO ラインを切り替え、NFP デバイスから電源を切断します。
ラジオ マネージャーにより RF コンポーネントを有効にする必要があると示されると、新しいハンドルが開かれた場合、または既存のハンドルが IOCTL_NFP_ENABLE 通知を受け取った場合、NFP デバイス ドライバーでは D0 への切り替えを実行する必要があります。 ACPI ドライバーは、D0 IRP (DevicePowerState 型の IRP_MN_SET_POWER 要求) 受信すると、_PR0 パッケージによって示される電源リソースで _ON メソッドを実行します。 このメソッドは、電源切り替えハードウェアを制御する GPIO ラインを切り替え、NFP デバイスに電源を再適用します。
スリープ解除に関する懸念事項
NFP デバイスのスリープ解除に関する懸念事項はありません。 プラットフォームがモダン スタンバイの間、NFP デバイスは SoC のスリープ解除のサポートを許可されません。
テストおよび検証
モダン スタンバイでディスプレイの電源がオフになっている場合は、システムの設計者が NFT デバイスがスタンバイ モードまたは電源切断モードに確かに入ることを確認することが重要です。 NFP デバイスの電源管理ソリューションは、サードパーティのドライバーの実装に大きく依存しています。 そのため、システム インテグレーターは、NFP デバイス ベンダーと NFP デバイスの機能をテストして検証するための最適な方法について話し合う必要があります。
ドライバーへのすべてのハンドルが閉じているか無効になっているときに、NFP デバイス ドライバーにより D3 への切り替えが開始されるた場合、XPerf ツールを使用してこの切り替えを監視できます。 この検証方法は、タッチ コントローラーとセンサー デバイス向けに他の場所で説明されている方法と似ています。
ドライバーにより通信バスを使用してコマンドが送信され、デバイスがスタンバイ モードのオンとオフが切り替えられる場合、システム インテグレーターが電源管理操作を簡単に検証できるよう、ドライバーではイベント トレースをサポートする必要があります。 インストルメンテーションは、Windows のイベント トレーシング (ETW) イベントを使用して、Windows ドライバーに簡単に追加できます。 詳細については、「カーネル モード ドライバーへのイベント トレーシングの追加」を参照してください。 ETW トレースの利点は、XPerf を含む Windows Performance Toolkit スイートを使用して表示できるということです。
NFT デバイスの電源管理チェックリスト
システム インテグレーターと NFP ベンダーは、以下のチェックリストを確認して、システム電源管理の設計が Windows 8 と互換性を持っていることを検証する必要があります。
- 平均 1 ミリワット未満の電力を消費するスタンバイ モードの NFP デバイスを選択します。
- デバイスへのすべてのハンドルが閉じている場合、または開いているすべてのハンドルが IOCTL_NFP_DISABLE 通知を受け取った場合、またはラジオ マネージャーにより NFP デバイスの RF コンポーネントを無効にし、電源をオフに切り替えることを求された場合は、NFP デバイス ドライバーにより D3 への切り替えが開始されます。
- ラジオ マネージャーにより RF コンポーネントが有効にする必要があることが示され、その後最初のハンドルがデバイスに対して開かれた場合、または最初の開いているハンドルが IOCTL_NFP_ENABLE 通知を受け取った場合は、NFP デバイス ドライバーにより D0 への切り替えが開始されます。
- NFP デバイス ドライバーから通信バスを使用してカスタム コマンドが送信され、NFP デバイスにスタンバイ モードに切り替えることが伝えられた場合、NFP デバイス ベンダーとやり取りして、このコマンドに応答して NFP デバイスがスタンバイ電源モードに入るかどうかを確認する最善の方法を決定します。
- NFP デバイスの電力消費量が 1 ミリワットを超える場合は、デバイスが切り替え可能な電源レールに配置されていることを確認する必要があります。
- NFP デバイスが切り替え可能な電源レール上にある場合:
- デバイスが未使用のときにデバイスから電源を完全に切断し、電源の復旧によってデバイスが自動的に再び有効にされ、再初期化されるのを確認します。
- 電源レールが SoC またはコア シリコンの GPIO ラインによって制御されているのを確認します。
- システム ACPI ファームウェアに実装されている GPIO 操作領域に GPIO ラインをマップします。
- 電源レールを記述する電源リソースを指定し、この電源リソースに _ON、_OFF、_STA の制御方法を含めます。
- システムの ACPI ファームウェアで NFP デバイスの _PR0 および _PR3 パッケージを指定し、それらが電源リソースを参照することを確認します。
- NFP デバイスで、ドライバーがアクセスできるようになる前に電源オンの遅延が必要な場合は、この遅延を _ON コントロール メソッドの実装にエンコードします。
- モダン スタンバイのオンオフの複数回の切り替えを開始し、ディスプレイがオンになっているときに NFP デバイスの操作をストレス テストします。