windows USB 设备驱动开发-Host端和Device端

Windows 中的 USB 宿主端驱动程序

下图显示了适用于 Windows 的 USB 驱动程序堆栈的体系结构框图。 此图显示了适用于 USB 2.0 和 USB 3.0 的单独 USB 驱动程序堆栈。 当设备连接到 xHCI 控制器时,Windows 加载 USB 3.0 驱动程序堆栈。

Windows 为连接到 EHCI、OHCI 或 UHCI 控制器的设备加载 USB 2.0 驱动程序堆栈。 USB 2.0 驱动程序堆栈随附在 Windows XP 中,Service Pack 1 (SP1) 及更高版本的 Windows 操作系统。

USB 3.0 驱动程序堆栈

Microsoft 使用内核模式驱动程序框架 (KMDF) 接口创建了 USB 3.0 驱动程序。 KMDF 驱动程序模型降低了复杂性并提高了稳定性。

USB 3.0 主控制器驱动程序 (Usbxhci.sys)

xHCI 驱动程序是 USB 3.0 主机控制器驱动程序。 xHCI 驱动程序的职责包括为 xHCI 控制器硬件初始化 MMIO 寄存器和主机基于内存的数据结构、将上层驱动程序的传输请求映射到传输请求块,以及将请求提交到硬件。 完成传输后,驱动程序处理来自硬件的传输完成事件,并将事件传播到驱动程序堆栈上。 它还控制 xHCI 控制器设备槽和终结点上下文。

Windows 将 xHCI 驱动程序加载为主机控制器的设备堆栈中的功能设备对象 (FDO) 。

USB 主机控制器扩展 (Ucx01000.sys)

USB 主机控制器扩展驱动程序 (KMDF) 扩展是基础类特定主机控制器驱动程序(如 xHCI 驱动程序)的新扩展。 新驱动程序是可扩展的,旨在支持预期将来开发的其他类型的主机控制器驱动程序。 USB 主机控制器扩展充当集线器驱动程序的常见抽象接口,提供一种通用机制,用于将请求排队到主控制器驱动程序,并替代某些选定的功能。 由上层驱动程序启动的所有 I/O 请求在 xHCI 驱动程序之前到达主机控制器扩展驱动程序。 收到 I/O 请求后,主机控制器扩展会验证请求,然后将请求转发到与目标终结点关联的适当 KMDF 队列。 xHCI 驱动程序在准备好进行处理时从队列中检索请求。 USB 主控制器扩展驱动程序的职责包括:

  • 向 xHCI 驱动程序提供特定于 USB 的对象;
  • 向 xHCI 驱动程序提供 KMDF 事件回调例程;
  • 管理和控制与主机控制器关联的根中心的操作;
  • 实现可由客户端驱动程序配置的功能,如链接的 MDL、流等;
USB 集线器驱动程序 (Usbhub3.sys)

在适用于 3.0 设备的 USB 驱动程序堆栈中,新的集线器驱动程序使用 KMDF 驱动程序模型。 中心驱动程序主要执行以下任务:

  • 管理 USB 集线器及其端口;
  • 枚举连接到其下游端口的设备和其他中心;
  • 为枚举设备和中心创建物理设备对象 (PDO) ;

Windows 将中心驱动程序作为 FDO 加载到中心设备堆栈中。 新驱动程序中的设备枚举和中心管理是通过一组状态机实现的。 中心驱动程序依赖于 KMDF 进行电源管理和 PnP 功能。 除了中心管理之外,集线器驱动程序还对 USB 客户端驱动程序层发送的某些请求执行初步检查和处理。 例如,中心驱动程序会分析选择配置请求,以确定请求将配置哪些终结点。 分析信息后,集线器驱动程序将请求提交到 USB 主机控制器扩展或进一步处理。

USB 2.0 驱动程序堆栈

Windows 为连接到 EHCI、OHCI 或 UHCI 控制器的设备加载 USB 2.0 驱动程序堆栈。 USB 2.0 驱动程序堆栈中的驱动程序随附在 Windows XP SP1 及更高版本的 Windows 操作系统中。 USB 2.0 驱动程序堆栈旨在促进 USB 2.0 规范中定义的高速 USB 设备。

