新式待机平台的近场近程 (NFP) 电源管理

近场近程 (NFP) 设备是一种短范围无线电发送器/接收器设备,使 Windows 电脑可以与其他配备 NFP 的计算机关联并配对。

NFP 设备通过 GUID_DEVINTERFACE_NFP 即插即用 (PnP) 接口向 Windows 操作系统公开。 由 NFP 设备供应商提供的第三方驱动程序负责实现 GUI_DEVINTERFACE_NFP 接口,并对物理 NFP 设备进行电源管理。 NFP 设备通常连接到片上系统 (SoC) 或核心芯片的 I2C 接口针脚。

一般而言,当没有软件客户端具有近程发布或订阅,或者禁用了所有发布和订阅时,NFP 设备可以进入低功率模式(待机模式或电源移除模式)。 从驱动程序开发的角度来看,如果设备上没有未完成的句柄,则会出现此情况。 当没有打开和启用设备的句柄时,NFP 设备应处于待机模式或电源移除模式下。

当平台进入新式待机状态并且显示器关闭时,NFP 设备必须进入待机模式或电源移除电源模式。 如果 NFP 设备在待机模式下的平均功耗大于 1 毫瓦,则设备必须进入 0瓦的电源移除模式。

当平台进入并退出新式待机时,不会直接通知 NFP 设备驱动程序。 相反,Windows 会通过在进入新式待机时禁用驱动程序的句柄,以及在从新式待机退出时启用这些相同句柄,来间接通知驱动程序。 平台进入新式待机后,Windows 会将禁用通知发送到每个尚未禁用的打开句柄。 平台推出新式待机时,Windows 会将启用通知发送到每个以前禁用的句柄。 进入新式待机之前已禁用的打开句柄在从新式待机退出后仍处于禁用状态。

设备电源管理模式

从 Windows 8 开始,除了电源移除模式(在该模式下,NFP 设备的所有电源输入都已由设备外部的硬件机制关闭)之外,新式待机平台的 NFP 设备还应具有三种电源模式:“活动”、“空闲”和“待机”。 有关设备支持的电源管理模式的详细信息,请与 NFP 设备的硬件供应商联系。

下表介绍了 NFP 设备的设备电源模式。

设备电源模式 说明 平均功率消耗 退出延迟到活动状态 转换机制

可用

NFP 设备在主动与附近计算机上的另一个 NFP 设备通信。

< 50 毫瓦

不适用

不适用

空闲

NFP 设备在等待另一台具有 NFP 的计算机进入附近。 NFP 设备的驱动程序具有打开的发布和订阅。

< 5 毫瓦

< 10 毫秒(典型)

硬件自治

Standby

NFP 设备已应用电源,但没有任何未完成的发布或订阅(没有打开句柄)。

< 1 毫瓦(与设备相关)

< 50 毫秒(典型)

驱动程序命令或来自 SoC 或核心芯片的 GPIO 引脚。

电源移除

NFP 设备未应用任何电源,因为平台未开机或外部实体已关闭。

0 瓦

< 100 毫瓦

外部实体通过 ACPI 固件移除电源或施加电源以响应 D3 IRP。

注意

  • 在上表中,“待机”一词是指不同于现代待机的设备电源模式,现代待机是平台范围的电源状态。
  • 在上表中,“D3 IRP”一词是指 DevicePowerState 类型的 IRP_MN_SET_POWER 请求。

待机模式下 NFP 设备的指定功耗会因商品编号和制造商而异。 系统设计人员应与设备供应商合作,以了解特定于设备的待机功耗。 如果待机模式下的功耗大于 1 毫瓦,则 NFP 设备应连接到可切换电源轨,以便在新式待机期间可以将设备置于电源移除模式。

软件电源管理机制

Windows 依靠 NFP 设备供应商来提供对 NFP 设备进行电源管理的第三方驱动程序。 Windows 期望此驱动程序监视 NFP 设备驱动程序的当前打开句柄数和这些句柄的状态,以确定何时将 NFP 设备置于低功率模式。

建议 NFP 驱动程序开发人员使用用户模式驱动程序框架 (UMDF) 开发其驱动程序。 UMDF 包含一些功能,这些功能可使设备运行时电源管理的开发更轻松。

D3 支持

