当前位置: 首页 > news >正文

windows USB 设备驱动开发-USB主控制开发(一)

下面介绍主机驱动程序开发的高级概念和任务。 如果你正在编写与 Microsoft 提供的 USB 主机控制器扩展驱动程序 (Ucx01000.sys) 通信的新主机控制器驱动程序,则这部分内容适用于你。

下面是 Windows 中 USB 主机端驱动程序中显示的图表的修改版本。 此版本隐藏 USB 客户端驱动程序层的详细信息,这些详细信息与主控制器驱动程序开发无关:

在上图中,

USB 集线器驱动程序 (Usbhub3.sys) 是 KMDF 驱动程序。 集线器驱动程序负责管理 USB 集线器及其端口、枚举和创建物理设备对象, (PDO) USB 设备和可能连接到其下游端口的其他集线器。

USB 主机控制器扩展 (Ucx01000.sys) 是堆栈中上述集线器驱动程序的抽象层,提供一种通用机制,用于将请求排队到基础主机控制器驱动程序。

USB 主机控制器驱动程序 管理硬件。 Usbxhci.sys 是 Microsoft 提供的一个此类驱动程序,它尤其面向符合 xHCI 规范的 USB 控制器硬件。 独立硬件开发人员可能需要编写自己的主机控制器驱动程序,而不是使用收件箱 Usbxhci.sys。 例如,对于 XHCI 硬件,该硬件不完全符合规范,因此无法使用 Usbxhci.sys 或非 XHCI 硬件,例如 USB over TCP 连接。

UCX 和主机控制器驱动程序之间的双向通信通过使用 USB 主机控制器扩展 (UCX) 编程接口进行。 编译驱动程序时,每个驱动程序静态链接到 Microsoft 提供的存根库中的入口点 (Ucx01000.lib) 。

下面是为主机控制器驱动程序加载的设备堆栈:

UCX 对象和句柄 

UCX 扩展了 WDF 对象功能,以定义其自己的特定于 USB 的 UCX 对象。 UCX 使用这些对象将请求排队到任何基础主机控制器驱动程序。

重要的 API

UcxControllerCreate
UcxRootHubCreate
UcxUsbDeviceCreate

UCXCONTROLLER:主机控制器对象

表示由主机控制器驱动程序创建的主机控制器。 驱动程序必须为每个主机控制器实例仅创建一个主机控制器对象。 通常通过调用 UcxControllerCreate 方法在 EvtDriverDeviceAdd 回调中创建。

当主机控制器驱动程序创建对象时,驱动程序将注册由 UCX 调用的回调函数的实现。 驱动程序还应识别主机控制器连接的总线类型,例如 ACPI 或 PCI。 驱动程序还通过使用传递给 UcxControllerCreate 调用的 UCX_CONTROLLER_CONFIG 结构来提供主机控制器设备信息。

若要处理 I/O 请求,主机控制器驱动程序必须注册 GUID_DEVINTERFACE_USB_HOST_CONTROLLER 设备接口。 此驱动程序不需要实现此接口中定义的 IOCTL。 相反,UCX 客户端通过调用 UcxIoDeviceControl 将在此接口上收到的 IOCTL 请求传递给 UCX。

下面是与主机控制器对象关联的回调函数,这些函数由 UCX 调用。 这些函数必须由主机控制器驱动程序实现。

*EVT_UCX_CONTROLLER_USBDEVICE_ADD
当集线器驱动程序通过与根集线器和/或外部集线器的交互确定总线上有新设备时调用。

*EVT_UCX_CONTROLLER_QUERY_USB_CAPABILITY UCX
调用以收集有关 USB 主机控制器支持的各种功能的信息。

*EVT_UCX_CONTROLLER_RESET
由 UCX 调用以重置控制器硬件,以响应检测到的错误。

*EVT_UCX_CONTROLLER_GET_CURRENT_FRAMENUMBER
用于从主机控制器中检索当前帧编号,中心驱动程序使用它来计划时序传输。

UCXROOTHUB:根集线器对象

获取和控制主机控制器的根端口的状态。 主机控制器驱动程序通常在创建主机控制器对象后调用 UcxRootHubCreate 方法,在 EvtDriverDeviceAdd 回调中创建。 每个主机控制器实例只能有一个根集线器对象。 在 UcxRootHubCreate 调用中,驱动程序注册其回调实现。

