다음을 통해 공유


GUID_D3COLD_SUPPORT_INTERFACE 드라이버 인터페이스를 사용하기

Windows 8부터 드라이버는 GUID_D3COLD_SUPPORT_INTERFACE 인터페이스의 루틴을 호출하여 디바이스의 D3cold 기능을 확인하고 이러한 디바이스에서 D3cold를 사용할 수 있도록 할 수 있습니다. 이 인터페이스의 두 가지 기본 루틴은 SetD3ColdSupportGetIdleWakeInfo입니다.

GUID_D3COLD_SUPPORT_INTERFACE 드라이버 인터페이스는 D3 디바이스 전원 상태의 D3cold 하위 상태를 지원합니다. D3은 D3hot 및 D3cold라는 두 개의 하위 상태로 나뉩니다. D3은 전원이 가장 낮은 디바이스 전원 상태이며 D3cold는 D3hot보다 적은 전력을 사용합니다. 디바이스, 부모 버스 드라이버 및 플랫폼 펌웨어가 이 상태를 지원하는 경우에만 디바이스가 D3cold를 입력할 수 있습니다. D3cold를 지원하는 디바이스는 컴퓨터가 S0(작동 중) 시스템 전원 상태일 때 이 상태를 입력하고 종료할 수 있습니다.

디바이스의 전원 정책 소유자(PPO)인 드라이버는 이 인터페이스의 루틴을 호출하여 다음을 수행합니다.

  • 디바이스, 부모 버스 드라이버 및 플랫폼 펌웨어가 D3cold 하위 상태로의 전환을 지원하는지 확인합니다.
  • 디바이스가 D3cold 서브스테이트에 있을 때 디바이스가 프로세서로 웨이크 이벤트를 신호로 보낼 수 있는지 여부를 확인합니다.
  • 디바이스에서 D3cold 하위 상태로의 전환을 사용하거나 사용하지 않도록 설정합니다.

이 인터페이스를 쿼리하기 위해 디바이스 드라이버는 드라이버 스택 아래로 IRP_MN_QUERY_INTERFACE IRP를 보냅니다. 이 IRP의 경우 드라이버는 InterfaceType 입력 매개 변수를 GUID_D3COLD_SUPPORT_INTERFACE 설정합니다. IRP가 성공적으로 완료되면 Interface 출력 매개 변수는 D3COLD_SUPPORT_INTERFACE 구조체에 대한 포인터입니다. 이 구조체에는 인터페이스의 루틴에 대한 포인터가 포함됩니다.

D3cold 디바이스 전원 상태에 대한 자세한 내용은 드라이버에서 D3cold 지원을 참조하세요.

드라이버는 SetD3ColdSupport 루틴을 호출하여 컴퓨터가 S0에 있을 때 발생할 수 있는 D3cold로의 디바이스 전환을 동적으로 사용하도록 설정하고 사용하지 않도록 설정합니다. 디바이스가 진입하는 모든 저전력 Dx 상태에서 절전 모드 해제 이벤트를 신호할 수 있어야 한다면, 드라이버는 디바이스가 D3cold 상태에서도 절전 모드 해제 이벤트를 신호할 수 있는 경우에만 디바이스가 D3cold로 진입하도록 해야 합니다. 그렇지 않은 경우 디바이스가 D3cold로 들어가면 컴퓨터가 S0 상태를 떠날 때까지 사용할 수 없을 수 있습니다.

기본적으로 SetD3ColdSupport 루틴에 대한 첫 번째 호출 전에 D3hot-D3cold 전환이 비활성화됩니다. 첫 번째 SetD3ColdSupport 호출 전에 D3hot-D3cold 전환을 사용하도록 이 기본값을 변경하려면 디바이스의 드라이버 패키지에 드라이버를 설치하는 INF 파일의 DDInstall.HW 섹션에 다음 두 줄을 포함할 수 있습니다.

Include = machine.inf
Needs = PciD3ColdSupported

GetIdleWakeInfo 루틴을 사용하면 디바이스의 드라이버가 컴퓨터가 특정 시스템 전원 상태에 있을 때 디바이스가 깨우기 이벤트를 신호로 보낼 수 있는 디바이스 전원 상태를 확인할 수 있습니다. 이 루틴에 대한 호출자는 시스템 전원 상태를 입력 매개 변수로 지정하고, 출력 매개 변수로, 루틴은 컴퓨터가 지정된 시스템 전원 상태에 있을 때 디바이스가 대기 이벤트에 신호를 보낼 수 있는 가장 낮은 전원 디바이스 전원 상태를 보고합니다. 예를 들어 GetIdleWakeInfo 루틴은 컴퓨터가 S0에 있을 때 디바이스가 D3cold에서 절전 모드 해제 이벤트를 신호로 보낼 수 있는지 여부를 드라이버에 알릴 수 있습니다.

