蓝牙无线电重置和恢复是 Windows 10 版本 1803 及更高版本中的一种技术,为蓝牙无线电引入了可靠的重置和恢复机制。 此机制使蓝牙无线电能够从导致故障、连接中断或对操作命令无响应的硬件故障中恢复。 目标是自动恢复无线电,使用户体验无缝,并降低需要系统重启的可能性。
蓝牙无线电重置和恢复可以使用或不具有固件依赖项来实现。 硬件合作伙伴可以扩展所有支持设备或固件级重置机制的 Windows 电脑上可用的基于软件的重置机制,以提高成功恢复的可能性。
蓝牙重置和恢复方案
启动重置和恢复时,有三大类问题:
-
总线枚举失败:基础总线(通常为 USB 或 UART)的无线电失败枚举或重新枚举,如设备管理器中可见故障状态(黄色)指示,这可能是基础硬件错误的症状。
-
驱动程序枚举失败:由底层总线成功枚举后,蓝牙无线电处于失败状态。 为无线电构建驱动程序堆栈时,通常会发生此失败状态。 例如,在蓝牙无线电设备节点上安装筛选器或函数驱动程序时。 如果驱动程序在一个或多个启动操作期间遇到错误,并因此报告 PnP 失败,则可能出现失败。 此类操作的示例可能是固件下载到设备。
-
非枚举失败: 设备未处于失败状态,但未按驱动程序堆栈确定的方式运行。 这些故障不在枚举路径之外,可能是一般的关键传输特定故障或特定于设备的故障,例如灾难性固件错误。 在这些情况下,使用以下蓝牙重置和恢复机制。
重置和恢复机制
尽管有不同方法可从失败状态恢复,但蓝牙使用基于 ACPI 的标准化恢复机制尝试将无线电还原到正常工作状态。
GUID_DEVICE_RESET_INTERFACE_STANDARD 定义了两个重置级别。 重置机制仅适用于 内部设备 ,因此不支持外部可插入蓝牙无线电(如保护板)。 重置机制需要 Windows(通常是由功能驱动程序堆栈)和基础固件(通常在 ACPI BIOS 中)支持才能实际执行重置。 实际重置机制因系统而异。
- 功能级设备重置 (FLDR):重置操作仅限于特定设备,对其他设备不可见。 没有重新枚举。 功能驱动程序必须假定硬件在操作后返回到其原始状态。 不会保留中间状态;
- 平台级设备重置 (PLDR):重置操作会影响特定设备,以及通过同一电源轨或重置线路连接到此设备的其他所有设备。 重置操作会导致设备被报告为总线中缺少并重新枚举。 这种类型的重置对系统的影响最大,因为共享资源的所有设备都会返回到其原始状态;
若要支持 FLDR,必须在设备范围内定义 __RST 方法,如 ACPI 固件:函数级重置中详述。
若要支持 PLDR,必须在设备范围下定义 __RST 或 __PR3 方法,如 ACPI 固件:平台级重置中详述。 如果使用 PR3 方法,ACPI 将使用 D3Cold 电源周期机制重置。D3Cold 电源周期机制模拟从设备中删除电源,然后还原它。如果任何其他设备共享相同的电源轨,它们也会重置。如果an__RST方法由 _PRR (PowerResource)定义和引用,则使用该 PowerResource 的所有设备都会受到影响。
由于 PLDR 仅适用于内部设备,因此必须在 ACPI 中声明它。 对于 USB 设备,若要指定可以连接到集成设备的内部端口(对用户不可见),请将 UPC.PortIsConnectable 字节设为 0xFF,将 e__PLD.UserVisible 位设为 0。
如果将 _PR3 (D3Cold) 机制用于 PLDR,请确保 SystemWake 和 DeviceWake 等场景继续正常工作。 从名义上说,这意味着为 D2(例如 _PR2)定义了适当的电源资源。 下表可作为实用的指南:
电源状态 | ACPI 资源 | 行为 |
---|---|---|
D2 | _PR2 | 此状态的类定义缩减功能所需的任何电源或时钟。 |
D3 热 (必需) | _PR2 | 与支持的下一个更高状态相同的资源(D2、D1 或 D0)。 |
D3Cold | _PR3 | 设备只需电源或时钟即可显示在其总线上,并响应特定于总线的命令。 |