新式待机平台的蓝牙电源管理

蓝牙无线电设备支持电脑与输入设备、音频设备或其连接蓝牙的用户外围设备之间的短距离 RF 通信。 在新式备用电脑中,蓝牙无线电的驱动程序应按照本文中提供的准则管理此设备的电源状态。

蓝牙无线电

在 Windows 系统中,如何管理蓝牙无线电设备的电源状态取决于无线电连接到的总线。 在支持新式待机电源模型的硬件平台上,Windows 支持连接到 UART 或通用串行总线 (USB) 的蓝牙无线电。 (理论上,Windows 8 中引入的蓝牙传输总线驱动程序应支持任何基础通信总线。 目前,Microsoft 仅对连接到 UART 或 USB 或者集成到片上系统 (SoC) 中的蓝牙无线电验证了新式待机兼容性)。

与典型 Windows 驱动程序堆栈中一样,蓝牙无线电电源策略由单个电源策略所有者 (PPO) 管理 - 具体而言是 BthPort (bthport.sys)。 BthPort 与特定于传输的对应驱动程序(UART 或 USB)配合使用,以将无线电适当地驱动到所需电源状态。 对于 USB,可通过 USB 主机控制器,借助 USB 选择性挂起完成此操作。 对于 UART,供应商提供的其他传输总线驱动程序通过特定于系统的总线连接协调从 BthPort 到蓝牙无线电设备的请求。 为了控制硬件,驱动程序将带内总线通信、与电源引擎插件 (PEP) 的协调和/或通过 GPIO 引脚发出的带外信号结合使用。

蓝牙无线电设备通常支持多种低功率模式,其中一些模式可能专属于设备本身。 Windows 蓝牙驱动程序堆栈要求蓝牙无线电支持以下三种设备电源状态:

  • 主动 (D0)
  • 睡眠 (D2)
  • 关闭 (D3)

蓝牙无线电的设备电源管理应在所有系统电源状态间以一致的方式运行。 当系统进入新式待机时,蓝牙无线电不会进入特殊电源管理模式。 相反,蓝牙无线电会基于由 BthPort 管理的空闲超时转换进入和退出睡眠模式 (D2) 状态。 为了支持在蓝牙连接的 HID 输入设备上从新式待机中唤醒,无线电保持睡眠 (D2) 状态并准备好唤醒。 仅允许配对的蓝牙 HID 设备在新式待机期间唤醒系统。 如果没有设备通过 RF 链路连接,则蓝牙无线电在睡眠 (D2) 状态下的功耗应非常低(小于 1 毫瓦)。 功耗可能会因关联设备数、这些设备的类型及其活动模式而异。

蓝牙无线电还必须支持通过无线电管理用户界面关闭无线电的功能。 此用户界面控件内置于 Windows 中。 蓝牙无线电通过此用户界面关闭后,无线电会转换为“关闭”(D3) 电源状态,在此状态下的功耗应几乎为 0 瓦。

早期版本的 Windows(包括 Windows 8 和 Windows 8 RT)要求蓝牙设备供应商提供无线电控制 DLL。 但是从 Windows 8.1 和 Windows RT 8.1 开始,新式待机平台中的所有蓝牙无线电都应支持蓝牙核心规范版本 4.0。 因此,供应商不再需要提供软件 DLL 来实现无线电开/关控制功能。 Windows 现在会处理此功能,并且会忽略任何此类 DLL(即使存在)。

电源管理模式

从软件的角度来看,蓝牙无线电支持三种电源管理模式,无论无线电连接到哪个总线。 Windows 蓝牙驱动程序拥有这三种模式的定义,并管理进入和退出这些模式的转换。 下表介绍了三种蓝牙无线电电源模式。

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

活动

蓝牙无线电代表操作系统上的应用程序主动与关联设备通信。

D0

因方案和关联设备而异。

空值

空值

睡眠(主要处于空闲状态,具有低速率占空比)

蓝牙无线电处于低功率状态。 系统已与远程蓝牙设备配对,但两者之间没有连接。 也就是说,设备已断开连接。 当新数据从配对设备到达时,蓝牙控制器必须能够生成唤醒信号(如果无线电未集成,则发送到 SoC)。

