windows USB 设备驱动开发-USB 功能控制器驱动开发(二)

news2024/11/15 7:56:38
USB 功能客户端驱动程序使用的 UFX 对象和句柄

USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。

重要的 API
  • UfxDeviceCreate
  • UfxEndpointCreate

USB 函数类扩展 (UFX) 使用 WDF 对象功能来定义这些特定于 USB 的 UFX 对象。

这些对象是 WDF 对象的句柄,由 UFX 根据函数客户端驱动程序的请求创建。 (可选)客户端驱动程序可以将上下文与创建时传递的这些对象相关联。 UFX 创建的每个 WDF 对象都可能具有两个设备上下文:在创建对象时由 UFX 设置的一个设备上下文;由客户端驱动程序传入的另一个设备上下文,在创建 WDF 对象后,通过使用 WdfObjectAllocateContext 在 UFX 中设置。

UFXDEVICE:USB 设备对象

表示控制器创建的 USB 设备。 对象负责根据 USB 协议规范管理 USB 状态,并管理与 USB 设备关联的一个或多个终结点。 函数控制器驱动程序通过调用 UfxDeviceCreate 方法在 EvtDriverDeviceAdd 回调中创建此对象。

EVT_UFX_DEVICE_HOST_CONNECT启动与主机的连接。
EVT_UFX_DEVICE_HOST_DISCONNECT禁用函数控制器与主机的通信。
EVT_UFX_DEVICE_ADDRESSED在函数控制器上分配地址。
EVT_UFX_DEVICE_ENDPOINT_ADD创建默认终结点对象。
EVT_UFX_DEVICE_DEFAULT_ENDPOINT_ADD创建默认终结点对象。
EVT_UFX_DEVICE_USB_STATE_CHANGE更新 USB 设备的状态。
EVT_UFX_DEVICE_PORT_CHANGE更新 USB 设备连接到的新端口的类型。
EVT_UFX_DEVICE_PORT_DETECT启动端口检测。
EVT_UFX_DEVICE_REMOTE_WAKEUP_SIGNAL在函数控制器上启动远程唤醒。
EVT_UFX_DEVICE_DETECT_PROPRIETARY_CHARGER启动专有充电器检测。
EVT_UFX_DEVICE_PROPRIETARY_CHARGER_RESET重置专有充电器。
EVT_UFX_DEVICE_PROPRIETARY_CHARGER_SET_PROPERTY设置用于启用通过 USB 充电的充电器信息。

UFXENDPOINT:USB 终结点对象

表示主机和设备之间的逻辑连接。 对象负责向/从主机传输数据。 对于每个设备对象,可以有一个或多个终结点。 默认终结点始终是控制终结点,其余终结点是特定于类驱动程序的对象。 函数控制器驱动程序通过调用 UfxEndpointCreate 方法在EVT_UFX_DEVICE_ENDPOINT_ADD回调中创建 对象。

支持 USB 充电器的 USB 筛选器驱动程序

如果功能控制器使用内置 Synopsys 和 ChipIdea 驱动程序,则编写支持充电器检测的筛选器驱动程序。 如果要为专有功能控制器编写客户端驱动程序,则通过实现 EVT_UFX_DEVICE_PROPRIETARY_CHARGER_SET_PROPERTY、 EVT_UFX_DEVICE_PROPRIETARY_CHARGER_RESET和 EVT_UFX_DEVICE_DETECT_PROPRIETARY_CHARGER,将充电器/附加检测集成到客户端驱动程序中。

USB 功能堆栈允许设备(如手机或平板电脑)在连接到 USB 电池充电 (BC) 1.2 规范定义的主机和 USB 充电器时充电。

  • 设备可以使用两种类型的端口进行充电。 设备可以从设备随附的充电器上的专用充电端口 (DCP) 充电。 或者,设备可以从标准下游端口或在设备连接到电脑时向下游端口充电。 这两种情况都符合 USB BC 1.2 规范。
  • 某些充电器不符合规范。 USB 功能堆栈允许设备从这些专有 USB 充电器充电。

若要支持符合规范的专有充电器,需要执行这些操作。

  • 设备能够检测到 USB 主机或充电器何时连接或分离。
  • 设备能够检测到 BC 1.2 规范定义的不同 USB 充电端口。
  • 对于 BC 1.2 规范定义的 USB 充电器,设备按 BC 1.2 规范允许的最大电流量充电。
  • 设备能够检测专有的 USB 充电器。
  • 对于专用 USB 充电器,确定设备可以消耗的最大电流量。
  • 通知操作系统已连接的 USB 端口类型。
  • 阻止设备通过 OS 中的 USB 拉取电流,即使 USB 主机已连接且设备已使用主机自行配置也是如此。

这些操作由 USB 函数类扩展 (UFX) /client 驱动程序 对和作为 USB 函数设备堆栈中的较低筛选器加载的筛选器驱动程序进行处理。 驱动程序管理 USB 充电,从 USB 端口检测开始,到通知电池堆栈何时可以开始充电,以及设备可以消耗的最大电流量。