USB 驱动程序堆栈底部是主控制器驱动程序。 它由端口驱动程序、Usbport.sys 以及同时运行的三个微型端口驱动程序中的一个或多个组成。 当系统检测到主机控制器硬件时,它将加载这些微型端口驱动程序之一。 微型端口驱动程序在加载后加载端口驱动程序Usbport.sys。 端口驱动程序处理主机控制器驱动程序职责的那些方面,这些方面独立于特定协议。

Usbuhci.sys (通用主机控制器接口) 微型端口驱动程序取代了 Windows 2000 随附的 Uhcd.sys 微型类驱动程序。 Usbohci.sys (打开的主机控制器接口)微型端口驱动程序替换 Openhci.sys。 Usbehci.sys 微型端口驱动程序支持高速 USB 设备,并在 Windows XP SP1 及更高版本以及 Windows Server 2003 及更高版本的操作系统中引入。

在支持 USB 2.0 的所有 Windows 版本中,操作系统能够同时管理 USB 1.1 和 USB 2.0 主控制器。 每当操作系统检测到这两种类型的控制器都存在时,它都会创建两个单独的设备节点,每个主机控制器一个节点。 Windows 随后会为符合 USB 2.0 的主机控制器硬件加载 Usbehci.sys 微型端口驱动程序,并根据系统配置为符合 USB 1.1 的硬件 Usbohci.sys 或 Openhci.sys。

端口驱动程序上方是 USB 总线驱动程序,Usbhub.sys,也称为集线器驱动程序。 这是系统上每个中心的设备驱动程序。

USB 通用类泛型父驱动程序 (Usbccgp.sys)

USB 通用类泛型父驱动程序是 Microsoft 为复合设备提供的父驱动程序。 如果 deviceClass 为 0 或0xef且设备描述符中的 numInterfaces 大于 1,中心驱动程序将枚举并加载父复合驱动程序。 集线器驱动程序将父复合驱动程序的兼容 ID 生成为“USB\COMPOSITE”。 Usbccgp.sys 使用 Windows 驱动程序模型 (WDM) 例程。

父复合驱动程序枚举复合设备中的所有功能,并为每个功能创建 PDO。 这会导致为设备中的每个功能加载相应的类或客户端驱动程序。 每个功能驱动程序 (子 PDO) 向父驱动程序发送请求,父驱动程序会将请求提交到 USB 集线器驱动程序。

Usbccgp.sys 包含在 Windows XP SP1 及更高版本的 Windows 操作系统中。 在 Windows 8 中,驱动程序已更新,以实现 USB 3.0 规范中定义的功能暂停和远程唤醒功能。

WinUSB (Winusb.sys)

Windows USB (WinUSB) 是 Microsoft 为 USB 设备提供的通用驱动程序。 WinUSB 体系结构由内核模式驱动程序 (Winusb.sys) 和用户模式动态链接库 (Winusb.dll) 组成。 对于不需要自定义功能驱动程序的设备,Winusb.sys 可以作为功能驱动程序安装在设备的内核模式堆栈中。 然后,用户模式进程可以使用一组设备 I/O 控制请求或通过调用WinUsb_Xxx函数来 与 Winusb.sys 通信。 

在 Windows 8 中,Microsoft 提供的信息 (WinUSB、Winusb.inf 的 INF) 文件包含 USB\MS_COMP_WINUSB作为设备标识符字符串。 这允许 Winusb.sys 自动加载为 MS OS 描述符中具有匹配 WinUSB 兼容 ID 的设备的功能驱动程序。 此类设备称为 WinUSB 设备。 硬件制造商不需要为其 WinUSB 设备分发 INF 文件,从而使最终用户的驱动程序安装过程更简单。

USB 客户端驱动程序

每个 USB 设备(复合设备或非复合设备)都由客户端驱动程序管理。 USB 客户端驱动程序是 USB 驱动程序堆栈的客户端的类或设备驱动程序。 此类驱动程序包括 Microsoft 或第三方供应商提供的特定于类和设备的驱动程序。 客户端驱动程序通过调用 USB 驱动程序堆栈公开的公共接口来创建与设备通信的请求。

复合设备的客户端驱动程序与非复合设备的客户端驱动程序没有什么不同,除了它在驱动程序堆栈中的位置。

非复合设备的客户端驱动程序直接分层在中心驱动程序上方。

