支持空闲时关闭电源
当系统保持工作 (S0) 状态时,某些设备可能会进入低功率 (Dx) 状态。 从 Windows 8 开始,设备可以在进入 Dx 状态之前转换为低功率功能电源状态 (Fx) 。 对于此类设备,框架在设备处于空闲状态后启动设备或组件的电源降低, (在预先确定 (和可设置) 时间内不使用) 。
其中一些设备还可以在检测到外部事件时在总线上触发唤醒信号。 总线驱动程序响应此信号,驱动程序堆栈将设备还原到其工作状态。 (在框架要求总线驱动程序启动将设备还原到其工作状态之前,未检测到外部事件的设备仍处于低功耗状态。)
如果设备或组件在空闲时可以关机,电源策略所有者中的 EvtDriverDeviceAdd 回调函数必须执行以下两个步骤:
调用 WdfDeviceAssignS0IdleSettings 以指定:
- 设备将进入的低功耗状态
- 设备在降低电源状态之前 必须保持空闲 状态的时间
- 设备是否可以检测外部事件并在总线上触发唤醒信号
- 用户是否可以控制设备的空闲设置
- 是启用还是禁用了设备的空闲断电功能
- 当系统返回到其工作 (S0) 状态时,设备是否会返回到其工作 (D0) 状态
- 设备的空闲超时值是否由电源管理框架 (PoFx)
- 当空闲超时期限到期时,框架是否可以将设备置于 D3cold 电源状态
有关这些设置的详细信息,请参阅 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构以及 支持功能电源状态。
调用 WdfDeviceInitSetPowerPolicyEventCallbacks 以注册以下事件回调函数(如果需要它们用于设备):
- EvtDeviceArmWakeFromS0,使设备硬件 (而不是总线) 响应外部唤醒事件
- EvtDeviceDisarmWakeFromS0, (禁用总线响应外部唤醒事件的能力)
- EvtDeviceWakeFromS0Triggered,通知司机总线检测到唤醒信号。
空闲条件
框架认为设备处于空闲状态,并在满足以下所有条件时开始计算空闲时间:
- 为此设备实例创建的电源托管队列中没有任何请求在队列中等待或被调度到驱动程序。 如果请求已调度到驱动程序,并且驱动程序将其发送到 I/O 目标,则请求仍与队列相关。 除非驱动程序使用 send and forget 选项 发送请求,否则设备不会被视为空闲。 非电源托管队列中的请求不计入设备空闲状态。
- 如果驱动程序以前调用 了 WdfDeviceStopIdle,则驱动程序随后调用了 WdfDeviceResumeIdle。
- 如果电源策略所有者是总线驱动程序,则总线驱动程序的所有子设备都不在 D0 中。
如果驱动程序 (或用户) 为设备启用空闲电源关闭,则可能必须使用 WdfDeviceStopIdle 方法。 如果设备处于工作 (D0) 状态,则此方法可防止设备在驱动程序调用 WdfDeviceResumeIdle 之前闲动。 如果驱动程序调用 WdfDeviceStopIdle 时设备处于低功耗状态,并且系统处于工作 (S0) 状态,框架会请求总线驱动程序将设备还原到其工作 (D0) 状态。 每次成功调用 WdfDeviceStopIdle 都必须通过对 WdfDeviceResumeIdle 的调用进行匹配。 有关在调试器中查看电源引用计数的信息,请参阅 在 WDF 中调试电源引用泄漏。
有关驱动程序何时可能必须调用 WdfDeviceStopIdle 的详细信息,请参阅方法的参考页。
如果设备可以从低功耗状态唤醒自身,则设备总线的驱动程序将参与唤醒设备。 总线驱动程序通常提供 EvtDeviceEnableWakeAtBus 和 EvtDeviceDisableWakeAtBus 回调函数。 这些函数在总线适配器上执行任何必要的操作,以启用和禁用设备从低功耗状态唤醒的功能。
有关控制设备空闲功能的注册表项的信息,请参阅 用户控制设备空闲和唤醒行为。