단일 또는 다중 기능 전원 상태를 사용하여 Single-Component 디바이스 지원

단일 구성 요소 디바이스에 대한 KMDF 드라이버는 구성 요소에 대한 하나 이상의 기능 전원 상태를 정의하고 구성 요소의 Fx 상태가 변경되거나 활성/유휴 상태가 변경되면 PoFx(전원 관리 프레임워크)가 호출하는 콜백 함수를 등록할 수 있습니다. UMDF 버전 2.0부터 단일 구성 요소 디바이스에 대한 UMDF 드라이버는 단일 기능 전원 상태(F0)를 정의할 수 있습니다.

PoFx에 대한 자세한 내용은 Power Management Framework 개요를 참조하세요.

단일 구성 요소 디바이스에 대한 Fx 상태 지원을 구현하려면 디바이스가 처음 시작될 때 또는 처음 시작하는 동안 순서대로 다음을 수행해야 합니다.

  1. 이 단계는 KMDF 드라이버 전용입니다. WdfDeviceWdmAssignPowerFrameworkSettings를 호출하여 WDF가 PoFx에 등록할 때 사용하는 전원 프레임워크 설정을 지정합니다. 드라이버가 WdfDeviceWdmAssignPowerFrameworkSettings를 호출할 때 제공하는 WDF_POWER_FRAMEWORK_SETTINGS 구조에서 드라이버는 여러 콜백 함수에 대한 포인터를 제공할 수 있습니다. 드라이버가 단일 기능 전원 상태(F0)만 지원하는 경우 이 단계는 선택 사항입니다.

  2. 이 단계는 KMDF 드라이버 및 UMDF 드라이버에 적용됩니다. WdfDeviceAssignS0IdleSettings를 호출하고 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 구조체의 IdleTimeoutType 필드를 SystemManagedIdleTimeout 또는 SystemManagedIdleTimeoutWithHint로 설정합니다. 이렇게 하면 WDF가 PoFx에 등록합니다.

    KMDF 드라이버의 경우 PoFx에 등록할 때 프레임워크는 WdfDeviceWdmAssignPowerFrameworkSettings를 호출할 때 드라이버가 WDF_POWER_FRAMEWORK_SETTINGS 제공한 정보를 사용합니다.

예를 들어 리소스 리밸런싱 시 디바이스를 두 번 이상 시작할 수 있으므로 드라이버는 EvtDeviceSelfManagedIoInit 콜백 함수 내에서 이전 단계를 수행할 수 있습니다. 드라이버가 EvtDeviceSelfManagedIoInit 콜백 함수를 등록한 경우 프레임워크는 프레임워크가 드라이버의 EvtDeviceD0Entry 콜백 함수를 처음으로 호출한 후 각 디바이스에 대해 한 번 호출합니다.

이 항목의 나머지 정보는 KMDF 드라이버에만 적용됩니다.

전원 켜기

드라이버가 WdfDeviceWdmAssignPowerFrameworkSettings를 호출하면 EvtDeviceWdmPostPoFxRegisterDevice 콜백 함수에 대한 포인터를 제공할 수 있습니다.

프레임워크는 프레임워크가 PoFx에 등록된 후 드라이버의 EvtDeviceWdmPostPoFxRegisterDevice 콜백 함수를 호출합니다. 다음은 일반적인 전원 켜기 시퀀스의 예입니다.

  1. EvtDevicePrepareHardware
  2. EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
  3. EvtInterruptEnable
  4. EvtDeviceWdmPostPoFxRegisterDevice // PoFx 핸들을 사용할 수 있습니다.

드라이버는 전원 프레임워크 등록을 위해 POHANDLE을 사용하여 추가 작업을 수행해야 하는 경우 EvtDeviceWdmPostPoFxRegisterDevice 콜백을 제공합니다. 예를 들어 대기 시간, 상주 및 절 해제 요구 사항을 지정할 수 있습니다. POHANDLE을 사용하는 루틴에 대한 자세한 내용은 디바이스 전원 관리 루틴을 참조하세요.

드라이버는 POHANDLE을 사용하여 PoFx와 전원 제어 요청을 교환할 수도 있습니다.

전원 을 낮추기

WDF는 PoFx를 사용하여 지정된 등록을 삭제하기 전에 EvtDeviceWdmPrePoFxUnregisterDevice 콜백 함수를 호출합니다.

