windows USB 设备驱动开发- USB Type-C支持(一)

news2024/9/24 1:16:51

传统的 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 驱动程序管理:

  1. 在支持 UCSI 的计算机上,UCM-UCSI ACPI 客户端驱动程序管理 USB type C 连接器的收件箱。 建议使用此解决方案,因为它使用 Windows 提供的驱动程序,并且不依赖于 OEM 或 IHV 开发自己的驱动程序。
  2. 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 报告充电缓慢:

  1. 连接器状态更改 (16-0) :ConnectChange 指示这是合作伙伴的第一个附加通知。
  2. 电池充电功能状态 (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 。

  1. UcmConnectorTypeCAttach:报告附加到 UCM 的新端口伙伴时,客户端可以使用输入参数UCM_CONNECTOR_TYPEC_ATTACH_PARAMS::ChargingState 报告充电级别
  2. UcmConnectorPdConnectionStateChanged:同时向 UCM 报告协商电力合同的 RDO。 客户端可以使用 UCM_CONNECTOR_PD_CONN_STATE_CHANGED_PARAMS::ChargingState 报告充电级别
  3. UcmConnectorChargingStateChanged:客户端驱动程序想要将充电状态更新到 OS 的任何场合。 此 DDI 的 Param2 包含连接器的充电状态。

请考虑枚举 UCM_CHARGING_STATE 的以下值,向用户显示 Toast 通知:

  • UcmChargingStateNotCharging
  • UcmChargingStateSlowCharging
  • UcmChargingStateTrickleCharging

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1926755.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何安装dotenv,避坑指南,安装包的包名有误?

嗨,大家好,我是蓝若姐姐。最近在研究AI大模型,想写一个调用openai接口的demo,结果发现在装一个三方库的时候一直报错,mac电脑安装dotenv报错,具体情况是 执行这个命令: pip install dotenv 遇…

提升 Kubernetes 日志记录能力,提高可观察性

介绍 在微服务和容器化应用时代,有效管理和监控应用的健康和性能至关重要。Kubernetes是一个用于自动部署、扩展和管理容器化应用的开源系统,已成为寻求敏捷性和弹性的企业的首选解决方案。 然而,由于 Kubernetes 的分布式架构、高日志量和…

【数据结构】栈和队列的深度探索,从实现到应用详解

💎所属专栏:数据结构与算法学习 💎 欢迎大家互三:2的n次方_ 🍁1. 栈的介绍 栈是一种后进先出的数据结构,栈中的元素只能从栈顶进行插入和删除操作,类似于叠盘子,最后放上去的盘子最…

Git代码管理工具 — 4 Git分支详解

目录 1 Git 分支概念 2 Git 分支基本操作 2.1 git branch查看与创建本地分支 2.2 git checkout切换分支 2.3 git merge合并分支 2.4 删除分支 3 解决冲突 1 Git 分支概念 Git 分支允许你从当前开发线上分离出来,进行独立的开发工作,而不会影响主…

用 AI 写歌词,让音乐表达与众不同

在音乐的广袤天地中,我们都渴望通过独特的表达来触动人心,展现自我。而如今,AI 技术的崛起为音乐创作带来了全新的突破,让我们能够以一种前所未有的方式赋予音乐独特的灵魂。 “妙笔生词智能写歌词软件(veve522&#…

Window10下安装WSL-Ubuntu20.04

1.开启并更新WSL 1.1开启WSL 首先先来看一下电脑是否能够开启WSL:待补充... 然后再来看一下如何开启WSL:win->设置->应用->应用和功能->程序和功能,如下所示: 最后选择启用或关闭Windows功能,开启两个选项:1.Hyper-V…

大语言模型诞生过程剖析

过程图如下 📚 第一步:海量文本的无监督学习 得到基座大模型🎉 🔍 原料:首先,我们需要海量的文本数据,这些数据可以来自互联网上的各种语料库,包括书籍、新闻、科学论文、社交媒体帖…

K8S系列-Kubernetes基本概念及Pod、Deployment、Service的使用

一、Kubernetes 的基本概念和术语 一、资源对象 ​ Kubernetes 的基本概念和术语大多是围绕资源对象 Resource Object 来说的,而资源对象在总体上可分为以下两类: 1、某种资源的对象 ​ 例如节点 Node) Pod 服务 (Service) 、存储卷 (Volume)。 2、…

记录些Redis题集(4)

Redis 通讯协议(RESP) Redis 通讯协议(Redis Serialization Protocol,RESP)是 Redis 服务端与客户端之间进行通信的协议。它是一种二进制安全的文本协议,设计简洁且易于实现。RESP 主要用于支持客户端和服务器之间的请求响应交互…

Adminer-CVE-2021-21311

在其4.0.0到4.7.9版本之间,连接 ElasticSearch 和 ClickHouse 数据库时存在一处服务端请求伪造漏洞(SSRF)。 VPS开启HTTP服务 VPS 开启HTTP 再同时跑POC 确保能访问poc里的链接文件 第一是目标地址 第二个是跳转地址 第三个是监听地址 如果…

昇思25天学习打卡营第21天|DCGAN生成漫画头像

DCGAN原理 DCGAN(深度卷积对抗生成网络,Deep Convolutional Generative Adversarial Networks)是GAN的直接扩展。不同之处在于,DCGAN会分别在判别器和生成器中使用卷积和转置卷积层。 它最早由Radford等人在论文Unsupervised Re…

【软件建模与设计】-03-软件生存周期模型和过程

目录 1、瀑布模型 2、抛弃型原型 3、演化式-增量模型 4、螺旋模型 5、统一软件开发过程RUP 6、设计验证和确认 6.1、软件质量保证 6.2、软件设计的性能分析 7、软件生存周期的活动 7.1、需求分析和规约 7.2、体系结构设计 7.3、详细设计 7.4、编码 8、软件测试 …

element-ui 插槽自定义样式怎么居中

场景:使用element-ui组件,scope内部自定义样式导致的错位 效果图: 解决思路: template标签可理解为一个内嵌组件,宽高重新定义,可在自定义内容外层套一层盒子,让盒子占满所有空间,再…

DBA 数据库管理 表管理 数据批量处理。表头约束

表管理 建库 库名命名规则:仅可以使用数字、字母、下划线、不能纯数字 不可使用MySQL命令或特殊字符 库名区分字母大小写 加if not exists 命令避免重名报错 create database if not exists gamedb; 建表 drop database if exists gamedb ; 删表…

从JDK源码探究Java线程与操作系统的交互

文章目录 从JDK源码探究Java线程与操作系统的交互一、序言二、线程基础概念1、操作系统线程实现方式(1)内核级线程(Kernel-Level Thread)(2)用户级线程(User-Level Thread)&#xff…

【DevOps系列】DevOps简介及基础环境安装

作者:后端小肥肠 目录 1. 前言 2. DevOps(详细介绍) 3. Code阶段工具 3.1 Git安装 3.2 GitLab安装 4. Build阶段工具 5. Operate阶段工具 5.1 Docker安装 5.2 Docker-Compose安装 6. Integrate工具 6.1 Jenkins介绍 6.2 Jenkins安…

8-1 搭建solidity开发环境,自己定制一个truffle

8-1 搭建solidity开发环境,自己定制一个truffle(react区块链实战) 从零开始搭建一个项目 自己实现一套类似truffle的自动编译系统,加深理解 此处可以跳过无需自己实现编译合约的模块,使用已有的truffle模块即可 项目…

SSM框架学习笔记(仅供参考)

(当前笔记简陋,仅供参考) 第一节课: (1)讲述了Spring框架,常用jar包,以及框架中各个文件的作用 (2)演示了一个入门程序 (3)解释了…

TS 入门(二):Typescript类型与类型注解

目录 前言回顾1. 基本类型数字类型 (number)字符串类型 (string)布尔类型 (boolean)空值和未定义 (null 和 undefined)任意类型 (any)unknown 类型any 与 unkown 区别 2. 数组和元组类型数组类型元组类型 3. 枚举类型4. 类型注解示例指定变量类型函数参数和返回值类型注解类型推…

在浏览器控制台中输出js对象,为什么颜色不同,有深有浅

打开console,输入自定义的javascript对象的时候,打开看发现对象的属性是深紫色,后面有一些对象是浅紫色的,比如Array对象和一堆SVG,HTML,CSS开头的对象,常用的prototype和__proto__也是浅紫色的。 请问这里深紫和浅紫…