在 UMDF 驱动程序中支持空闲时关闭电源

警告

UMDF 2 是 UMDF 的最新版本,取代了 UMDF 1。 所有新的 UMDF 驱动程序都应使用 UMDF 2 编写。 不会向 UMDF 1 添加任何新功能,并且较新版本的 Windows 10 上对 UMDF 1 的支持有限。 通用 Windows 驱动程序必须使用 UMDF 2。

存档的 UMDF 1 示例可在 Windows 11 版本 22H2 - 2022 年 5 月驱动程序示例更新中找到。

有关详细信息,请参阅使用 UMDF 入门

当系统保持工作状态时,某些设备可能会进入睡眠状态。 对于此类设备,框架在设备处于空闲状态后启动降低设备的功率, () 预先确定 (和可设置) 时间。

其中一些设备还可以在检测到外部事件时在总线上触发唤醒信号。 总线驱动程序响应此信号,驱动程序堆栈将设备还原到其工作状态。 (在框架要求总线驱动程序启动将设备还原到其工作状态之前,未检测到外部事件的设备将保持低功耗状态。)

如果设备在空闲时可以关机, 电源策略所有者 必须执行以下两个步骤:

  1. 调用 IWDFDevice2::AssignS0IdleSettingsIWDFDevice3::AssignS0IdleSettingsEx 以指定:

    • 设备将进入的低功耗状态
    • 设备在降低其电源状态之前必须保持空闲的时间量
    • 设备是否可以检测外部事件并在总线上触发唤醒信号
    • 用户是否可以控制设备的空闲设置
    • 空闲超时期限到期时,框架是否可以将设备置于 D3cold 电源状态

    如果驱动程序是使用 1.11 版或更高版本的框架生成的,则可以调用 IWDFDevice3::AssignS0IdleSettingsEx ,而不是 IWDFDevice2::AssignS0IdleSettings。 除了上述功能外, IWDFDevice3::AssignS0IdleSettingsEx 还允许驱动程序指定:

    • 是启用还是禁用设备的空闲断电功能
    • 当系统返回到其工作 (S0) 状态时,设备是否会返回到其工作 (D0) 状态
  2. 如果需要设备,请实现 IPowerPolicyCallbackWakeFromS0 接口和以下事件回调函数:

框架认为设备处于空闲状态,并在满足以下所有条件时开始计算空闲时间:

  • 为此设备实例创建的电源托管队列中没有任何请求在队列中等待或已调度到驱动程序。 如果请求已调度到驱动程序,并且驱动程序将其发送到 I/O 目标,则请求仍与队列相关,并且设备不会被视为空闲。 非电源托管队列中的请求不会计入设备空闲状态。
  • 如果驱动程序以前名为 IWDFDevice2::StopIdle,则驱动程序随后将调用 IWDFDevice2::ResumeIdle
  • 如果电源策略所有者是总线驱动程序,则总线驱动程序的任何子设备都不在 D0 中。

如果驱动程序 (或用户) 为设备启用空闲关闭电源,则可能必须使用 IWDFDevice2::StopIdle 方法。 如果设备处于工作 (D0) 状态,则此方法可防止设备闲动,直到驱动程序调用 IWDFDevice2::ResumeIdle。 如果驱动程序调用 IWDFDevice2::StopIdle 时设备处于低功耗状态,并且系统处于工作 (S0) 状态,框架会请求总线驱动程序将设备还原到其工作 (D0) 状态。 有关驱动程序何时可能必须调用 IWDFDevice2::StopIdle 的详细信息,请参阅方法的参考页。

如果设备可以从低功耗状态唤醒自身,则设备总线的驱动程序将参与唤醒设备。 内核模式总线驱动程序在总线适配器上执行任何必要的操作,以启用和禁用设备从低功耗状态唤醒的功能。

有关控制设备空闲功能的注册表项的信息,请参阅 UMDF 中的设备空闲和唤醒行为的用户控制