对于公开多个功能且没有父类驱动程序的复合 USB 设备,Windows 在集线器驱动程序和客户端驱动程序层之间加载 USB 通用父驱动程序 (Usbccgp.sys) 。 父驱动程序为复合设备的每个功能创建单独的 PDO。功能客户端驱动程序 FDO 加载在泛型父驱动程序之上。 供应商可能会选择为每个功能提供单独的客户端驱动程序。

USB 客户端驱动程序可以在用户模式或内核模式下运行,具体取决于驱动程序的要求。 可以使用 KMDF、UMDF 或 WDM 例程编写 USB 客户端驱动程序。

客户端驱动程序的帮助程序库

Microsoft 提供以下帮助程序库来帮助内核模式驱动程序和应用程序与 USB 驱动程序堆栈通信:

  • Usbd.sys:Microsoft 提供 Usbd.sys 库,用于导出 USB 客户端驱动程序的例程。 帮助程序例程简化了客户端驱动程序的操作任务。 例如,通过使用帮助程序例程,USB 客户端驱动程序可以针对某些特定操作(例如选择配置 )生成 USB 请求块 (URB) ,并将这些 URL 提交到 USB 驱动程序堆栈。
  • Usbdex.lib:此帮助程序库是Windows 8的新增功能。 库导出主要用于分配和生成 URL 的例程。 这些例程替换 Usbd.sys 导出的一些旧例程。 新的例程要求客户端驱动程序注册到 USB 驱动程序堆栈,该堆栈维护注册的句柄。 该句柄用于调用其他 Usbdex.lib 例程。 由新例程分配的某些 URB 具有 URB 上下文,USB 驱动程序使用该上下文来更好地跟踪和处理。 
  • Winusb.dll:Winusb.dll 是一个用户模式 DLL,它公开用于与 Winusb.sys 通信的 WinUSB 函数 ,该函数在内核模式下作为设备的功能驱动程序加载。 应用程序使用这些函数来配置设备、检索有关设备的信息以及执行 I/O 操作。 
Windows 中的 USB 设备端驱动程序

在 USB 设备上,当 ACPI 创建 USB 设备物理设备对象(PDO)时,USB 功能堆栈是指即插即用管理器枚举的一组驱动程序。

在单个配置设备中,USB 设备可以定义一个或多个接口。 例如,用于将文件传输到设备以及从设备传输文件的媒体传输协议(MTP)。 复合 USB 设备可以在单个配置中支持多个接口。 USB 功能堆栈为每个接口创建 PDO,PnP 管理器加载为该接口创建功能设备对象(FDO)的类驱动程序。

USB 功能堆栈在此图像中概念化:

应用程序和服务

所有用户模式请求都会发送到Microsoft提供的内核模式类驱动程序GenericUSBFn.sys。 可以通过发送泛型usbfnioctl.h 中定义的 I/O 控制代码(IOCTLs),创建与GenericUSBFn.sys通信的用户模式服务。

USB 功能类驱动程序

USB 功能类驱动程序在 USB 设备上实现特定接口(或接口组)的功能。 MTP 和 IpOverUsb 是系统提供的类驱动程序的示例。 类驱动程序可以纯粹作为内核模式驱动程序实现,也可以是与系统提供的类驱动程序GenericUSBFn.sys配对的用户模式服务。

功能类驱动程序使用 USB 功能类驱动程序将请求发送到控制器到 UFX 编程接口。

USB 功能类扩展 (UFX)

USB 功能类扩展(UFX)是内核模式驱动程序框架(KMDF)的系统提供的扩展。 USB 是标准总线,具有一些必需的功能和功能。 UFX 负责实现所有 USB 功能控制器通用的 USB 功能逻辑,以及处理或从 USB 功能类驱动程序调度请求。 具体而言,UFX 处理枚举设备和处理标准控制传输的过程。 若要执行其中一些操作,UFX 需要知道总线的功能。 当建立类扩展接口时,这些功能将报告给 UFX。

UFX 公开了上层(USB 功能类驱动程序和用户模式服务)可用于将请求发送到控制器的标准 IOCTL。 此外,UFX 会通知上层有关从主机接收的标准请求。

USB 功能客户端驱动程序

UFX 提供了一个抽象接口,可在不同的控制器之间一致地工作。 但是,控制器具有不同的功能,限制包括终结点数、终结点类型、低功率、远程唤醒。 例如,某些控制器支持 DMA,而其他控制器则不支持。 某些控制器在硬件中实现流,而其他控制器则要求驱动程序处理流。 出于这些原因,UFX 中仅处理常见功能。 传输、电源管理、流支持和其他功能因控制器到控制器而异,由客户端驱动程序处理。