下面是设备堆栈的体系结构表示形式。

当 USB 端口连接到设备时,客户端驱动程序会通过较低筛选器驱动程序或中断收到通知。 此时,客户端驱动程序通过与 USB 硬件通信来执行端口检测,并将端口类型报告给 UFX。 或者,它可以请求筛选器驱动程序。 在这种情况下,筛选器驱动程序与 USB 硬件协调以执行 USB 端口检测,并将检测到的端口类型返回给客户端驱动程序,客户端驱动程序将其传递给 UFX。

根据端口类型,UFX 确定设备可以绘制的最大电流量,并将该信息发送到充电聚合驱动程序 (CAD) 。 CAD 验证信息。 如果当前有效,CAD 会向电池类驱动程序发送请求,以开始充电至指定的最大电流。 电池类驱动程序将充电请求转发到电池微型类驱动程序进行处理。 如果充电请求指定附加了专有充电器,并且电池微型类处理专有充电器,则微型类驱动程序可以尝试使用它确定合适的最大电流充电。 否则,电池微型类最多只能充电到 CAD 指定的最大电流。

从用户模式服务与 GenericUSBFn.sys 通信

所有用户模式请求都发送到 Microsoft 提供的内核模式驱动程序 GenericUSBFn.sys。 可以通过将这些 I/O 控制 (代码发送到 IOCTL) 来创建与 GenericUSBFn.sys 通信的用户模式服务,GenericUSBFn.sys 处理与 USB 函数驱动程序的内核模式通信。

Genericusbfnioctl.h 中声明的 IOCTL 用于与来自用户模式服务的 GenericUSBFn.sys 通信。

以下步骤介绍如何定义与 GenericUSBFn.sys 交互以与 USB 功能驱动程序通信的 USB 接口服务:

1.启动时,服务将侦听接口的设备接口到达。 设备接口 GUID 是 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\USBFN\Interfaces OEM 定义的子项下在注册表中声明的 InterfaceGUID 值。 有两种常见的方法来侦听设备到达:

  • 触发器启动服务。 
  • 注册设备接口到达。 

2.接口到达后,服务会打开设备的句柄:

  • 通过调用 CM_Get_Device_Interface_List 函数获取设备的符号名称。 指定在注册表的 InterfaceGUID 值中声明的设备接口 GUID。
  • 获得设备的符号名称后,使用 CreateFile 打开设备的句柄。

3.服务发出IOCTL_GENERICUSBFN_GET_CLASS_INFO,以检索有关可用管道的信息,如注册表中配置的那样。
4.服务准备好进行通信后,会发出IOCTL_GENERICUSBFN_ACTIVATE_USB_BUS。 激活所有类驱动程序后,USB 函数类扩展可以连接到主机。
5.为了接收 USB 通知,该服务会发出IOCTL_GENERICUSBFN_BUS_EVENT_NOTIFICATION。 当发生新的 USB 事件时,此 IOCTL 完成。 特别感兴趣的事件 (USBFN_EVENT) 包括:
6.UsbfnEventReset:用于确定连接的 USB 设备的速度。
7.UsbfnEventConfigured:服务现在可以发出传输请求。
8.UsbfnEventSetupPacket:USB 函数类扩展已收到特定于接口的设置数据包 (bmRequestType.Type == BMREQUEST_CLASS) 。 服务应通过在管道 0 中发出传输请求来回复设置数据包,然后发出在管道 0 上的相反方向 (IOCTL_GENERICUSBFN_CONTROL_STATUS_HANDSHAKE_OUT) 握手请求。
9.收到 UsbfnEventConfigured 事件后,服务可以使用IOCTL_GENERICUSBFN_TRANSFER_IN、IOCTL_GENERICUSBFN_TRANSFER_IN_APPEND_ZERO_PKT和IOCTL_GENERICUSBFN_TRANSFER_OUT开始发出传输请求。

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

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

相关文章

怎样优化 PostgreSQL 中对复杂条件筛选的执行效率?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会!📚领书:PostgreSQL 入门到精通.pdf 文章目录 怎样优化 PostgreSQL 中对复杂条件筛选的执行效率?一、理解复杂条件筛选的挑战二、优化索引…

实现多层感知机

目录 多层感知机: 介绍: 代码实现: 运行结果: 问题答疑: 线性变换与非线性变换 参数含义 为什么清除梯度? 反向传播的作用 为什么更新权重? 多层感知机: 介绍:…

Linux: Mysql环境安装

Mysql环境安装(Centos) 前言一、卸载多余环境1.1 卸载mariadb1.2 查看并卸载系统mysql和mariadb安装包 二、换取mysql官方yum源三、安装并启动mysql服务3.1 yum源加载3.2 安装yum源3.3 安装mysql服务3.3.1 安装指令3.3.2 GPG密钥问题解决方法3.3.3 查看是…

LabVIEW液压数据采集测试系统

液压系统是装载机的重要组成部分,通过液压传动和控制实现各项作业功能,如提升、倾斜、转向等。液压系统的性能直接影响装载机的作业效率和稳定性。为了保证装载机液压系统的正常运行和优化设计,需要对其进行数据采集和测试。本文介绍了一套基…