或者,蓝牙无线电没有关联设备。

或者,蓝牙无线电具有处于空闲状态(未发送/接收任何数据)的活动连接,并且链路处于探查模式。

D2

< 4 毫瓦

< 100 毫瓦

Windows 蓝牙驱动程序使用 D2 电源 IRP 启动 D2 转换。

Windows 蓝牙驱动程序在基础传输总线驱动程序中启动挂起的等待唤醒 IRP。 如果蓝牙设备通过 USB 连接,则此状态等效于选择性挂起。 (蓝牙选择性挂起要求设备在 USB 设备描述符中标记为支持远程唤醒和自供电。)

蓝牙无线电完全关闭(0 瓦)或处于不保留任何无线电状态的低功率状态。 蓝牙无线电无法在此状态下向 SoC 生成唤醒信号。 蓝牙无线电也无法发出或接收任何无线电信号 — 所有 RF 组件都已关闭。

D3

0 瓦

< 2 秒

Windows 蓝牙驱动程序使用 D3 电源 IRP 启动 D3 转换。

传输总线驱动程序或系统 ACPI 固件可能会断开电源或切换 GPIO 线路,以将蓝牙无线电硬件转换为关闭 (D3) 状态。

蓝牙无线电还支持关联模式,在该模式下无线电发送器可以由软件关闭,以响应用户的请求。 为蓝牙设备启用无线电后,此设备会处于活动 (D0) 或睡眠 (D2) 状态。 当用户禁用蓝牙设备的无线电时,Windows 会意外删除协议驱动程序及其子级,然后将无线电设备堆栈转换为关闭 (D3) 状态,从而停止蓝牙活动。

软件电源管理机制

蓝牙无线电设备的电源管理由设备 Dx 状态转换进行驱动,而这些转换由 BthPort 作为电源策略所有者 (PPO) 进行启动。 PPO 确定设备在活动 (D0)、睡眠 (D2) 与关闭 (D3) 状态之间何时进行转换。

当无线电没有任何关联设备时,Windows 会将设备转换为 D2,并使它保持该状态,直到用户开始配对过程。 当无线电与一个或多个设备关联时,Windows 蓝牙驱动程序会使用空闲超时确定何时将蓝牙无线电从 D0 转换为 D2。 此算法使用操作系统和应用程序的蓝牙使用模式来确定何时将无线电转换为 D2 状态。 例如,如果蓝牙无线电上没有其他活动,则在蓝牙键盘上最后一次按键几秒钟后,无线电会转换为 D2。

Windows 蓝牙驱动程序会将设备转换为 D0 以响应以下任何操作:

  • 用户开始配对过程。
  • 应用程序请求使用蓝牙功能。
  • 蓝牙无线电已基于来自关联设备的输入生成了唤醒请求。

与其他设备不同,蓝牙无线电在新式待机期间(系统显示关闭)遵循与系统正常运行且显示打开时相同的电源管理模式。 这是因为在新式待机期间的任何时候,当从关联设备收到输入时,蓝牙无线电应可用于唤醒 SoC。 例如,如果用户将蓝牙键盘与 Windows 计算机关联,则按键盘上的任何键都应将计算机从新式待机状态唤醒并打开显示。

如果没有设备与无线电关联,则无线电应配置为在处于睡眠 (D2) 状态时,功耗小于 1 毫瓦。

当蓝牙无线电处于关闭 (D3) 状态时,其功耗应几乎为 0 瓦。

驱动程序实现说明

如果蓝牙无线电通过 UART 连接或集成到 SoC 本身,则蓝牙设备供应商需要实现并提供传输总线驱动程序。 传输总线驱动程序负责完成以下工作:

  • 将蓝牙 HCI 数据包请求从 Windows 蓝牙驱动程序 (Bthmini.sys) 转换为通过传输总线发送到蓝牙无线电的命令。
  • 将蓝牙无线电设备转换为映射到活动 (D0)、睡眠 (D2) 和关闭 (D3) 设备电源状态的各种电源管理模式。 驱动程序还实现处理电源管理事件的例程。
  • 配置蓝牙无线电以在设备生成输入时唤醒 SoC,以及将任何可选 GPIO 线路的状态从 SoC 更改为用于电源管理的蓝牙无线电。
  • 对与蓝牙无线电共享相同总线的其他设备(例如 FM 发送器或 GPS 设备)进行枚举和电源管理。 如果其他设备以物理方式连接到共享总线,但不向操作系统公开,则传输总线驱动程序必须完全关闭这些设备。