USB 功能客户端驱动程序负责实现控制器特定的操作。 其中包括实现终结点数据传输、USB 设备状态更改(重置、暂停、恢复)、附加/分离检测、端口/充电器检测。 客户端驱动程序还负责处理电源管理和 PnP 事件。

功能客户端驱动程序使用 USB 功能类驱动程序将作为内核模式驱动程序框架 (KMDF) 驱动程序写入 UFX 编程接口。

Microsoft为 ChipIdea 和 Synopsys 控制器提供内置功能客户端驱动程序UfxChipidea.sys、Ufxsynopsys.sys。

USB 较低筛选器驱动程序

如果功能控制器使用现装 Synopsys 和 ChipIdea 驱动程序,USB 较低筛选器驱动程序支持检测充电器。 筛选器驱动程序从 USB 端口检测开始管理 USB 充电。 它必须为它支持的每个充电器类型发布 GUID,以及该充电器的属性列表。 如果特定充电器可配置,较低的 USB 筛选器驱动程序将定义受支持的 PropertyID 列表及其可发送到它的相应值类型,以配置充电器。 驱动程序还通知电池堆栈何时可以开始充电,以及设备可以绘制的最大当前量。 对于 Synopsys 和 ChipIdea 驱动程序以外的客户端驱动程序,可以在客户端驱动程序中实现充电逻辑。

功能类驱动程序使用编程接口支持专有充电器向 UFX 发送请求。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows/Linux/Mac 系统局域网服务发现协议及传输速度比较

简介 分析 / 验证对比常见局域网服务发现协议在 Windows/Linux/Mac 等不同系统下的支持和表现 在使用不同系统的智能硬件时,如常见的树莓派 / Openwrt 路由器 / Debian/Fedora/Windows/Mac 等系统是,系统间相互发现以及网络共享本应是系统的基础服务&a…

【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统

【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统 一 文档简介二 平台构建2.1 使用平台2.2 百度智能云2.2.1 物联网核心套件2.2.2 在线语音合成 2.3 playback语音数据准备与烧录2.4 开机语音准备与添加2.5 唤醒词识别词命令准备与添加 三 代码准备3.1 sln-local/2-iot 代码…

黑马点评下订单-小程序下单没问题但是Postman发送请求失败了,返回401

经过多方探索,这个✓8错误就是由于黑马点评使用了拦截器,我们直接发送请求是会被拦截器拦截下来的,我给出的解决方案是通过配置Postman解决,方法很简单! 解决方案 右边的value写上Redis里面登录所用token值就可以了…

【TB作品】打地鼠游戏,ATMEGA16单片机,Proteus仿真 打地鼠游戏

11个按键LCD1602显示器9个灯蜂鸣器打地鼠小游戏就是九个灯泡,对应九个按键,灯泡有红黄蓝,每间隔一会儿就会亮一个灯,代表地鼠冒出来,按一下按键让灯泡灭掉代表打地鼠,红的三分,黄的两分&#xf…

开发自动发送国际短信的工具需要用到哪些源代码?

在当今数字化、全球化的时代,国际短信作为一种高效、便捷的沟通方式,在各个领域发挥着越来越重要的作用。 开发一款能够自动发送国际短信的工具,不仅能够帮助企业实现精准营销、客户服务,还能为个人提供便捷的跨国交流方式。 本…

手把手教你搭建PyTorch环境:MindStudio中PyTorch模型开发实战

本次实验的视频链接如下:​https://www.bilibili.com/video/BV1iA4y1f7o1/ 本次实验在MindStudio上进行,请先按照 教程 配置环境,安装MindStudio。 ​ MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台,该IDE上功能很多…

Leetcode.1735 生成乘积数组的方案数

