传统的 USB 连接使用两端都有 USB A 和 USB B 接头的电缆。 USB A 连接器始终插入主机端,USB B 连接器连接功能端,该功能端是手机) 或外设 (鼠标、键盘) 的设备 (。 使用这些连接器,只能将主机连接到函数;绝不是另一个主机的主机或另一个函数的函数。 主机是电源提供程序,函数消耗主机的电源。
传统配置会限制某些方案。 例如,如果移动设备想要连接到外围设备,则设备必须充当主机,并为连接的设备供电。
USB 3.1 规范中定义的 USB-IF 引入的 USB Type-C 连接器解决了这些限制。 Windows 10引入了对这些功能的本机支持。
硬件设计
USB Type C 连接器是可逆且对称的。
main组件是:USB Type-C 连接器及其端口或 PD 控制器,用于管理连接器的 CC 引脚逻辑。 此类系统通常具有双角色控制器,该控制器可将 USB 角色从主机交换为功能。 它具有 Display-Out 模块,允许通过 USB 传输视频信号。 (可选)它可以支持 BC1.2 充电器检测。
选择驱动程序模型
使用此流程图确定 USB Type C系统的解决方案。
启动驱动程序
- 仅当支持 USB 功能模式时,才需要启动 USB 函数驱动程序。 如果以前为 USB micro-B 连接器实现了 USB 函数驱动程序,请在 ACPI 表中将相应的连接器描述为 USB Type-C,以便 USB 函数驱动程序继续工作。
- 只有具有同时具有主机和功能角色的双角色控制器的设备才需要 USB Role-Switch 驱动程序启动。 若要启动 USB Role-Switch 驱动程序,需要修改 ACPI 表以启用 Microsoft 内置 USB 角色切换驱动程序。
- Windows 需要使用 USB 连接器管理器驱动程序来管理系统上的 USB Type C 端口。 USB 连接器管理器驱动程序的启动任务取决于为 USB Type C 端口选择的驱动程序:Microsoft 内置 UCSI (UcmUcsiCx.sys 和 UcmUcsiAcpiClient.sys) 驱动程序、UcmCx 客户端驱动程序或 UcmTcpciCx 客户端驱动程序。
测试
对公开 USB Type-C 连接器的系统和设备执行各种功能和压力测试。
- 使用 USB Type-C ConnEx 测试 USB Type C 系统:运行 Windows Hardware Lab Kit (HLK) 中包含的 USB 测试。
- 使用 C-to-A 电缆运行 USB 函数 HLK 测试:在 HLK 中搜索 Windows USB 设备 。
- 认证和合规性:参加由标准机构主办的电源交付和 USB Type C 合规性研讨会。
硬件设计:USB Type C 系统
典型的 USB Type-C 系统具有以下组件:
- USB Dual-Role 控制器 能够以主机角色或功能/设备/外设角色运行。 此组件已集成到 SoC 中。
- 电池充电 1.2 检测 可能集成到某些 SoC 中。 某些 SoC 供应商提供实现检测逻辑的 PMIC 模块,其他供应商在软件中实现。 Windows 10 移动版支持所有这些选项。 请联系 SoC 供应商以获取有关此组件的详细信息。
- Type-C -PD 端口控制器 管理 USB Type-C 连接器上的 CC 引脚。 支持电源传送消息的 BMC 编码/解码。 此组件未集成到大多数 SoC 中。
- 复用功能 根据 Type-C 端口控制器检测到的方向,将超高速 USB 与控制器上的端口配对。 进入备用模式时,其他位置 (通常显示模块) 多路复用超速对和可能的 SBU 线。
- 需要 VBus/VConn 源。 大多数 PMIC 实现 VBus/VConn 控制。
使用嵌入式控制器进行 USB Type-C 系统设计
除了上述列表中的组件外,USB Type-C 系统还可以具有嵌入式控制器。 此智能微控制器充当系统的 Type-C 和 Power Delivery 策略管理器。
下面是具有嵌入式控制器的 USB Type-C 系统的示例:
下面是另一个视图:
对于具有嵌入式控制器的系统,请加载 Microsoft 提供的内置驱动程序。 UcmUcsi.sys 实现 USB Type-C 连接器系统软件接口 (UCSI) 规范。
USB Type-C 系统设计
下面是没有嵌入式控制器的移动设备的 USB Type-C 系统示例:
下面是另一个视图:
对于前面的设计,实现一个与连接器通信的驱动程序,并使操作系统了解连接器上的 USB Type C 事件。
USB Type C 系统的 OEM 任务
下表描述了 Windows 支持的用例,而 OEM 必须执行的其他任务才能使这些用例正常工作。
Windows 中的 USB Type C 慢充电通知要求
随着 USB Type-C 的采用,用户可以使用欠佳的电源为其系统充电。 下面介绍当用户插入 USB Type C电源导致电源交付合同欠佳时,硬件和固件供应商如何使用 Windows 通知。
USB Type 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 type C 连接器的收件箱。 建议使用此解决方案,因为它使用 Windows 提供的驱动程序,并且不依赖于 OEM 或 IHV 开发自己的驱动程序。
- UcmCx 客户端驱动程序 ,适用于已在硬件或固件中实现了 PD 状态机且不符合 UCSI 的计算机。
支持 UCSI 的计算机
支持 UCSI 的计算机通常具有嵌入式控制器,其中包含用于管理 PD 状态机的平台策略管理器 (PPM) 固件。 此管理对 OS 策略管理器 (OPM) 是透明的,OPM) 是收件箱 UCSI 驱动程序实现的 OS 中的一个实体。 PPM 使用 UCSI 规范 提供的交互机制来与 OPM 交互。
以下是 PPM 可以通知 OPM 充电速度缓慢的机制。 仅当连接器的电源角色是电源使用者时,才会向 Windows 报告缓慢充电。
1.从 PPM 到 OPM 的通知,其中连接器更改指示器 (CCI) 设置为慢速充电通知的连接器编号。 为了响应此通知,OPM 向 PPM 发送GET_CONNECTOR_STATUS UCSI 命令。 PMM 应通过设置以下位GET_CONNECTOR_STATUS数据来响应此命令。
a.连接器状态更改 (16-0) 电池充电状态更改位设置为 1。
b.电池充电功能状态 (65-64) 设置为 未 充电 (值 0) ,慢充电速率 (值 2) 或极慢充电速率 (值 3) 。
2.如果在关闭计算机或 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 Type C MUTT 作为端口伙伴的 UCSI 符合性测试来验证其从 PPM 到 OPM 的电池充电通知是否按预期工作:
- UcsiTest::TestBatteryChargingNotification
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