EVT_UCX_ROOTHUB_GET_INFO
返回根集线器的 USB 2.0 和 USB 3.0 端口的数目。

EVT_UCX_ROOTHUB_GET_20PORT_INFO
返回有关根中心的 USB 2.0 或 USB 3.0 端口 (*EVT_UCX_ROOTHUB_GET_30PORT_INFO) 的信息。

创建并初始化根集线器对象后,集线器驱动程序通过发送中断和控制传输与根集线器端口交互。 UCX 通过调用主机控制器驱动程序实现的这些回调函数来帮助实现这些传输。

EVT_UCX_ROOTHUB_CONTROL_URB
处理 USB 集线器的功能控制请求。。

EVT_UCX_ROOTHUB_INTERRUPT_TX
处理有关已更改端口的信息的请求。

UCXUSBDEVICE:USB 设备对象

表示连接到总线的物理 USB 设备。 主机控制器驱动程序通常通过调用 UcxUsbDeviceCreate 方法在 EVT_UCX_CONTROLLER_USBDEVICE_ADD 回调中创建。

创建对象时,主机控制器驱动程序使用 UcxUsbDeviceCreate 调用注册其回调函数的实现。

这些回调函数旨在使控制器和驱动程序了解 USB 设备的当前状态。

EVT_UCX_USBDEVICE_ENABLE
准备控制器以执行到设备的默认端点的传输。

EVT_UCX_USBDEVICE_DISABLE
释放与设备及其默认端点关联的控制器资源。

EVT_UCX_USBDEVICE_ADDRESS
将地址编程到控制器中,并将 SET_ADDRESS 传输发送到设备,使其进入寻址状态。

EVT_UCX_USBDEVICE_ENDPOINTS_CONFIGURE
将非默认端点编程到控制器中,并/或释放其他非默认端点。

EVT_UCX_USBDEVICE_RESET
设备已重置的控制器通知,在这种情况下,驱动程序采取任何必要措施将控制器与 USB 设备同步。

EVT_UCX_USBDEVICE_UPDATE
通知控制器与设备相关的各种信息。

EVT_UCX_USBDEVICE_HUB_INFO
如果 UCXUSBDEVICE 句柄用于集线器设备,则通知集线器属性。

EVT_UCX_USBDEVICE_ENDPOINT_ADD
通知驱动程序为设备创建端点。 默认端点的 EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD。

当挂起的 USB 3.0 设备上的接口发出唤醒信号时,驱动程序应调用 UcxUsbDeviceRemoteWakeNotification 来通知 UCX。

创建对象后,对象的生存期由 UCX 管理,驱动程序不得删除该对象。

UCXENDPOINT:端点对象

表示 USB 设备对象上的端点。 端点对象由主机控制器在 EVT_UCX_USBDEVICE_DEFAULT_ENDPOINT_ADD 或 EVT_UCX_USBDEVICE_ENDPOINT_ADD 回调期间创建。 创建端点对象时,驱动程序会注册其回调函数。

驱动程序还会为每个端点创建一个框架队列对象,并通过调用 UcxEndpointSetWdfIoQueue 将该队列的 WDFQUEUE 传递给 UCX。 创建端点后,对象及其关联的队列的生存期由 UCX 管理,驱动程序不得删除这些对象本身。

端点对象实现多个回调函数,使驱动程序能够协助 UCX 执行与端点相关的操作。

EVT_UCX_ENDPOINT_ABORT
中止与端点关联的队列。

EVT_UCX_ENDPOINT_OK_TO_CANCEL_TRANSFERS
通知控制器驱动程序,它可以在端点上完成取消的传输。

EVT_UCX_ENDPOINT_PURGE
完成端点上所有未完成的 I/O 请求。

EVT_UCX_ENDPOINT_START
开始与端点关联的队列。

EVT_UCX_ENDPOINT_STATIC_STREAMS_ADD
创建静态流。

EVT_UCX_ENDPOINT_RESET
通知驱动程序重置控制器的端点编程。

当主机控制器驱动程序在端点上收到 USB 3.0 无 Ping 响应错误时,驱动程序必须调用 UcxEndpointNoPingResponseError。 该调用会导致 USB 设备对象接收 EVT_UCX_USBDEVICE_UPDATE。 有关详细信息,请参阅 在主机控制器驱动程序中配置 USB 端点。

