인터럽트를 사용하여 디바이스 절전 모드 해제

디바이스가 저전력 상태로 전환되면 프레임워크는 I/O 처리에 사용되는 인터럽트 연결을 끊거나 비활성으로 보고합니다. WINDOWS 8.1 실행되는 KMDF 1.13 및 UMDF 2.0부터 WDF 드라이버는 디바이스가 저전력 상태로 전환될 때 활성 상태로 유지되는 프레임워크 인터럽트 개체를 만든 다음 디바이스를 절전 모드에서 절전 모드로 복원하는 데 사용할 수 있습니다.

SoC(System on a Chip) 플랫폼용 WDF 드라이버를 개발하는 경우 이러한 인터럽트를 사용하여 기존 절전 모드 해제 신호 메커니즘을 제공하지 않는 디바이스를 각성할 수 있습니다. 이 기능을 사용하려면 디바이스에 ACPI를 통해 노출되는 절전 모드 해제 인터럽트용 하드웨어 지원이 있어야 합니다. 인터럽트 생성 드라이버는 디바이스의 전원 정책 소유자여야 합니다.

디바이스가 저전력 상태로 전환되면 프레임워크는 절전 모드 해제 가능으로 식별된 인터럽트 연결을 끊지 않습니다. 디바이스가 중단되면 프레임워크는 IRQL = PASSIVE_LEVEL 드라이버의 EvtDeviceD0EntryEvtInterruptIsr 콜백 루틴을 호출합니다.

드라이버가 I/O 처리를 위해 수동 수준 인터럽트 개체 를 이미 만드는 경우 절전 모드 해제 기능을 위해 동일한 인터럽트 개체를 공유하는 것이 좋습니다. 이 시나리오에서 드라이버의 EvtInterruptIsr 콜백 루틴은 I/O 관련 인터럽트 및 절전 모드 해제 처리에 대한 처리를 수행하는 조건부 논리를 구현합니다.

그러나 드라이버가 디바이스의 IRQL(DIRQL)에서 처리해야 하는 인터럽트를 사용하는 경우 절전 모드 해제 기능을 제공하기 위해 추가 프레임워크 인터럽트 개체를 만드는 것이 좋습니다.

다음 단계에 따라 KMDF 또는 UMDF 드라이버에서 절전 모드 해제 가능 인터럽트 개체를 만듭니다.

  1. 일반적으로 EvtDriverDeviceAdd에서 WdfDeviceAssignS0IdleSettings를 호출하고 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. 프레임워크는 함수 또는 필터 드라이버에 대한 Power-Up 시퀀스에 설명된 대로 일반적인 전원 강화 콜백 시퀀스로 계속됩니다.

!wdfkd.wdfinterrupt 디버거 확장을 사용하여 특정 인터럽트가 절전 모드 해제 가능으로 구성되었는지 여부를 표시할 수 있습니다.

절전 모드 해제 인터럽트 기능은 USB 선택적 일시 중단과 함께 사용할 수 없습니다.