有关实现传输总线驱动程序的详细信息,请参阅《用于蓝牙功率控制处理的传输总线驱动程序指南》。 传输总线驱动程序必须使用 Windows 驱动程序框架 (WDF) 编写。 蓝牙串行 HCI 总线驱动程序中提供了示例驱动程序。

若要启用蓝牙无线电电源管理,传输总线驱动程序必须执行以下操作:

  • 启用对运行时空闲电源管理的支持,并公开对活动 (D0)、睡眠 (D2) 和关闭 (D3) 设备电源状态的支持。
  • 向 Windows 蓝牙驱动程序指示蓝牙无线电设备能够发出从 D2 状态唤醒的事件信号。
  • 支持通过蓝牙无线电设备来唤醒 SoC,以及解除蓝牙设备向 SoC 发送的唤醒信号。 此支持可能需要处理一个或多个 GPIO 中断并在 WDF 中执行唤醒方法。
  • 当设备在活动 (D0)、睡眠 (D2) 和关闭 (D3) 状态之间转换时,将任何可选 GPIO 线路的状态从 SoC 更改为蓝牙无线电设备。

如果蓝牙无线电集成到 SoC 本身,则传输总线驱动程序可以注册到 Windows 电源管理框架,以将蓝牙无线电电源状态传达给特定于 SoC 的电源引擎插件 (PEP)。 这通过将 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构的 IdleTimeoutType 成员设置为值 SystemManagedIdleTimeout 来完成。

如果蓝牙无线电通过 USB 连接,则必须使用内置 Windows USB 蓝牙驱动程序堆栈。 该堆栈会处理所有电源管理操作。

无线电管理

蓝牙无线电发送器的状态直接与设备电源状态关联。 当无线电处于活动 (D0) 或睡眠 (D2) 电源状态时,无线电发送器应打开。 当无线电转换为关闭 (D3) 状态时,无线电发送器必须关闭。

当用户关闭蓝牙无线电时,Windows 会取消挂起的 I/O 操作并卸载协议驱动程序及其子项,从而终止蓝牙活动。 Windows 蓝牙驱动程序堆栈随后会向控制器发出 HCI_Reset 命令,以将无线电重置为默认状态。 在默认状态下,控制器无法传输或接收任何无线电信号。 最后,控制器会转换为关闭 (D3) 状态。

为了响应到关闭 (D3) 的转换,传输总线驱动程序必须使用特定于设备的方法将蓝牙设备关闭到最低功率状态。 典型实现是将 GPIO 线路的状态从 SoC 更改为蓝牙无线电,以禁用蓝牙模块的电源。 另一种实现是要求 ACPI 固件使用 _PS0 和 _PS3 控制方法从蓝牙模块断开电源。

当用户打开蓝牙无线电时,Windows 会将无线电转换为活动 (D0) 状态,重新初始化无线电,然后重新枚举子协议驱动程序。 当无线电转换为活动 (D0) 时,必须在蓝牙无线电的正常 D0 序列中切换所有所需的 GPIO 线路。 如果使用 ACPI 固件关闭无线电电源,则必须使用 _PS0 方法还原电源。

作为此正常序列的一部分,传输总线驱动程序必须通过将蓝牙无线电的 ContainerId 设置为特定 GUID 值 {00000000-0000-000-ffff-ffffffffffff},来将设备标记为内部连接设备。 这使 Windows 无线电用户界面元素可以检测到传输总线驱动程序公开的蓝牙无线电在计算机内部,而不是外部连接的无线电(无线电控制不适合于这类无线电)。

支持的硬件电源配置