UCXSTREAMS:流对象

代表通过单个端点连接设备的管道数量。 主机控制器驱动程序通过调用 UcxStaticStreamsCreate 在 EVT_UCX_ENDPOINT_STATIC_STREAMS_ADD 回调中创建流对象。

在 UcxStaticStreamsCreate 调用期间,主机控制器驱动程序注册其回调函数。 对于特定的端点对象,驱动程序可以确定它是否已创建流对象,并通过调用 UcxEndpointGetStaticStreamsReferenced 返回 UCXSTREAMS 句柄。

创建对象后,驱动程序会为每个流创建一个框架队列对象,并通过调用 UcxStaticStreamsSetStreamInfo 将 WDFQUEUE 句柄发送到 UCX。

流对象为主机控制器提供了多个回调函数,以帮助 UCX 管理静态流。

EVT_UCX_ENDPOINT_STATIC_STREAMS_DISABLE
为端点的所有流发布控制器资源。

EVT_UCX_ENDPOINT_STATIC_STREAMS_ENABLE
为此端点启用所有流的控制器硬件。

对象的生存期和关联的队列由 UCX 管理,驱动程序不得删除这些对象。

相关文章:

windows USB 设备驱动开发-USB主控制开发(一)

下面介绍主机驱动程序开发的高级概念和任务。 如果你正在编写与 Microsoft 提供的 USB 主机控制器扩展驱动程序 (Ucx01000.sys) 通信的新主机控制器驱动程序,则这部分内容适用于你。 下面是 Windows 中 USB 主机端驱动程序中显示的图表的修改版本。 此版本隐藏 USB…...

Dubbo 负载均衡(Load Balance)

在分布式系统中,负载均衡是确保系统高效稳定运行的关键技术之一。Dubbo 作为一款高性能的 RPC 框架,提供了多种负载均衡策略以满足不同场景的需求。本文将深入介绍 Dubbo 中常用的几种负载均衡策略:随机(Random)、轮询…...

ArcGIS Pro SDK (九)几何 3 点

ArcGIS Pro SDK (九)几何 3 点 文章目录 ArcGIS Pro SDK (九)几何 3 点1 构造地图点2 地图点生成器属性3 地图点的相等性4 缩放至指定点 环境:Visual Studio 2022 .NET6 ArcGIS Pro SDK 3.0 1 构造地图点 // 使用生…...

基于神经网络的分类和预测

基于神经网络的分类和预测 一、基础知识(一)引言(二)神经网络的基本概念(1)神经网络(2)神经元(3)常用的激活函数(非线性映射函数)&…...

VR头显如何低延迟播放8K的RTSP|RTMP流

技术背景 我们在做Unity平台RTSP、RTMP播放器的时候,有公司提出来这样的技术需求,希望在头显播放全景的8K RTSP|RTMP直播流,8K的数据,对头显和播放器,都提出了新的要求,我们从几个方面,探讨下V…...

2、ASPX、.NAT(环境/框架)安全

ASPX、.NAT&#xff08;环境/框架&#xff09;安全 源自小迪安全b站公开课 1、搭建组合&#xff1a; WindowsIISaspxsqlserver .NAT基于windows C开发的框架/环境 对抗Java xx.dll <> xx.jar 关键源码封装在dll文件内。 2、.NAT配置调试-信息泄露 功能点&#xf…...

在家上网IP地址是固定的吗?

在数字化时代&#xff0c;互联网已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都离不开网络的支持。然而&#xff0c;当我们在家中接入互联网时&#xff0c;可能会产生这样一个疑问&#xff1a;在家上网IP地址是固定的吗&#xff1f;下面一…...

交换机和路由器的工作流程

1、交换机工作流程&#xff1a; 将接口中的电流识别为二进制&#xff0c;并转换成数据帧&#xff0c;交换机会记录学习该数据帧的源MAC地址&#xff0c;并将其端口关联起来记录在MAC地址表中。然后查看MAC地址表来查找目标MAC地址&#xff0c;会有一下一些情况&#xff1a; MA…...

算法笔记——LCR

一.LCR 152. 验证二叉搜索树的后序遍历序列 题目描述&#xff1a; 给你一个二叉搜索树的后续遍历序列&#xff0c;让你判断该序列是否合法。 解题思路&#xff1a; 根据二叉搜索树的特性&#xff0c;二叉树搜索的每一个结点&#xff0c;大于左子树&#xff0c;小于右子树。…...