建议 NFP 驱动程序开发人员在设备的所有句柄都已关闭,或设备的所有打开句柄都收到 IOCTL_NFP_DISABLE 通知后,将 NFP 设备置于 D3 状态。 在平台进入新式待机状态并且用户桌面锁定后,所有打开句柄都会收到 IOCTL_NFP_DISABLE 通知。

即使 NFP 设备在空闲电源模式下的功耗可以达到小于 1 毫瓦,仍建议在所有句柄都关闭或收到 IOCTL_NFP_DISABLE 通知后转换为 D3。 通过转换为 D3,NFP 设备的驱动程序堆栈中的所有驱动程序都会收到通知,了解硬件在进入低功率模式。 此外,可以通过内置在 Windows 中的检测来检测到 D3 的转换。 Windows Performance Toolkit 和其他性能诊断工具可用于观察此转换。 此内置诊断支持可降低系统集成商验证 NFP 设备是否为 IOCTL_NFP_DISABLE,从而正确执行电源管理的成本。

对于某些总线,总线上的设备必须先转换为 D3,然后总线控制器才能进入低功率状态。 对于 I2C 连接的 NFP 设备,无需终结点 NFP 设备进入 D3,I2C 总线控制器即可关闭。

不过,如果将来的新式待机平台使用通用串行总线 (USB) 连接到 NFP 设备,则 NFP 设备必须能够进入 D3,以便在新式待机期间,USB 主机控制器可以关闭并且 SoC 或核心芯片可以进入低功率空闲状态。 建议 NFP 设备驱动程序开发人员在其设备准备号进入低功率模式(不考虑基础总线)时将其设备转换为 D3,以便可在未来重复使用驱动程序并轻松进行电源管理诊断。

如果为进入待机电源模式,NFP 设备要求从 NFP 设备驱动程序通过通信总线发送命令,则此命令应作为驱动程序中 D3 转换的一部分进行发送。

如果 NFP 设备要求切换来自 SoC 的 GPIO 引脚以进入待机电源模式,则需要转换为 D3。 启动到 D3 的转换会通知 Windows ACPI 驱动程序 Acpi.sys,它会执行在 ACPI 命名空间中 NFP 设备下实现的 _PS3 控制方法。 _PS3 方法可以通过 GPIO 操作区域切换 GPIO 线路。 若要使 NFP 设备驱动程序更易于移植,应在平台固件中实现任何特定于平台的延迟或其他计时约束,以便不需要为特定平台自定义 NFP 设备驱动程序。

为了在设备处于空闲状态并且平台处于 S0(工作)系统电源状态时启用 NFP 设备到 D3 的转换,UMDF 驱动程序会调用 IWDFDevice2::AssignS0IdleSettingsEx 方法。 在此调用中,驱动程序会提供指向 WUDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构的指针作为输入参数,并将此结构的 DxState 成员设置为 PowerDeviceD3。

如果待机模式下 NFP 设备的功耗大于 1 毫瓦,则在所有句柄都关闭或向所有句柄都发送了 IOCTL_NFP_DISABLE 通知后,必须将设备置于电源移除模式。 若要使基础固件和硬件可以从 NFP 设备移除电源,设备必须已进入 D3(即 D3hot),并且 NFP 设备驱动程序必须以前已启用到 D3cold 的转换。 启用 D3cold 表示在转换为 D3 之前,NFP 设备的驱动程序会保存设备的硬件状态,以便可以从设备移除所有电源。 在设备开机(即设备退出 D3cold)且驱动程序还原设备的硬件状态后,设备必须能够在稍后时间恢复正常操作。 为了启用 D3cold,UMDF 驱动程序会调用 IWDFDevice2::AssignS0IdleSettingsEx 方法。 在此调用中,驱动程序提供指向 WUDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构的指针,并将此结构的 ExcludeD3Cold 成员设置为 WdfFalse。

有关详细信息,请参阅在驱动程序中支持 D3cold

无线电管理器

如果 NFP 设备使用 RF(无线电)机制检测近程事件,则 NFP 设备供应商除了提供 NFP 设备驱动程序外,还必须提供无线电管理器。 无线电管理器是一个 COM DLL,它会实现无线电管理用户界面 API,并与 NFP 设备驱动程序私下通信。 当用户在 Windows 设置应用程序中更改 NFP 设备的无线电开/关状态时,NFP 设备驱动程序会通过无线电管理器接收更改通知。 驱动程序开发人员必须定义专用接口,用于在无线电管理器 COM 对象与 NFP 设备驱动程序之间传达无线电管理状态。 当 NFP 设备驱动程序从无线电管理器对象收到命令以将设备的无线电开/关状态设置为关时,驱动程序必须保存设备的硬件状态,关闭与 NFP 设备关联的任何 RF 组件,并将设备转换为 D3。 请注意,在设备处于 D3 期间,必须保留在设备进入 D3 时来自 GUID_DEVINTERFACE_NFP 接口的所有已打开的句柄数量和状态。

