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

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

如果与 UCSI 兼容的硬件使用的是非 ACPI 传输,则需要写入 UCSI 客户端驱动程序

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

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

USB 类型 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 驱动程序

    Windows 10 移动版不支持所有 USB 设备类

  • 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 所需的任务的信息,请参阅 UCSI 的 Intel BIOS 实现

适用于 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 (默认) :如果 VERSION 结构(如 UCSI 规范表 3-1 数据结构中定义)的值为 2.0 或更大,则 UCSI OPM 仍遵循 UCSI 规范 1.2。 否则,UCSI OPM 会根据 结构中的 VERSION 值遵循 UCSI 规范。

注意

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

UCSI 的示例流

本部分中给出的示例描述了 USB 类型 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 Type-C 硬件/固件使用 DFP 启动角色交换操作。

检测充电器不匹配错误条件

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

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

    1. 该固件发送指示连接器中的更改的通知。
    2. UCSI 驱动程序发送GET_CONNECTOR_STATUS请求。
    3. 固件响应的连接状态 = 1,连接器合作伙伴类型=DFP,电池充电状态 = 慢/滴答。
  3. USB 连接器管理器类扩展向 UI 发送通知,以显示充电器不匹配故障排除消息。

如何测试 UCSI

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

UCSIControl.exe

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

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

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

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

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

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

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Enum\<device-instance-path>\Device Parameters

  6. 创建一个名为“TestInterfaceEnabled” 的 DWORD 值,并将该值设置为 0x1。

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

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

下面是常用命令:

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

硬重置:UcsiControl.exe Send 0 810003
Set Notification Enable 所有通知:UcsiControl.exe Send 0 ffff0005

仅命令完成:UcsiControl.exe Send 0 00010005

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

UFP: UcsiControl.exe 发送 0 1010008

DRP: UcsiControl.exe 发送 0 2010008
Set UOR DFP: UcsiControl.exe 发送 0 810009

UFP: UcsiControl.exe 发送 0 1010009

接受: UcsiControl.exe 发送 0 2010009
Set 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
Get Connector Status UcsiControl.exe Send 0 010012
Get Error Status UcsiControl.exe Send 0 13