USB Type-C® 连接器系统软件接口 (UCSI) 驱动程序

Microsoft 为高级配置和电源接口 (ACPI) 传输提供符合 USB Type-C® 连接器系统软件接口 (UCSI) 规范的驱动程序。 如果设计包含具有 ACPI 传输的嵌入式控制器,请在系统的 BIOS/EC 中实现 UCSI 并加载内置 UCSI 驱动程序(UcmUcsiCx.sys 和 UcmUcsiAcpiClient.sys)。

如果符合 UCSI 的硬件使用 ACPI 以外的传输,则需要 编写 UCSI 客户端驱动程序

用于支持嵌入式控制器系统的 USB Type-C 组件的驱动程序

下面是具有嵌入式控制器的系统示例。

USB Type-C 软件组件的 USB Type-C 软件组件示意图。

在前面的示例中,USB 角色切换在系统的固件中进行处理,并且未加载 USB 角色交换机驱动程序堆栈。 在另一个系统中,驱动程序堆栈可能无法加载,因为不支持双重角色。

在上图中,

  • USB 设备端驱动程序

    USB 设备端驱动程序 为函数/设备/外围设备提供服务。 USB 功能控制器类扩展支持 MTP(媒体传输协议),并支持使用 BC 1.2 充电器进行充电。 Microsoft为 Synopsys USB 3.0 和 ChipIdea USB 2.0 控制器提供内置客户端驱动程序。 可以使用 USB 函数控制器客户端驱动程序编程接口为函数控制器编写自定义客户端驱动程序。 有关详细信息,请参阅 为 USB 函数控制器开发 Windows 驱动程序

    SoC 供应商可能会为你提供用于充电器检测的 USB 功能下层过滤驱动程序。 如果使用内置 Synopsys USB 3.0 或 ChipIdea USB 2.0 客户端驱动程序,则可以实现自己的筛选器驱动程序。

  • USB 主机端驱动程序

    USB 主机端驱动程序是一组适用于符合 EHCI 或 XHCI 的 USB 主机控制器的驱动程序。 如果角色切换驱动程序枚举主机角色,驱动程序将被加载。 如果主机控制器不符合规范,则可以使用 USB 主机控制器扩展(UCX)编程接口编写自定义驱动程序。 有关信息,请参阅 为 USB 主机控制器开发 Windows 驱动程序

    并非所有 USB 设备类在 Windows 10 移动版上都受支持。

  • USB 连接器管理器

    Microsoft 提供带有 Windows (UcmUcsiCx.sys) 的 UCSI 随机驱动程序,它实现了在 USB Type-C 连接器系统软件接口规范中定义的功能。 该规范介绍了 UCSI 的功能,并说明了硬件组件设计器、系统生成器和设备驱动程序开发人员的寄存器和数据结构。

    此驱动程序适用于具有嵌入式控制器的系统。 此驱动程序是Microsoft提供的 USB 连接器管理器类扩展驱动程序(Ucmcx.sys)的客户端。 驱动程序处理向固件发起请求以更改数据或电源角色以及获取向用户提供故障排除消息所需的信息等任务。

Windows 所需的 UCSI 命令

有关所有 UCSI 实现中所需的命令,请参阅 UCSI 规范。

除了标记为 必需的命令之外,Windows 还需要以下命令:

  • GET_ALTERNATE_MODES
  • GET_CAM_SUPPORTED
  • GET_PDOS
  • SET_NOTIFICATION_ENABLE:系统或控制器必须在SET_NOTIFICATION_ENABLE中支持以下通知:
    • 支持的提供程序功能更改
    • 协商的电源级别更改
  • GET_CONNECTOR_STATUS:系统或控制器必须在GET_CONNECTOR_STATUS内支持这些连接器状态更改:
    • 支持的提供程序功能更改
    • 协商的电源级别更改

有关在 BIOS 中实现 UCSI 所需的任务的信息,请参阅 INTEL BIOS 实现 UCSI

适用于 UCSI 2.0 及更高版本的 UCM-UCSI ACPI 设备

从 Windows 11 版本 22H2 9 月更新开始,Windows UCM-UCSI ACPI 设备驱动程序支持 UCSI 规范版本 2.0 和 2.1。 UCSI 规范 2.0 在 UCSI 规范表 3-1 数据结构中定义的数据结构的内存映射中发生了重大更改。 为了保持向后兼容性,Windows 要求规范版本 2.0 或更高版本的 UCSI PPM 在 ACPI 固件中的 UCM-UCSI ACPI 设备 下实现以下_DSM函数,并返回非零值,以指示 UCSI OPM 应遵循报告的 UCSI 规范版本。

  • Arg0:UUID = 6F8398C2-7CA4-11E4-AD36-631042B5008F
  • Arg1:修订 ID = 0
  • Arg2:函数索引 = 5
  • Arg3:空包(未使用)

返回值:

元素 对象类型 描述
UsePpmReportedUcsiVersion 整数(32 位) 0x00000000(默认值):如果 UCSI 规范表 3-1 数据结构中定义的 VERSION 结构 值为 2.0 或更高版本,UCSI OPM 仍遵循 UCSI 规范 1.2。 否则,UCSI OPM 将根据 VERSION 结构中的值遵循 UCSI 规范。

