デバイスのウェイクに対する割り込みの使用

デバイスが低電力状態に移行すると、フレームワークは、I/O 処理に使用される割り込みを切断 (または非アクティブとして報告) します。 Windows 8.1 で実行されている KMDF 1.13 および UMDF 2.0 以降、WDF ドライバーは、デバイスが低電力状態に遷移したときに再アクティブ メイン フレームワーク割り込みオブジェクトを作成し、デバイスを起動して D0 状態に完全に復元するために使用できます。

System on a Chip (SoC) プラットフォーム用の WDF ドライバーを開発している場合は、このような割り込みを使用して、従来のウェイク シグナリング メカニズムを提供しないデバイスをウェイクさせることができます。 この機能を使用するには、ACPI を介して公開されるように、デバイスでウェイク割り込みに対するハードウェア サポートが必要です。 割り込みを作成するドライバーは、デバイスの電源ポリシー所有者である必要があります。

デバイスが低電力状態に移行すると、フレームワークは、ウェイク対応として識別された割り込みを切断しません。 デバイスが中断されると、フレームワークはドライバーの EvtDeviceD0Entry および EvtInterruptIsr コールバック ルーチンを IRQL = PASSIVE_LEVELで呼び出します。

ドライバーが I/O 処理用の パッシブ レベルの割り込みオブジェクト を既に作成している場合は、ウェイク機能向けに同じ割り込みオブジェクトを共有することをお勧めします。 このシナリオでは、ドライバーの EvtInterruptIsr コールバック ルーチンは、I/O 関連の割り込みの処理とウェイク処理を実行する条件付きロジックを実装します。

ただし、ドライバーがデバイスの IRQL (DIRQL) での処理を必要とする割り込みを使用する場合は、ウェイク機能を提供する追加のフレームワーク割り込みオブジェクトを作成することをお勧めします。

KMDF ドライバーまたは UMDF ドライバーでウェイク対応割り込みオブジェクトを作成するには、次の手順に従います。

  1. 通常は EvtDriverDeviceAdd から WdfDeviceAssignS0Idle 設定を呼び出し、IdleCaps パラメーターに IdleCanWakeFromS0 を指定します。

  2. 必要に応じて、WdfDeviceInitSetPowerPolicyEventCallbacks を呼び出して、「システム ウェイクアップのサポート」で説明されているイベント コールバック関数を登録します。

  3. WDF_INTERRUPT_CONFIG_INIT を呼び出して、WDF_INTERRUPT_CONFIG 構造体を初期化します。 パッシブ レベルで呼び出される EvtInterruptIsr コールバック関数を提供します。 構成構造で、PassiveHandlingCanWakeDeviceTRUE に設定します。 次に、ドライバーの EvtDevicePrepareHardware コールバック関数から WdfInterruptCreate を呼び出して、フレームワーク割り込みオブジェクトを作成します。

  4. WdfDeviceAssignSxWakeSettings を呼び出して、システムを低電力状態からウェイクするようにデバイスを構成します。

    WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings);
    wakeSettings.DxState = PowerDeviceD3;
    wakeSettings.UserControlOfWakeSettings = WakeDoNotAllowUserControl;
    wakeSettings.Enabled = WdfTrue;
    
    status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings);
    if (!NT_SUCCESS(status)) {
        Trace(TRACE_LEVEL_ERROR,"WdfDeviceAssignSxWakeSettings failed %x\n", status);
        return status;
    }
    
  5. デバイスが低電力状態に移行すると、フレームワークはウェイク対応割り込みのために EvtInterruptDisable を呼び出しません。 ドライバーが指定した場合、フレームワークは EvtDeviceArmWakeFromS0 を呼び出します。

  6. デバイスがウェイク割り込みを通知すると、フレームワークはドライバーの EvtDeviceD0Entry コールバック ルーチンを呼び出します。

  7. ドライバーの EvtDeviceD0Entry コールバックが成功を返した場合、フレームワークはドライバーの EvtInterruptIsr コールバックをパッシブ レベルで呼び出します。 割り込みハンドラーが戻る前に、割り込みコントローラの割り込みをサイレンスにする必要があります。 ドライバーが EvtDeviceD0Entry からエラー コードを返す場合、フレームワークは割り込みを切断し、ドライバーが提供している場合は、ドライバーの EvtInterruptDisable コールバックを呼び出します。

  8. フレームワークは、ドライバーが提供している場合は、次のウェイク イベント コールバック ルーチンを呼び出します。

  9. フレームワークは、関数またはフィルター ドライバーの電源投入シーケンスの説明に従って、通常のパワーアップ コールバック シーケンスを続行します。

!wdfkd.wdfinterrupt デバッガー拡張機能を使用して、特定の割り込みがウェイク対応に構成されているかどうかを示すことができます。

USB 選択的中断と組み合わせてウェイク割り込み機能を使用することはできません。