다음을 통해 공유


단일 또는 다중 기능 전원 상태에서 단일 구성 요소 디바이스 지원

단일 구성 요소 디바이스에 대한 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 콜백 함수를 호출합니다.

드라이버는 WDF_POWER_FRAMEWORK_SETTINGS 구조에서 ComponentIdleStateCallback 루틴에 대한 포인터를 WdfDeviceWdmAssignPowerFrameworkSettings에 제공할 수 있습니다. 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

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

드라이버가 이전에 WdfInterruptReportInactive를 호출한 경우, ComponentActiveConditionCallback 또는 ComponentIdleStateCallback에서 WdfInterruptReportActive 를 호출하여 비활성 인터럽트를 다시 활성화합니다.