如果 USB Type-C 系统未实现 PD 状态机,或者它实现了状态机,但不支持通过非 ACPI 传输 UCSI,则需要为连接器编写驱动程序。 如果存在,可以加载 Microsoft 提供的 UCSI 驱动程序。
建议的解决方案
下表建议基于硬件或固件功能的解决方案:
体系结构:Windows 系统的 USB Type C 设计
USB Type C 系统的典型硬件设计以及支持硬件组件的 Microsoft 提供的驱动程序。 这部分适用于使用 USB Type C 连接器开发系统的 OEM。
- 使用 USB Type-C 的 USB 双角色功能
- 使用 USB Type-C 电流级别和供电 2.0 加快充电速度
- 使用备用模式和有线停靠体验 Display-Out 功能。
用于支持 USB Type C 组件的驱动程序
在上图中的部分讲解如下:
USB 设备端驱动程序
USB 设备端驱动程序为功能/设备/外设提供服务。 USB 功能控制器类扩展支持 MTP(媒体传输协议),并使用 BC 1.2 充电器进行充电。 Microsoft 为 Synopsys USB 3.0 和 ChipIdea USB 2.0 控制器提供随机客户端驱动程序。 可以通过使用 USB 功能控制器客户端驱动程序编程接口,为功能控制器编写自定义客户端驱动程序。
SoC 供应商可能会为你提供 USB 功能下限筛选器驱动程序,用于旧版专有充电器检测。 如果功能控制器是 Synopsys USB 3.0 或 ChipIdea USB 2.0 控制器,则可以实现自己的筛选器驱动程序
USB 主机端驱动程序
USB 主机端驱动程序是适用于与 EHCI 或 XHCI 兼容的 USB 主机控制器的一组驱动程序。 如果角色切换驱动程序枚举主机角色,则会加载驱动程序。 如果主机控制器不符合规范,则可以使用 USB 主机控制器扩展 (UCX) 编程接口来写入自定义驱动程序。并非所有 USB 设备类在 Windows 10 移动版上都受支持。
USB 角色切换驱动程序 (URS)
可以将系统设计为双角色 USB 端口需要 Windows 将其配置为主机或功能模式。 这些设计需要使用 USB 角色开关 (URS) 驱动程序堆栈。
URS 驱动程序根据平台中的硬件事件管理连接器、主机或功能的当前角色,以及相应设备端或主机端驱动程序的加载和卸载。 Microsoft 为 Synopsys USB 3.0 和 ChipIdea USB 2.0 控制器提供随机客户端驱动程序。 可以使用 USB 双角色控制器驱动程序编程接口编写角色切换客户端驱动程序。 若要激活角色切换驱动程序,必须对 ACPI 表进行更改。
在具有 USB micro-AB 连接器的系统上,根据连接器中的 ID 引脚做出此决定。 客户端驱动程序使用分配给它的中断资源执行 ID 引脚检测。
在具有 USB Type C 连接器的系统上,根据 CC 引脚做出决策。 连接器的客户端驱动程序执行 CC 检测,并将该信息转发到角色切换驱动程序。
USB 连接器管理器 (UCM)
这组驱动程序管理 USB Type-C 连接器的所有方面。 如果系统通过 ACPI 实现符合 UCSI 标准的嵌入式控制器,请使用 Microsoft 提供的 UCSI 驱动程序。 否则,为非 ACPI 传输 编写 UCSI 客户端驱动程序 。
如果硬件不符合 UCSI,则应将作为客户端的 USB Type C 连接器驱动程序写入 UCM 类扩展。 它们共同管理 USB Type-C 连接器和连接器驱动程序的预期行为。
如果要编写驱动程序,USB 连接器管理器类扩展遵循 WDF 类扩展-客户端驱动程序模型。 客户端驱动程序与硬件和类扩展通信,以处理 CC 检测、PD 消息传送、复用和 VBus/VConn 控制等任务,并为电源传输和备用模式选择策略。 类扩展将客户端驱动程序报告的信息传达给操作系统。 例如,CC 检测结果用于配置角色切换驱动程序;USB Type C PD 电源信息用于确定系统应充电的级别。 客户端驱动程序管理 USB Type C 和 PD 状态机。 客户端驱动程序可以将某些任务委托给其他驱动程序,例如,Mux 可能由另一个驱动程序控制。 若要编写客户端驱动程序,请使用 USB Type-C 连接器驱动程序编程接口。
USB Type C 端口控制器
Type-C 端口控制器接口类扩展 (UcmTcpciCx.sys) 是 Microsoft 提供的 USB 连接器管理器的扩展,它允许 OS 与不实现 PD 状态机的连接器 (TCPM) 一样运行。 UcmTcpciCx 客户端驱动程序允许软件 TCPM 控制硬件并实时获取其状态。
仲裁驱动
此驱动程序由 Microsoft 提供,用于Windows 10 移动版。 驱动程序充当多个充电源的仲裁程序。 USB 连接器管理器将 USB Type-C 和 PD 充电源信息报告给 CAD,CAD 会从该信息和由 USB 设备端驱动程序执行的 BC1.2 充电器检测中进行选择(如果适用)。 然后,CAD 报告最适合用于电池子系统的充电源。
电池驱动程序
类驱动程序定义系统中电池的整体功能,并与电源管理器进行交互。 微型类驱动程序处理特定于设备的功能,例如添加和移除电池,以及跟踪其容量和充电。 微类驱动程序导出类驱动程序调用的例程,以获取有关其控制的设备的信息。
在 USB Type C Windows 系统上启动功能控制器
功能控制器的驱动程序通知操作系统其 USB Type-C 连接器支持的充电级别,并通知电池子系统何时可以开始充电,以及设备可以消耗的最大电流量。
本主题假定函数控制器在任何给定时间管理单个连接器 (UFP) 。
1. 加载 USB 设备端驱动程序
有两个驱动程序用于管理函数控制器的操作。 该对是 Microsoft 提供的 USB 函数类扩展及其客户端驱动程序。 类扩展将客户端驱动程序发送到操作系统的信息报告。 客户端驱动程序使用硬件接口与硬件通信。
- 如果系统使用 ChipIdea 和 Synopsys 控制器。
- 为 ChipIdea 和 Synopsys 控制器加载 Microsoft 提供的内置客户端驱动程序。
- 编写一个较低的筛选器驱动程序,该驱动程序在连接充电器时获取附加/分离事件。 驱动程序确定充电器的类型和配置属性。 它还可以检测 BC1.2 规范定义的 USB 充电端口。 充电信息将传递给类扩展,以便它可以将其报告给) 的仲裁驱动程序 (CAD.sys。
- 如果系统使用自定义控制器,请编写客户端驱动程序。 BC1.2 检测逻辑在客户端驱动程序中实现。
2.修改系统 ACPI,以向功能控制器驱动程序指示连接器是 USB Type C 连接器
这是通过 ACPI 6.0 规范中定义的 ACPI 方法完成的_UPC (USB Port Capabilities)
使用 ACPI 6.0 中定义的新值来指示正确类型的 USB Type-C 连接器,例如“Type-C USB2”和“Type-C USB2 and SS with switch”。 函数驱动程序将此信息传达给 CAD.sys,以便它使用特定于 USB Type C 的仲裁逻辑来确定适当的充电源。
Device (UFN0)
{
...
Name (_UPC, Package()
{
0x1, // Connectable
0x9, // Type-C USB2 and Type-C USB2 and SS with switch
0x0, // Reserved
0x0 // Reserved
})
Name (_CRS, ResourceTemplate()
{
...
})
...
为 USB Type C Windows 系统启动双角色控制器
USB 角色切换驱动程序 (URS) 是一组 WDF 类扩展及其客户端驱动程序,用于处理双角色控制器的角色切换功能。 如果系统具有双角色控制器,则可以根据连接到系统 USB Type-C 连接器的伙伴端口的设备切换系统角色。 这允许有趣的方案,如有线停靠。
系统可以设计为双角色 USB 控制器需要 Windows 才能将其配置为主机或功能模式。 这些设计使用 USB 角色交换机堆栈。 如果系统不使用 Synopsys 或 ChipIdea 双角色控制器,则需要为系统的双角色控制器编写 USB 角色切换客户端驱动程序。
系统可以设计为双角色 USB 端口需要 Windows 才能将其配置为主机或函数模式。 这些设计使用 USB 角色交换机堆栈。 如果系统不使用 Synopsys 双角色控制器,则需要为系统的双角色控制器编写 USB 角色切换客户端驱动程序。
客户端驱动程序处理硬件事件并将其报告给类扩展。 如果发生角色切换硬件事件,URS 将决定该角色,从而加载该角色的驱动程序。 如果控制器处于主机角色,则加载 USB 主机端驱动程序 ;对于函数角色,将加载 设备端驱动程序 。
在使用 USB micro-AB 连接器的系统上,双角色控制器的客户端驱动程序使用分配给它的中断资源,根据连接器中的 ID 引脚做出决策。 在具有 USB Type-C 连接器的系统上,此决定由连接器的客户端驱动程序做出。 该驱动程序根据 CC 引脚确定角色,并将结果报告给 USB 连接器管理器 (UCM) ,后者然后将结果发送到角色切换驱动程序。
1. 在系统 ACPI 中启用 URS 驱动程序
若要使用 URS,必须进行 ACPI 修改。 将 USB 设备端驱动程序 加载的设备替换为 URS 必须加载的设备。请确保删除中断资源。 USB Type-C 不需要这样做。
2. 为双角色控制器驱动程序加载 USB 角色切换驱动程序
- 如果系统使用 ChipIdea 和 Synopsys 控制器,请加载 Microsoft 为 ChipIdea 和 Synopsys 控制器提供的内置客户端驱动程序。
若要加载驱动程序,必须创建驱动程序安装包。 INF 文件必须具有 Include-Needs 指令,该指令引用受支持控制器的内置 INF。 内置 INF 已包含其他控制器的硬件 ID。 如果双角色控制器的硬件 ID 不是内置 INF 中的硬件 ID 之一,则此步骤是必需的。 请与 SoC 供应商联系确认具体事宜。
- 如果系统使用自定义控制器,请编写角色切换客户端驱动程序。