Python酷库之旅-第三方库Pandas(022)

目录 一、用法精讲 55、pandas.lreshape函数 55-1、语法 55-2、参数 55-3、功能 55-4、返回值 55-5、说明 55-6、用法 55-6-1、数据准备 55-6-2、代码示例 55-6-3、结果输出 56、pandas.wide_to_long函数 56-1、语法 56-2、参数 56-3、功能 56-4、返回值 56-5…

Linux文件压缩与解压缩

在Linux中,tar实用程序是用于创建、管理和提取存档的常用命令。 tar实用程序的常用选项 执行tar操作需要以下tar命令操作之一: -c ,--create :创建存档文件(即压缩文件)。-t,--list&#xff1…

0708,LINUX目录相关操作 + LINUX全导图

主要是冷气太足感冒了,加上少吃药抗药性差,全天昏迷,学傻了学傻了 01:简介 02: VIM编辑器 04:目录 05:文件 03:常用命令 06:进程 07:进程间的通信 cat t_c…

数据结构(4.1)——串的存储结构

串的顺序存储 串(String)的顺序存储是指使用一段连续的存储单元来存储字符串中的字符。 计算串的长度 静态存储(定长顺序存储) #define MAXLEN 255//预定义最大串为255typedef struct {char ch[MAXLEN];//每个分量存储一个字符int length;//串的实际长…

接口安全配置

问题点: 有员工在工位在某个接口下链接一个集线器,从而扩展上网接口,这种行为在某些公司是被禁止的,那么网络管理员如何控制呢?可以配置接口安全来限制链接的数量,切被加入安全的mac地址不会老化&#xff…

开源模型应用落地-工具使用篇-Spring AI-Function Call(八)

​​​​​​​一、前言 通过“开源模型应用落地-工具使用篇-Spring AI(七)-CSDN博客”文章的学习,已经掌握了如何通过Spring AI集成OpenAI和Ollama系列的模型,现在将通过进一步的学习,让Spring AI集成大语言模型更高阶…

Linux的世界 -- 初次接触和一些常见的基本指令

一、Linux的介绍和准备 1、简单介绍下Linux的发展史 1991年10月5日,赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组(comp.os.minix)中宣布他编制出了一种类似UNIX的小操作系统,叫Linux。新的操作系统是受到另一个UNIX的…

【Python】爬虫实战01:获取豆瓣Top250电影信息

本文中我们将通过一个小练习的方式利用urllib和bs4来实操获取豆瓣 Top250 的电影信息,但在实际动手之前,我们需要先了解一些关于Http 请求和响应以及请求头作用的一些知识。 1. Http 请求与响应 HTTP(超文本传输协议)是互联网上…

C#创建windows服务程序

步骤 1: 创建Windows服务项目 打开Visual Studio。选择“创建新项目”。在项目类型中搜索“Windows Service”并选择一个C#模板(如“Windows Service (.NET Framework)”),点击下一步。输入项目名称、位置和其他选项,然后点击“创…

C++ | Leetcode C++题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; class MyQueue { private:stack<int> inStack, outStack;void in2out() {while (!inStack.empty()) {outStack.push(inStack.top());inStack.pop();}}public:MyQueue() {}void push(int x) {inStack.push(x);}int pop() {if (outStac…

秋招突击——7/9——MySQL索引的使用

文章目录 引言正文B站网课索引基础创建索引如何在一个表中查看索引为字符串建立索引全文索引复合索引复合索引中的排序问题索引失效的情况使用索引进行排序覆盖索引维护索引 数据库基础——文档资料学习整理创建索引删除索引创建唯一索引索引提示复合索引聚集索引索引基数字符串…

网络安全——防御课实验二

在实验一的基础上&#xff0c;完成7-11题 拓扑图 7、办公区设备可以通过电信链路和移动链路上网(多对多的NAT&#xff0c;并且需要保留一个公网IP不能用来转换) 首先&#xff0c;按照之前的操作&#xff0c;创建新的安全区&#xff08;电信和移动&#xff09;分别表示两个外网…

基础小波降噪方法(Python)

主要内容包括&#xff1a; Stationary wavelet Transform (translation invariant) Haar wavelet Hard thresholding of detail coefficients Universal threshold High-pass filtering by zero-ing approximation coefficients from a 5-level decomposition of a 16Khz …

win10系统更新后无法休眠待机或者唤醒,解决方法如下

是否使用鼠标唤醒 是否使用鼠标唤醒 是否使用键盘唤醒

【Java开发实训】day03——方法的注意事项

目录 一、方法的基本概念 二、void和return关键字 三、单一返回点原则 四、static方法使用说明 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于…

《Windows API每日一练》9.25 系统菜单

/*------------------------------------------------------------------------ 060 WIN32 API 每日一练 第60个例子POORMENU.C&#xff1a;使用系统菜单 GetSystemMenu函数 AppendMenu函数 (c) www.bcdaren.com 编程达人 -------------------------------------------…