题目链接 Leetcode.1735 生成乘积数组的方案数 rating : 2500 题目描述 给你一个二维整数数组 q u e r i e s queries queries ,其中 q u e r i e s [ i ] [ n i , k i ] queries[i] [n_i, k_i] queries[i][ni​,ki​] 。第 i i i 个查询 q u e r i e s [ i …

AI绘画工具Midjourney:和Discord互相成就

前言 提到文生图,很多人都会想到植根于根植于Discord社区的Midjourney,本篇文章就基于作者的使用体验思考,并结合了Discord来对Midjourney进行探讨,感兴趣的朋友一起来看看吧。 如果要说现在最火的文生图,不得不说到Mi…

深入理解 “androidx.databinding.DataBindingUtil“ 细节和使用

介绍 数据绑定(Data Binding)是 Android 中的一个强大功能,它允许你使用声明性格式而不是编程方式将布局中的 UI 组件绑定到应用中的数据源。androidx.databinding.DataBindingUtil 类是一个工具类,它提供了用于处理数据绑定的方…

单片机语音识别控制蓝牙通信

基于单片机语音识别控制&蓝牙控制 1、Arduino单片机语音控制1.1 直连1.2 蓝牙无线连接1.3 部分核心程序1.4 实物演示 2、51单片机语音控制2.1 直连2.2 蓝牙无线连接2.3 部分核心程序2.4 实物演示 3、STM32单片机语音控制3.1 直连3.2 蓝牙无线连接3.3 部分核心程序3.4 实物演…

数据结构之“刷链表题”

🌹个人主页🌹:喜欢草莓熊的bear 🌹专栏🌹:数据结构 目录 前言 一、相交链表 题目链接 大致思路 代码实现 二、环形链表1 题目链接 大致思路 代码实现 三、环形链表2 题目链接 大致思路 代码实…

RANSAC空间圆拟合实现

由初中的几何知识我们可以知道,确定一个三角形至少需要三个不共线的点,因此确定一个三角形的外接圆至少可用三个点。我们不妨假设三个点坐标为P1(x1,y1,z1),P2(x2,y2,z2),P3(x3,y3,z3)。 圆方程的标准形式为: (xi-x)2(yi-y)2R2 (1…

8605 删数问题

这是一个典型的贪心算法问题。我们可以从高位开始,找到第一个比后面数字大的数字,删除它,然后继续这个过程,直到删除k个数字。如果我们已经删除了k个数字,但是还没有找到一个比后面数字大的数字,那么我们就…

专题六:Spring源码之初始化容器BeanFactory

上一篇咱们通过一个例子介绍初始化容器上下文相关内容,并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点,和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…

首款内置电源的迷你主机,不到千元的办公神器 | 零刻EQ13评测报告

零刻首款内置电源的迷你主机,不到千元的办公神器 | 零刻EQ13评测报告 哈喽小伙伴们好,我是Stark-C~ 众所周知,零刻作为目前国产迷你主机第一品牌,旗下系列众多,产线丰富,比如说它有针对游戏玩家的性能主机…

Transformer动画讲解 - 工作原理

Transformer模型在多模态数据处理中扮演着重要角色,其能够高效、准确地处理包含不同类型(如图像、文本、音频、视频等)的多模态数据。 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。 阶段一:…

JS数据处理(冒泡寻找对象里面有个Key相同的值并处理相关数据)

1.需要处理成的数据格式 [{ mpptNumber: 1, list:[{checked: false,pvEnableStatus: 0,pvSerialNumber: 1,},{checked: false,pvEnableStatus: 0,pvSerialNumber: 2,}] }, { mpptNumber: 2, list:[{checked: false,pvEnableStatus: 0,pvSerialNumber: 1,},{checked: false,pvE…

Cosine 余弦相似度并行计算的数学原理与Python实现

背景 Cosine 我在LLM与RAG系列课程已经讲了很多次了,这里不在熬述,它在LLM分析中,尤其是在语义相似度的计算中至关重要,在dot attention机制中,也会看到他的身影。这里讲的是纯数学上的运算与python是如何运用相关库进…

Ubuntu机器安装rdkit指定版本,通过conda安装不需要make,有手就行。

阿里云购买Ubuntu 22.0机器 IP没错,访问外网没问题 图片中的命令放在下面了。 useradd test-user -s /bin/bash mkdir /home/test-user chown -R test-user: /home/test-user passwd test-uservi /etc/sudoers wget -c https://repo.anaconda.com/archive/Anacon…

全同态加密在大模型应用中应用

密码学简介 上文的图例基本展示了常见加密体系。加密体系,如果用比较正式的描述方法,无疑是做了三件事: 首先,通过一个生成算法 𝐾𝑒𝑦𝐺𝑒𝑛(1&#x1d70…