드라이버는 WdfDeviceWdmAssignPowerFrameworkSettings에 제공하는 WDF_POWER_FRAMEWORK_SETTINGS 구조에서 ComponentIdleStateCallback 루틴에 대한 포인터를 제공할 수 있습니다. PoFx는 이 루틴을 호출하여 지정된 구성 요소의 Fx 전원 상태에 대한 보류 중인 변경 사항을 드라이버에 알립니다. 이 콜백 루틴에서 드라이버는 기능 상태 변경과 관련된 하드웨어 관련 작업을 수행할 수 있습니다.

예를 들어 구성 요소를 저전력 Fx 상태로 전환하기 전에 드라이버는 하드웨어 상태를 저장하고 인터럽트 및 DMA를 사용하지 않도록 설정할 수 있습니다. 드라이버는 WdfInterruptReportInactive 를 호출하여 인터럽트가 더 이상 활성화되지 않음을 시스템에 알릴 수 있습니다. F 상태 전환 중에 인터럽트 해제는 전체 시스템 전력 소비를 줄일 수 있습니다.

드라이버는 WDF_POWER_FRAMEWORK_SETTINGS 구조에서 ComponentIdleConditionCallback 루틴에 대한 포인터를 제공할 수도 있습니다. PoFx는 이 루틴을 호출하여 드라이버에 구성 요소가 유휴 상태가 되었음을 알립니다. 이 루틴에서 드라이버는 전원 관리형 큐 및 자체 관리형 I/O 작업을 중지하는 프로세스를 시작합니다.

  1. 각 디바이스의 전원 관리 큐에 대해 WdfIoQueueStop 을 한 번 호출합니다. WdfIoQueueStop에 대한 각 호출에서 EvtIoQueueState 콜백을 제공합니다. 일반적으로 드라이버는 ComponentIdleConditionCallback 내에서 WdfIoQueueStop을 호출합니다.

  2. 각 전원 관리 큐에서 드라이버로 디스패치되는 요청이 신속하게 완료되었는지 확인합니다. 드라이버에 따라 다음 중 일부 또는 전부가 포함될 수 있습니다.

    • 드라이버가 연장된 시간 동안 요청을 보관하지 않고 I/O 대상으로 전달하지 않는 경우 3단계를 계속 진행합니다.
    • 드라이버가 연장된 시간 동안 특정 요청을 보유하는 경우 이러한 요청을 수동 큐에 다시 큐에 추가합니다. ComponentActiveConditionCallback 루틴에서 드라이버는 요청을 검색할 수 있습니다.
    • 드라이버가 특정 요청을 장기간 보유하는 I/O 대상에 전달하는 경우 이러한 요청을 취소합니다. ComponentActiveConditionCallback에서 요청을 다시 제출합니다.
  3. 각 큐가 중지되면 프레임워크는 EvtIoQueueState를 호출합니다. 드라이버가 여러 개의 전원 관리형 큐를 중지하는 경우 프레임워크는 각 큐 에 대해 한 번씩 EvtIoQueueState 를 여러 번 호출합니다.

    드라이버는 마지막 EvtIoQueueState 함수가 호출된 후 PoFxCompleteIdleCondition을 호출해야 합니다. 예를 들어 드라이버는 마지막 EvtIoQueueState 내에서 이 호출을 수행할 수 있습니다.

    마지막 호출을 확인하기 위해 드라이버는 카운터를 사용하여 프레임워크가 EvtIoQueueState를 호출한 횟수를 추적할 수 있습니다. Singlecomp 샘플에서는 이 기술을 보여 줍니다. 이 샘플은 Windows 8 WDK부터 사용할 수 있습니다.

다음은 일반적인 전원 다운 시퀀스의 예입니다.

  1. ComponentIdleConditionCallback
  2. ComponentIdleStateCallback
  3. EvtInterruptDisable
  4. EvtDeviceD0Exit

ComponentActiveConditionCallback에서 전원 관리형 큐 및 자체 관리형 I/O 작업을 다시 시작합니다.

드라이버가 이전에 WdfInterruptReportInactive라고 하는 경우 ComponentActiveConditionCallback 또는 ComponentIdleStateCallback에서 WdfInterruptReportActive를 호출하여 비활성 인터럽트를 다시 사용하도록 설정합니다.