在无线电管理器指示 NFP 设备中的 RF 组件应启用并开机后,当发生以下任一情况时,NFP 设备必须立即转换回 D0:

  • 客户端打开 NFP 设备驱动程序的新句柄。
  • 任何已打开句柄都会收到 IOCTL_NFP_ENABLE 通知。

当平台退出新式待机并且用户输入其密码时,Windows 会将 IOCTL_NFP_ENABLE 通知发送到 NFP 设备驱动程序。

如果无线电管理器指出 NFP 设备中的 RF 组件应禁用并关闭,则 NFP 设备必须保留为 D3(即使打开了新句柄或启用了现有句柄),直到无线电管理器指示 RF 组件应启用并开机。

如果 NFP 设备要求发送命令以将 NFP 设备恢复为空闲模式,则此命令可以通过通信总线(通常为 I2C)进行发送,并且应在 NFP 设备驱动程序中到 D0 的转换完成过程中进行。

通过将 NFP 设备转换为 D0,可以执行 ACPI 命名空间中设备下的 _PS0 控制方法。 如果需要,此控制方法可以将 GPIO 线路从 SoC 切换到 NFP 设备,以将设备恢复为空闲模式。

支持的硬件电源配置

在硬件平台处于新式待机期间,NFP 设备的平均功耗不应超过 1 毫瓦。 如果设备在处于待机模式时的功耗不超过 1 毫瓦,则 NFP 设备驱动程序可以在设备未使用时将设备置于待机模式。 否则,系统设计人员必须将设备连接到可以在设备未使用时关闭的专用电源轨。

待机功率小于 1 毫瓦

如果 NFP 设备在待机模式下的功耗小于 1 毫瓦,则 NFP 设备可以放置在任何系统电源轨上,并且可以与任何数量的其他设备共享此电源轨。 设备到待机电源模式的转换在其转换为 D3 期间进行。

可以通过通信总线(通常为 I2C)发送命令或切换路由到 NFP 设备的 SoC GPIO 线路,从而使 NFP 设备开始进入待机模式。

如果 NFP 设备要求切换来自 SoC 的 GPIO 线路以进入待机模式,则必须在 ACPI 命名空间中的 GPIO 操作区域中描述 GPIO 线路。 系统集成商必须在 ACPI 命名空间中的 NFP 设备下实现 _PS3 和 _PS0 方法。 _PS3 方法的实现应切换 GPIO 线路,以将 NFP 设备切换到待机模式。 _PS0 方法的实现应切换 GPIO 线路,以将 NFP 设备从待机模式切换到空闲模式。 切换此线路可能受限于特定于平台或特定于设备的计时约束。

如前所述,当所有句柄都关闭,或所有句柄都已收到 IOCTL_NFP_DISABLE 通知,或无线电管理器请求关闭 NFP 设备中的 RF 组件时,NFP 设备驱动程序必须启动到 D3 的转换。

待机功率大于 1 毫瓦

如果处于待机模式的 NFP 设备的功耗超过 1 毫瓦,则必须将 NFP 设备放置在可以在 SoC 的 GPIO 控制下独立打开和关闭的专用电源轨。 当所有句柄都关闭,或所有句柄都收到 IOCTL_NFP_DISABLE 通知,或无线电管理器请求关闭 RF 组件时,NFP 设备会首先转换为 D3,然后在电源轨关闭后转换为电源移除模式。

可切换电源轨必须由来自 SoC 或核心芯片的 GPIO 线路进行控制。 GPIO 线路应在 ACPI 命名空间中描述为 GPIO 操作区域的一部分。 此外,ACPI 命名空间必须包含描述可切换电源轨并实现 _ON 和 _OFF 控制方法的电源资源。 _ON 和 _OFF 方法会切换 GPIO 操作区域中描述的 GPIO 线路,以打开和关闭电源轨。 _PR3 和 _PR0 包必须放置在 ACPI 命名空间中的 NFP 设备下,并且必须链接到描述电源轨的电源资源。