注意

对于 UCM-UCSI ACPI 设备,这是现有 _DSM 方法中的新函数。 此 _DSM 方法的其他功能应按照 UCSI 的 Intel BIOS 实现文档来实现。 函数 0(返回所有受支持函数的位掩码)也应相应地更新。

UCSI 的示例流

本节中提供的示例介绍 USB Type-C 硬件/固件、UCSI 驱动程序和操作系统之间的交互。

DRP 角色检测

  1. USB 类型 C 硬件/固件检测到设备附加事件,Windows 10 系统 DRP 系统最初成为 UFP 角色。
    1. 固件发送通知,指示连接器发生了更改。
    2. UCSI 驱动程序发送GET_CONNECTOR_STATUS请求。
    3. 固件响应其连接状态为1,连接器伙伴类型为DFP。 ​
  2. USB 函数堆栈中的驱动程序对枚举做出响应。
  3. USB 连接器管理器类扩展可识别已加载 USB 函数堆栈,因此系统处于错误状态。 它通知 UCSI 驱动程序向固件发送设置 USB 操作角色设置电源方向角色请求。
  4. USB 类型 C 硬件/固件用 DFP 启动角色交换操作。

检测充电器不匹配错误情况

  1. USB Type-C 硬件/固件检测到充电器已连接,并协商默认电源协议。 它还观察到充电器没有为系统提供足够的电源。

  2. USB 类型 C 硬件/固件设置了缓慢充电速度。

    1. 固件发送通知,指示连接器发生了更改。
    2. UCSI 驱动程序发送GET_CONNECTOR_STATUS请求。
    3. 固件响应:连接状态 = 1,连接器对端类型 = DFP,电池充电状态 = 慢速/涓流。
  3. USB 连接器管理器类扩展向 UI 发送通知,以显示充电器不匹配故障排除消息。

如何测试 UCSI

可通过多种方式测试 UCSI 实现。 若要在 UCSI BIOS/EC 实现中测试各个命令,请使用 UCSIControl.exe,该命令在 MUTT Software Pack中提供。 要测试完整的 UCSI 实现,请使用 Windows Hardware Lab Kit (HLK) 中可找到的 UCSI 测试,以及类型 C 手动互操作过程中的步骤。

UCSIControl.exe

可以使用 UCSIControl.exe在 UCSI BIOS/EC 实现中测试单个命令。 借助此工具,可以通过 UCSI 驱动程序将 UCSI 命令发送到固件。 它要求加载并运行驱动程序,并且还要求启用驱动程序的测试接口。 默认情况下,此接口未启用,以防止零售系统上未经授权的用户访问该接口。

  1. 在名为 UCSI USB 连接器管理器的 Device Manager(devmgmt.msc)中找到设备节点。 该节点位于 通用串行总线控制器 类别下。

  2. 在设备上选择并按住(或右键单击),然后选择 属性,然后打开 详细信息 选项卡。

  3. 从下拉列表中选择 设备实例路径 并记下属性值。

  4. 打开注册表编辑器(regedit.exe)。

  5. 导航到此密钥下的设备实例路径。

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\<设备实例路径>\设备参数

  6. 创建名为 TestInterfaceEnabled 的 DWORD 值 并将该值设置为0x1。

  7. 通过在设备管理器中的设备节点上选择 “禁用”选项,然后选择 启用来重启设备。 或者,可以重启电脑。

可以通过运行 UcsiControl.exe /?查看帮助。

下面是常见命令:

UCSI command UcsiControl.exe 命令
PPM 重置 UcsiControl.exe Send 0 1
Connector Reset 软重置:UcsiControl.exe 发送 0 10003

硬重置:UcsiControl.exe 发送 0 810003
设置启用通知功能 所有通知:UcsiControl.exe 发送 0 ffff0005

仅命令完成:UcsiControl.exe 发送 0 00010005

无通知:UcsiControl.exe 发送 0 00000005
Get Capability UcsiControl.exe Send 0 6
Get Connector Capability UcsiControl.exe Send 0 10007
设置 UOM DFP:UcsiControl.exe Send 0 810008

UFP:UcsiControl.exe Send 0 1010008

DRP:UcsiControl.exe Send 0 2010008
设置 UOR DFP:UcsiControl.exe Send 0 810009

UFP:UcsiControl.exe 发送 0 1010009

接受:UcsiControl.exe 发送 0 2010009
设置 PDR 提供程序:UcsiControl.exe 发送 0 81000B

使用者:UcsiControl.exe 发送 0 101000B

接受:UcsiControl.exe 发送 0 201000B
Get PDOs 本地源:UcsiControl.exe 发送 7 00010010

本地接收器:UcsiControl.exe 发送 3 00010010

远程源:UcsiControl.exe 发送 7 00810010

远程接收器:UcsiControl.exe 发送 3 00810010
获取连接器状态 UcsiControl.exe Send 0 010012
获取错误状态 UcsiControl.exe Send 0 13