蓝牙无线电的电源管理硬件蓝牙取决于通信总线。 一般而言,所有蓝牙无线电都应具有以下共同的硬件电源管理功能:

  • 支持关闭 (D3) 状态作为一种关闭无线电以响应用户请求的方式。 关闭无线电会将蓝牙无线电置于几乎为 0 瓦的低功率状态。
  • 一种用于进入低功率睡眠 (D2) 状态(在该状态下会保持与关联设备的连接,但没有活动传输)的机制。
  • 一种用于在关联设备具有 SoC 的数据且 SoC 处于低功率状态(在该状态下,蓝牙无线电设备连接到的总线当前未处于活动状态)时生成唤醒中断的机制。

蓝牙无线电设备支持的每种总线(USB、UART 以及到 SoC 的集成)都支持上面列表中的所有三种基本硬件电源管理功能。 此外,每个蓝牙无线电都可以具有特定于供应商或特定于设备的电源管理功能,但这些功能超出了本主题的范围。

我们鼓励蓝牙无线电供应商采用硬件自主并且不需要在 Windows 系统中使用供应商提供的附加驱动程序软件的方式来实现增值电源管理功能。 还鼓励蓝牙无线电供应商采用将特定于平台的差异抽象到系统 ACPI 固件中(而不是抽象到设备驱动程序代码或驱动程序 .inf 文件中)的方式来实现其驱动程序及其电源管理软件。 此方法允许在其他平台重复使用蓝牙设备的一个驱动程序包,而无需更新驱动程序源、二进制文件或签名安装包。

通过 SoC 外部的 UART 连接的蓝牙无线电

如果蓝牙无线电通过 UART 连接,并且实际位于 SoC 外部,则蓝牙无线电供应商必须提供公开通过 UART 共享相同通信路径的蓝牙无线电和任何其他设备功能(例如,FM 无线电)的传输总线驱动程序。 总线驱动程序还负责管理控制蓝牙无线电功耗和唤醒功能的任何 GPIO 资源。

与其他设备类不同,控制蓝牙电源和唤醒的 GPIO 线路由传输总线驱动程序直接管理,而不是由 ACPI 控制方法进行抽象。 此控制方案是多功能总线驱动程序设计的结果,该设计会枚举共享相同 UART 端口的蓝牙无线电和其他功能。 在此设计中,Windows ACPI 驱动程序 Acpi.sys 不会在蓝牙和 FM 无线电的驱动程序堆栈中加载,从而无法将 ACPI 控制方法执行用作响应设备 Dx 状态转换的方法。

当蓝牙无线电连接到 SoC 上的 UART 端口时,系统集成商必须使用 SoC 上 GPIO 控制器的引脚来控制无线电的电源。 在 ACPI 固件中,必须将此引脚作为 GPIO I/O 资源分配给表示传输总线驱动程序根设备的设备对象。 如果无线电支持通过内部电源门控关闭设备,则 GPIO 引脚可直接连接到蓝牙无线电。

如果蓝牙无线电支持电源门控,则蓝牙无线电的电源可以连接到任何系统电源轨。

如果无线电不支持由 GPIO 引脚控制的内部电源门控,则系统集成商必须将蓝牙无线电置于可切换的电源轨上。 SoC 中的 GPIO 引脚随后会连接到电源切换硬件。 在此设计中,ACPI 控制方法不能用于跟踪引用计数或聚合共享相同电源轨的多个设备的电源状态,因此必须将蓝牙无线电隔离在其自己的可切换电源轨上。

系统集成商必须使用 SoC 上 GPIO 控制器的其他引脚接收来自蓝牙无线电的唤醒中断。 此引脚上的中断必须能够将 SoC 从最低功率状态中唤醒。 在某些 SoC 设计中,此类引脚称为始终打开 GPIO 引脚,因为 GPIO 控制器可以始终检测到此引脚上的中断,而不考虑 SoC 的电源状态。 始终打开功能在硬件上可以限制为 SoC 上的一组特定 GPIO 引脚,也可以在固件中配置。 系统集成商需要与 SoC 供应商一起评审此设计,以确保蓝牙无线电的唤醒中断会使 SoC 退出其最深空闲电源状态,这一点至关重要。 (在现代待机期间,系统始终处于 S0。新式待机系统不支持 S3。)

