随着 USB Type-C 的采用,用户可以使用欠佳的电源为其系统充电。 本文介绍当用户插入 USB 类型 C 电源导致电源交付合同欠佳时,硬件和固件供应商如何使用 Windows 通知。
USB 类型 C 充电
为了为用户提供一致的体验,Microsoft 定义了系统认证要求 USBTypeCCharging。 该要求规定,如果具有电池的系统包含可用于为系统充电的 USB Type-C 端口,则除了 USB Type-C 和电源传输 (PD) 规格外,这些端口还必须满足以下要求:
- 系统必须能够使用为系统提供足够电源的 USB Type-C 充电器从死电池充电。
- 系统上的所有 USB Type-C 端口都必须支持为系统充电。
- 系统上的所有 USB Type-C 端口必须支持 15 瓦的寻源。
- 系统必须允许从为系统提供足够电源的任何符合 PD 标准的充电器充电。
- 系统和软件必须对所有符合 PD 的电源 (处理,例如充电器、集线器、扩展坞) ,而不考虑制造商。
- 所有 USB Type-C 充电通知都必须依赖于内置 Windows 通知,而不是由第三方软件提供。
当用户插入充电器或充电扩展坞时,Windows 可以通知用户,该充电器或充电扩展坞协商的电源合同低于计算机的最佳充电要求。 此功能在所有具有 USB Type-C 连接器的计算机中都存在,这些连接器由以下类型的 UcmCx 驱动程序管理:
- 在支持 UCSI 的计算机上,UCM-UCSI ACPI 客户端驱动程序管理 USB 类型 C 连接器的收件箱。 建议使用此解决方案,因为它使用 Windows 提供的驱动程序,并且不依赖于 OEM 或 IHV 开发自己的驱动程序。
- UcmCx 客户端驱动程序 ,适用于已在硬件或固件中实现了 PD 状态机且不符合 UCSI 的计算机。
支持 UCSI 的计算机
支持 UCSI 的计算机通常具有嵌入式控制器,其中包含用于管理 PD 状态机的平台策略管理器 (PPM) 固件。 此管理对 OS 策略管理器 (OPM) 是透明的,OPM) 是收件箱 UCSI 驱动程序实现的 OS 中的一个实体。 PPM 使用 UCSI 规范 提供的交互机制来与 OPM 交互。
以下是 PPM 可以通知 OPM 充电速度缓慢的机制。 仅当连接器的电源角色是电源使用者时,才会向 Windows 报告缓慢充电。
从 PPM 到 OPM 的通知,其中连接器更改指示器 (CCI) 设置为慢速充电通知的连接器编号。 为了响应此通知,OPM 向 PPM 发送GET_CONNECTOR_STATUS UCSI 命令。 PMM 应通过设置以下位GET_CONNECTOR_STATUS数据来响应此命令。
- 连接器状态更改 (16-0) 电池充电状态更改位设置为 1。
- 电池充电功能状态 (65-64) 设置为 未 充电 (值 0) ,慢充电速率 (值 2) 或极慢充电速率 (值 3) 。
如果在关闭计算机或 Sx (x > 0) 时连接了慢速充电器,则当 OPM 在启动或 Sx 恢复后将GET_CONNECTOR_STATUS发送到 PPM 时,PPM 必须将电池充电功能状态设置为反映上述 1b 中提到的三个值之一。 在 Sx 恢复时,OPM 通常会在PPM_RESET后将 GET_CONNECTOR_STATUS 命令发送到 PPM。
相反,如果在计算机处于 Sx (x>0) 时连接了标称充电器,则 OPM 预期GET_CONNECTION_STATUS数据将电池充电能力状态字段 (设置为 65-64) 当 OPM 发送GET_CONNECTOR_STATUS时将标称充电速率 (值为 1) 。
BatteryChargingCapabilityStatus::NotCharging (值 0)
GET_CONNECTOR_STATUS::Batter 充电功能状态的“未充电”值为 0,这也是默认值。 因此,除非连接器状态更改 (16-0) 电池充电状态更改位设置为 1,否则 OPM 无法确定这是默认值,或者 PPM 将此显式设置为 0 以指示未充电。 如果此位设置为 0,则当状态为“未充电”时,OS 可能会忽略电池充电状态。
因此,我们强烈建议 PPM 始终将连接器状态更改设置为 16-0 (16-0) 电池充电状态更改位为 1 时报告充电不慢/非常慢。 此建议是使 PPM 实现变得简单,以便管理充电状态。
慢充电和超慢充电的特殊情况
本部分不包含针对 OEM、IHV 或 UCSI 固件所有者的任何特定建议。 而是介绍收件箱 UCSI 驱动程序围绕充电通知采用的特定逻辑,这些逻辑可能是设计 UCSI 固件时有用的知识。
在合作伙伴附加后的第一个通知中,在获取GET_CONNECTOR_STATUS的响应数据后,即使连接器状态更改 (16-0) 电池充电状态更改位未设置为 1,如果满足以下条件,UCSI 驱动程序也会向 OS 报告充电缓慢:
- 连接器状态更改 (16-0) :ConnectChange 指示这是合作伙伴的第一个附加通知。
- 电池充电功能状态 (62-65) 设置为值 2 或 3。
此行为背后的基本原理是,UCSI 驱动程序不知道不充电是否是有意的,因为它的值为 0,这也是默认值。 但是,可以在不依赖于电池充电状态更改的情况下处理值 2 和 3。 有关更多信息,请参见下一节。
UCSI 合规性测试
由于最佳电源协定特定于计算机,因此 Windows 不提供 Windows 上 慢速 或 未充电 Toast 通知的测试,因为测试现在将知道要验证通知的功率级别。 但是,我们建议 OEM 使用以下使用 USB 类型 C MUTT 作为端口伙伴的 UCSI 符合性测试来验证其从 PPM 到 OPM 的电池充电通知是否按预期工作:
UCMCx 客户端驱动程序
UcmCx 客户端驱动程序管理 USB Type-C 连接器,但不符合 UCSI 规范。 在向 OS 报告有关 USB Type-C 连接器的其他信息时,类扩展会让 OS 了解 USB Type-C 连接器充电级别的更改。 下面是 UmCx DDI 通过客户端驱动程序可能会通知操作系统 连接器UCM_CHARGING_STATE 。
UcmConnectorTypeCAttach:报告附加到 UCM 的新端口伙伴时,客户端可以使用输入参数UCM_CONNECTOR_TYPEC_ATTACH_PARAMS::ChargingState 报告充电级别
UcmConnectorPdConnectionStateChanged:同时向 UCM 报告协商电力合同的 RDO。 客户端可以使用 UCM_CONNECTOR_PD_CONN_STATE_CHANGED_PARAMS::ChargingState 报告充电级别
UcmConnectorChargingStateChanged:客户端驱动程序想要将充电状态更新到 OS 的任何场合。 此 DDI 的 Param2 包含连接器的充电状态。
请考虑枚举 UCM_CHARGING_STATE 的以下值,向用户显示 Toast 通知:
- UcmChargingStateNotCharging
- UcmChargingStateSlowCharging
- UcmChargingStateTrickleCharging