如前所述,NFP 设备驱动程序必须启用 D3cold。 此外,当所有句柄都关闭,或所有句柄都已收到 IOCTL_NFP_DISABLE 通知,或无线电管理器请求关闭 RF 组件时,驱动程序必须启动到 D3 的转换。 当 ACPI 驱动程序收到 D3 IRP 时,它会对 _PR3 包指示的电源资源执行 _OFF 方法。 此方法会切换控制电源切换硬件的 GPIO 线路,以从 NFP 设备移除电源。

如果无线电管理器指示应启用 RF 组件,则当打开新句柄或现有句柄收到 IOCTL_NFP_ENABLE 通知时,NFP 设备驱动程序必须执行到 D0 的转换。 当 ACPI 驱动程序收到 D0 IRP(类型为 DevicePowerState 的 IRP_MN_SET_POWER 请求)时,它会对 _PR0 包指示的电源资源执行 _ON 方法。 此方法会切换控制电源切换硬件的 GPIO 线路,以对 NFP 设备重新应用电源。

唤醒问题

NFP 设备没有唤醒问题。 不允许 NFP 设备支持在平台处于新式待机期间唤醒 SoC。

测试和验证

对于系统设计师来说,验证在显示器关闭进行新式待机时 NFP 设备是否可靠地进入待机或电源移除模式,这一点至关重要。 NFP 设备的电源管理解决方案高度依赖于第三方驱动程序的实现。 因此,建议系统集成商与 NFP 设备供应商讨论测试和验证 NFP 设备功能的最佳方法。

如果 NFP 设备驱动程序在驱动程序的所有句柄都关闭或禁用时启动到 D3 的转换,则 XPerf 工具可用于观察此转换。 此验证方法与在其他位置针对触摸控制器和传感器设备所介绍的方法的类似。

如果驱动程序通过通信总线发送命令以将设备转换进入和退出待机模式,则驱动程序应支持事件跟踪,以便系统集成商可以轻松验证电源管理操作。 可以使用 Windows 事件跟踪 (ETW) 事件轻松地将检测添加到 Windows 驱动程序。 有关详细信息,请参阅将事件跟踪添加到内核模式驱动程序。 ETW 跟踪的一个优点在于,可以使用 Windows Performance Toolkit 工具套件(包含 XPerf)查看它。

NFP 设备电源管理清单

系统集成商和 NFP 供应商应查看以下清单,以验证其系统电源管理设计是否与 Windows 8 及更高版本兼容。

  • 选择待机模式的平均功耗小于 1 毫瓦的 NFP 设备。
  • 验证当设备的所有句柄都关闭,或所有打开句柄都已收到 IOCTL_NFP_DISABLE 通知,或无线电管理器请求禁用并关闭 NFP 设备中的 RF 组件时,NFP 设备驱动程序是否启动到 D3 的转换。
  • 验证当无线电管理器指示应启用 RF 组件,然后对设备打开了第一个句柄或第一个打开句柄收到 IOCTL_NFP_ENABLE 通知时,NFP 设备驱动程序是否启动到 D0 的转换。
  • 如果 NFP 设备驱动程序通过通信总线发送自定义命令以告知 NFP 设备进入待机模式,请与 NFP 设备供应商合作,确定验证 NFP 设备是否进入待机电源模式以响应此命令的最佳方法。
  • 如果 NFP 设备的功耗大于 1 毫瓦,请确保设备放置在可切换电源轨上。
  • 如果 NFP 设备位于可切换电源轨上:
    • 验证设备是否支持在未使用设备时完全移除电源,以及还原电源是否会自动重新启用并重新初始化设备。
    • 验证电源轨是否由来自 SoC 或核心芯片的 GPIO 线路进行控制。
    • 将 GPIO 线路映射到在系统 ACPI 固件中实现的 GPIO 操作区域。
    • 提供电源资源来描述电源轨,并在此电源资源中包含 _ON、_OFF 和 _STA 控制方法。
    • 在系统 ACPI 固件中的 NFP 设备下提供 _PR0 和 _PR3 包,并确保它们引用电源资源。
    • 如果 NFP 设备要求在驱动程序可以访问它之前存在开机延迟,则在 _ON 控制方法的实现中对此延迟进行编码。
  • 启动进入和退出新式待机的多个转换,然后在打开显示器时对 NFP 设备的操作进行压力测试。