ChatGPT对话:如何制作静态网页?

【编者按】编者在很早以前制作过静态网页&#xff0c;之后长期没有使用&#xff0c;已完全不知道最新现状了。所以&#xff0c;从制作工具开始询问ChatGPT&#xff0c;回答非常全面&#xff0c;完全可以解决初学者的问题。 编者虽然长期不制作网页&#xff0c;但一直在编程&…...

k8s(二)

五、kubernetes架构(K8S的架构也是master和node模式&#xff09; 集群里至少需要有一个master节点&#xff0c;即就是主节点。node节点可以多个。 若是多个master节点&#xff0c;worker节点和master的apiserverr进行交互时&#xff0c;就需要通过LB(load banlance&#xff09;…...

ClickHouse表引擎概述

ClickHouse表引擎概述 表引擎的功能&#xff1a; 数据的存储方式 数据的存储位置 是否可以使用索引 是否可以使用分区 是否支持数据副本 并发数据访问 ClickHouse在建表时必须指定表引擎。 表引擎主要分为四大类&#xff1a;MergeTree系列、Log系列、与其他存储/处理系…...

jenkins系列-04-jenkins参数化构建

使用maven build之前&#xff0c;先checkout 指定分支或标签&#xff1a; 拖拽调整顺序&#xff1a;shell执行在前&#xff0c;构建在后&#xff1a; gitee新建标签tag:...

Flutter框架时间线梳理

Flutter是一个开源的UI工具包&#xff0c;它用于构建高质量的原生移动应用。Flutter的版本历史如下&#xff1a; Flutter 0.1.2&#xff1a; 2018年发布&#xff0c;这是第一个正式发布的版本&#xff0c;包含了基本的框架和工具。 Flutter 1.0.0&#xff1a; 2019年发布&…...

RAG 效果提升的最后一步—— 微调LLM

如果说&#xff0c;rerank能够让RAG的效果实现百尺竿头更进一步&#xff0c;那么LLM微调应该是RAG效果提升的最后一步。 把召回的数据&#xff0c;经过粗排&#xff0c;重排序后&#xff0c;送给模型&#xff0c;由模型最后总结答案。LLM的确已经是RAG的最后一步了。 这里还是会…...

C语言 | Leetcode C语言题解之第230题二叉搜索树中第K小的元素

题目&#xff1a; 题解&#xff1a; /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/int search_num(struct TreeNode* root, int k, int *result, int num) {if(num k 1){retu…...

YOWOv2(yowov2)动作识别+Fastreid身份识别 详细安装与实现

首先yowov2是一款简单且实时的时空动作检测方案&#xff0c;fastreid是行人重识别&#xff08;身份识别&#xff09; yowov2介绍链接直达fastreid链接直达为时空动作检测任务设计实时框架仍然是一个挑战。YOWOv2 提出了一种新颖的实时动作检测框架&#xff0c;利用三维骨干和二…...

【微服务】Spring Cloud中如何使用Eureka

摘要 Eureka作为Netflix开源的服务发现框架&#xff0c;在Spring Cloud体系中扮演着至关重要的角色。本文详细介绍了Eureka的基本概念、工作原理以及如何在Spring Cloud中集成和使用Eureka进行服务发现和管理。通过深入分析Eureka的注册与发现机制、区域感知和自我保护等高级特…...

【Neo4j】实战 (数据库技术丛书)学习笔记

Neo4j实战 (数据库技术丛书) 第1章演示了应用Neo4j作为图形数据库对改进性能和扩展性的可能性, 也讨论了对图形建模的数据如何正好适应于Neo4j数据模型,现在到了该动 手实践的时间了。第一章 概述 Neo4j将数据作为顶点和边存储(或者用Neo4j术语,节点和关系存 储)。用户被定…...

【Perl】Perl 语言入门

1. Perl语言介绍 Perl 是一种高级、解释型、动态编程语言&#xff0c;由Larry Wall在1987年发布。Perl 以其强大的文本处理能力而闻名&#xff0c;特别是在处理报告生成、文件转换、系统管理任务等方面。它吸收了C、Shell脚本语言、AWK、sed等语言的特性&#xff0c;并加入了大…...

量子机器学习在时间序列预测中的表现:一项基准研究的深度解析

1. 项目概述与核心问题 时间序列预测&#xff0c;这个听起来有点学术的词&#xff0c;其实离我们并不远。从明天股市的涨跌&#xff0c;到下周的天气变化&#xff0c;再到工厂里一台机器的故障预警&#xff0c;背后都离不开对历史数据的分析和未来趋势的推断。在经典计算领域&a…...

项目文档:基于Multisim的四路带计分系统抢答器设计与仿真

摘要&#xff1a;本项目设计了一个四路带计分系统的智能抢答器&#xff0c;具有声光显示、计时和计分功能。使用Multisim 14.3进行电路设计 与仿真验证。项目简介本项目设计了一个基于Multisim的四路带计分系统智能抢答器&#xff0c;采用74系列数字逻辑芯片实现纯硬件电路设计…...

如何通过Marlin固件配置解决3D打印常见问题:终极完整指南

如何通过Marlin固件配置解决3D打印常见问题&#xff1a;终极完整指南 【免费下载链接】Marlin Marlin is a firmware for RepRap 3D printers optimized for both 8 and 32 bit microcontrollers. Marlin supports all common platforms. Many commercial 3D printers come wit…...

从 Session 到 JWT:Web 认证系统的发展与 JWT 原理详解

文章目录 前言一、Web 认证系统的发展史1.第一代认证方案&#xff1a;Cookie Session2.Session 方案的问题开始出现1. Session 存储压力大2. 分布式系统难处理3. 移动端时代到来 二、JWT 是什么三、JWT 的结构到底长什么样1.第一部分&#xff1a;Header&#xff08;头部&#…...

topcode【随机算法题】【2026.5.24打卡-java版本】

最长有效括号 要点&#xff1a;栈&#xff0c;push下标 class Solution {public int longestValidParentheses(String s) {//栈//放前哨-1Deque<Integer> stack new ArrayDeque<>();stack.push(-1);int ans 0;for(int i 0; i < s.length(); i){char c s.…...

别再折腾VMware Tools了!用FileZilla+SSH搞定Windows与Ubuntu虚拟机文件互传(保姆级教程)

告别VMware Tools烦恼&#xff1a;SSHFileZilla实现跨平台文件传输全攻略 每次在Windows和Ubuntu虚拟机之间传输文件时&#xff0c;VMware Tools总是给你带来各种麻烦&#xff1f;安装失败、兼容性问题、功能受限...这些问题我都经历过。今天我要分享的是一种更稳定、更通用的…...

嵌入式开发中LLM应用的挑战与优化实践

1. 嵌入式系统开发中的LLM应用现状嵌入式系统开发作为连接软件与硬件的关键领域&#xff0c;其特殊性给大语言模型&#xff08;LLM&#xff09;的应用带来了独特挑战。与通用软件开发不同&#xff0c;嵌入式开发需要处理硬件寄存器配置、实时性要求、资源约束等底层问题。当前主…...

保姆级教程:用阿里云镜像加速Unity Android依赖下载,搞定MAX+Admob集成

深度优化Unity安卓依赖下载&#xff1a;阿里云镜像加速MAX与AdMob集成实战国内Unity开发者在集成海外广告SDK时&#xff0c;最头疼的莫过于Gradle依赖下载缓慢甚至失败的问题。本文将手把手教你如何通过阿里云镜像仓库彻底解决这一痛点&#xff0c;同时串联Gradle版本管理、mai…...

别再乱买电源线!服务器供电踩坑后果惨重

选服务器电源线&#xff0c;一定要把控好接口匹配、电流大小、安全认证、线缆长度和材质用料五大核心要点&#xff0c;任何一项忽略&#xff0c;都极易造成设备损坏&#xff0c;甚至引发电路起火&#xff0c;机房用电安全不容忽视&#xff0c;选睿阜更安心。先对接口&#xff1…...

ZS315Q Type-C转DP1.4带PD100w方案,边投屏边充电,告别接口焦虑

作为轻薄本、游戏本用户&#xff0c;外接DP显示器时你是不是也遇到过这样的痛点&#xff1a;想投屏到大屏工作娱乐&#xff0c;Type-C接口被视频线占了&#xff0c;充电口就得另占一个&#xff0c;本来接口就没几个&#xff0c;鼠标U盘全都排不上队&#xff1b;更烦人的是就算不…...