当传输总线驱动程序枚举的所有功能都已关闭且 ACPI 枚举的传输总线设备进入 D3 时,始终打开 GPIO 引脚可以关闭。 当用户关闭传输总线驱动程序枚举的所有设备功能的无线电时,会发生这种情况。

USB 上的蓝牙无线电

如果蓝牙无线电通过 USB 总线连接到 SoC 或核心芯片,则必须从 USB 总线之外的源为无线电供电。 在 USB 规范中,此类无线电称为自供电,必须在蓝牙设备的 USB 描述符中报告此功能。

同样,USB 设备硬件必须播发对远程唤醒的支持,这是蓝牙无线电生成带内 USB 恢复信号以唤醒 USB 主机控制器的功能。 远程唤醒功能也必须在蓝牙无线电的 USB 描述符中进行播发。

蓝牙无线电必须同时支持自供电和远程唤醒功能,以便它可以进入睡眠 (D2) 状态并启用选择性挂起。

如果蓝牙无线电处于睡眠 (D2) 状态,并且来自关联设备的数据可供主机使用,则蓝牙无线电必须生成远程唤醒恢复信号以唤醒主机。 不支持使用 GPIO 线路发送到核心芯片的带外恢复信号。 蓝牙无线电(包括其 USB 连接线路)在睡眠 (D2) 状态下的功耗应小于 1 毫瓦。

唤醒问题

蓝牙无线电应能够在处于睡眠 (D2) 状态时生成唤醒中断。 唤醒中断必须使 SoC 打开,即使 SoC 处于最低功率状态。 下表总结了两种蓝牙唤醒信号机制。

连接总线 硬件信号路径 注释和说明

UART(具有供应商提供的传输总线驱动程序)

从蓝牙无线电到 SoC 的 GPIO。

无线电必须连接到可以将 SoC 从最低功率状态唤醒的 GPIO 引脚。

USB

带内 USB 可从选择性挂起恢复信号。

不支持带外 GPIO 唤醒。

测试和验证

建议蓝牙设备供应商测试并验证蓝牙无线电设备的电源管理操作。

可以使用 Xperf 工具方便地观察活动 (D0)、睡眠 (D2) 和关闭 (D3) 状态之间的转换,如其他部分所述。

可以使用 Windows 中内置的 ETW 检测来监视蓝牙驱动程序活动。 建议驱动程序开发人员对 Windows 事件跟踪 (ETW) 检测使用来公开驱动程序中的重要电源管理状态更改,并使用 Xperf 工具或内置 Windows 事件查看器来观察这些更改。

如果蓝牙无线电通过 USB 连接,则内置 Powercfg.exe 实用工具可以与 /energy 命令行选项一起用于验证无线电是否进入睡眠 (D2) 状态并挂起。 若要使用 Powercfg.exe 实用工具,请执行以下操作:

  • 以管理员身份打开命令提示符窗口。
  • 更改为驱动器的根目录 (cd \)。
  • 输入命令 powercfg.exe /energy
  • 等待默认的 60 秒时间。
  • Powercfg.exe 实用工具会输出系统中的错误数和警告条件数,如以下屏幕截图所示。
  • 该工具将摘要信息写入命令提示符窗口后,会生成名为 Energy-report.html 的 HTML 文件。 打开该文件,查找 USB 蓝牙设备中的错误或警告条件。 以下示例摘要报告 USB 蓝牙设备在处于空闲状态时未进入睡眠 (D2) 状态。

提供其他第三方蓝牙配置文件驱动程序和应用程序的蓝牙设备供应商必须验证其软件是否支持意外删除,并允许无线电管理基础结构及时地正常关闭蓝牙无线电。 在使用配置文件或应用程序时,应验证这些方案。 例如,对于音频驱动程序,无线电关闭期间应有蓝牙音频流。 随后无线电应重新打开并重新启动音频流,以验证它是否仍然正常工作。

蓝牙电源管理清单