GetIdleWakeInfo 루틴은 IRP_MN_QUERY_CAPABILITIES 요청보다 더 완전한 장치 웨이크 정보를 제공합니다. 모든 버전의 Windows에서 지원하는 이 요청은 디바이스의 기능을 설명하는 DEVICE_CAPABILITIES 구조를 제공합니다. 이 구조체의 DeviceWake 멤버는 GetIdleWakeInfo 루틴에서 사용할 수 있는 정보의 하위 집합을 포함합니다. 이 멤버는 디바이스가 대기 이벤트에 신호를 보낼 수 있는 최하위 전원 디바이스 전원 상태를 나타냅니다. 이 멤버의 정보는 컴퓨터가 구조체의 SystemWake 멤버가 나타내는 시스템 저전력 상태인 경우에만 정확하도록 보장됩니다. SystemWake = PowerSystemSleeping3의 경우 DeviceWake의 정보는 S3에 유효한 것으로 알려져 있으며 S1 및 S2에 대해 자주 유효할 수 있으며 S0에도 유효할 수 있습니다.

그러나 모범 사례로, 드라이버는 DeviceWake 메서드의 정보가 SystemWake에 표시된 상태 이외의 시스템 전원 상태에 유효하다고 가정해서는 안 됩니다. 일부 디바이스의 경우 디바이스가 절전 모드 해제 이벤트를 신호로 보낼 수 있는 가장 낮은 Dx 상태는 컴퓨터가 작동 상태 S0인지 또는 저전력 상태(S1, S2, S3 또는 S4)인지에 따라 달라집니다. 다른 디바이스의 경우 디바이스가 연결된 버스는 컴퓨터가 S0에 있을 때 절전 모드 해제 신호를 처리할 수 있지만 디바이스는 처리할 수 없습니다. GetIdleWakeInfo 루틴만 이러한 디바이스의 디바이스 절전 모드 해제 기능을 정확하게 설명할 수 있습니다.

예를 들어 PCI Express Base 3.0 사양 은 절전 모드 해제 이벤트를 신호하는 두 개의 별도 메커니즘을 정의합니다. 한 메커니즘은 PCI Express 링크(버스)가 켜져 있을 때 사용되고 다른 메커니즘은 링크가 꺼져 있을 때 사용됩니다. 링크가 켜지면 디바이스는 PM_PME TLL(트랜잭션 계층 패킷) 스트림을 전송하여 디바이스가 저전력 Dx 상태에서 D0으로 이동해야 한다는 신호를 보냅니다. 링크가 꺼지면 디바이스는 PM_PME TPS를 보낼 수 있도록 링크를 설정해달라고 요청합니다. 링크를 활성화하도록 요청하기 위해 디바이스는 WAKE# 신호를 활성화하거나 (일반적인 디바이스 형태의 경우), 또는 덜 일반적인 경우로 "비콘 메커니즘"을 사용합니다.

PCI Express 사양을 사용하려면 D3cold에서 PME(전원 관리 이벤트)에 신호를 보낼 수 있는 기능을 보급하는 모든 디바이스가 이러한 디바이스 절전 모드 해제 메커니즘을 모두 구현해야 하지만 드라이버 개발자는 이러한 메커니즘을 올바르게 구현하지 않는 디바이스를 사용하도록 설정해야 할 수 있습니다.

링크가 켜져 있을 때 디바이스가 PM_PME TLL을 올바르게 제공할 수 있는 경우 컴퓨터가 S0에 있을 때 드라이버가 D3hot을 입력하도록 설정할 수 있습니다. 디바이스가 WAKE# 신호를 올바르게 어설션하여 링크를 설정한 다음 PM_PME TPS를 사용하여 D0으로의 전환을 시작할 수 있는 경우 드라이버는 컴퓨터가 S0에 있을 때 디바이스가 D3cold를 입력하도록 설정할 수 있습니다.

그러나 시스템 펌웨어(BIOS)가 PCI Express 디바이스 절전 모드 해제 메커니즘이 하드웨어 플랫폼에서 올바르게 처리되도록 보장할 수 없는 경우 드라이버는 디바이스가 D3hot 또는 D3cold를 입력하도록 설정해서는 안 됩니다. 드라이버는 GetIdleWakeInfo 루틴을 호출하여 펌웨어가 이러한 메커니즘에 대한 지원을 클레임하는지 여부를 검색할 수 있습니다. 드라이버가 KMDF(Kernel-Mode Driver Framework) 1.11 이상을 사용하는 경우 GetIdleWakeInfo 를 호출하는 편리한 대안은 WdfDeviceAssignS0IdleSettings 메서드를 사용하여 디바이스가 절전 모드 해제 이벤트를 신호로 보낼 수 있는 가장 낮은 전원 Dx 상태에서 유휴 상태가 되도록 하는 것입니다.