设备进入低功耗状态

如果发生以下情况之一,设备将使其工作 (D0) 状态,并进入低功耗状态:

  • 设备 (处于空闲状态,即) 访问,并且能够在系统保持工作 (S0) 状态时进入低功耗空闲状态。

  • 系统的电源状态已从其工作 (S0) 状态更改为低功耗状态。 (驱动程序可以调用 WdfDeviceGetSystemPowerAction 来确定系统电源状态更改的原因。)

对于支持该设备的每个函数和筛选器驱动程序,框架从驱动程序堆栈中最高的驱动程序开始,按顺序一次执行一个驱动程序的以下操作:

  1. 如果驱动程序使用自托管 I/O,框架将调用驱动程序的 EvtDeviceSelfManagedIoSuspend 回调函数。

  2. 框架会停止驱动程序的所有电源托管 I/O 队列,并调用其 EvtIoStop 回调函数 ((如果它们存在) )。

  3. 如果驱动程序是设备的电源策略所有者,框架将调用其 EvtDeviceArmWakeFromS0EvtDeviceArmWakeFromSxEvtDeviceArmWakeFromSxWithReason 回调函数。

  4. 如果硬件和驱动程序支持 DMA,框架会调用驱动程序的 EvtDmaEnablerSelfManagedIoStopEvtDmaEnablerFlushEvtDmaEnablerDisable 回调 函数 ((如果它们存在) 创建的每个 DMA 通道)。

  5. 框架 (调用驱动程序的 EvtDeviceD0ExitPreInterruptsDisabled 回调函数(如果存在) ),然后调用驱动程序的 EvtInterruptDisable 回调函数 ((如果存在每个中断) ),以便驱动程序可以禁用设备中断。

  6. 框架 (调用驱动程序的 EvtDeviceD0Exit 回调函数(如果存在) )。

总线驱动程序是堆栈中最后调用的驱动程序。 当框架调用总线驱动程序的 EvtDeviceD0Exit 回调函数时,回调函数将设备的电源状态 (总线) 的子设备设置为低功耗状态。 框架指定 D3 低功耗状态,除非电源策略所有者指定了不同的低功耗状态。

注意

总线驱动程序用于设置子设备的电源状态的方法特定于总线。 例如,PCI 总线电源管理规范定义 16 位电源管理控制/状态寄存器 (PMCSR) 。 最低两位 (“PowerState”) 都决定设备的当前电源状态,并用于将设备设置为新的电源状态。 pci.sys当 PDO 收到IRP_MN_SET_POWER/D3 时,它会读取 PMCSR,将 PowerState 位更改为 11b (功率级别 D3) ,并写回 PMCSR。