系统集成商、蓝牙无线电供应商和 SoC 供应商应使用以下清单来确保其系统电源管理设计与 Windows 8 和 Windows 8.1 兼容:

  • 确定系统设计中蓝牙无线电的通信总线。 蓝牙无线电通过 UART 或通过 USB 连接。

  • 确保在没有设备关联时,蓝牙无线电支持功耗不到 1 毫瓦的低功率睡眠模式。

    睡眠模式下蓝牙无线电的功耗可能因当前存在的关联设备数而异,但在任何时候一般都不应超过 5 毫瓦。

  • 确保蓝牙无线电支持以下基本的必要电源管理功能:

    • 支持关闭 (D3) 状态作为一种允许用户关闭无线电的方式。
    • 一种用于进入低功率睡眠 (D2) 状态(在该状态下会保持与关联设备的连接,但没有活动传输)的机制。
    • 一种在关联设备生成数据且 SoC 处于低功率状态时用于唤醒 SoC 的机制。
  • 如果蓝牙无线电通过非 USB 总线(UART 或集成到 SoC)连接,则蓝牙无线电供应商必须开发传输总线驱动程序。 传输总线驱动程序必须执行以下操作:

    • 支持《用于蓝牙功率控制处理的传输总线驱动程序指南》中详细介绍的功能和要求。
    • 将蓝牙请求从 Windows 蓝牙驱动程序 (Bthmini.sys) 转换为通过 UART 总线或专有内部 SoC 总线发送到蓝牙无线电的命令。
    • 将蓝牙无线电设备转换为映射到活动 (D0)、睡眠 (D2) 和关闭 (D3) 状态的各种电源管理模式。 驱动程序还必须实现处理设备电源管理 (Dx) IRP 的例程。
    • 配置蓝牙无线电以在设备生成输入时唤醒 SoC,以及更改将 SoC 连接到蓝牙无线电的任何可选 GPIO 线路以用于电源管理。
    • 枚举可能在蓝牙无线电上共享的其他设备(例如 FM 发送器)。
    • 使用 Windows 驱动程序框架 (WDF) 进行驱动程序开发。
    • 基于蓝牙串行 HCI 总线驱动程序来实现。
  • 如果蓝牙无线电通过 USB 连接,则蓝牙无线电供应商必须:

    • 在无线电中启用选择性挂起支持。
    • 确保无线电在 USB 设备描述符中设置远程唤醒和自供电功能。
    • 确保无线电(包括 USB 组件)的功耗小于 1 毫瓦。
  • 无论连接总线如何,蓝牙无线电都必须为内部连接的无线电执行以下操作:

    • 确保所有 RF 组件都关闭,以响应发送到无线电以便准备关闭无线电的 HCI_Reset 命令。 无线电无法传输或接收任何无线电信号。
    • 在设置为关闭 (D3) 状态时进入其最低功率模式。
  • 如果蓝牙无线电通过 UART 连接,则系统集成商必须将唤醒信号从蓝牙无线电连接到 SoC 上的 GPIO 引脚,该引脚可以将 SoC 从最低功率状态唤醒。

    • SoC 可能需要将唤醒信号路由到预配置为始终打开的有限 GPIO 引脚集。
    • 或者,SoC 可以支持启动期间在系统固件中将 GPIO 引脚配置为始终打开的引脚。
  • 系统集成商必须测试并验证蓝牙无线电是否在没有关联设备时进入睡眠 (D2) 状态。

  • 系统集成商必须测试并验证蓝牙无线电是否在所有关联设备都没有任何活动传输时进入睡眠 (D2) 状态。

  • 系统集成商必须测试并验证蓝牙无线电是否在无线电处于睡眠 (D2) 状态时可以将 SoC 从最低功率状态唤醒。

  • 系统集成商必须测试并验证蓝牙无线电是否在睡眠 (D2) 状态期间不生成虚假唤醒信号。

  • 系统集成商必须测试并验证附加的第三方软件(例如配置文件驱动程序和应用程序)是否可正确处理蓝牙无线电管理。 当第三方软件正在使用时(例如在播放音频或传输文件),无线电应关闭并打开。