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

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.mfbz.cn/a/797210.html

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

相关文章

Facebook 开源计算机视觉 (CV) 和 增强现实 (AR) 框架 Ocean

Ocean 是一个独立于平台的框架,支持所有主要操作系统,包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在彻底改变计算机视觉和混合现实应用程序的开发。 Ocean 主要使用 C 编写,包括计算机视觉、几何、媒体处理、网络和渲染&#x…

sentinel源码分析: dashboard与微服务的交互、pull模式持久化

文章目录 原始方式微服务端规则如何保存规则如何加载进内存微服务端接收控制台请求控制台推送规则总结 pull拉模式官方demo如何整合Spring Cloud整合Spring Cloud 前置知识 SentinelResource的实现原理、SphU.entry()方法中ProcessorSlotChain链、entry.exit() 建议先会使用se…

鸿蒙系统在服装RFID管理中的应用:打造智能零售新时代

​随着物联网技术的迅速发展,服装零售行业正面临着新的变革与挑战。鸿蒙系统作为新一代智能操作系统,结合RFID技术,为服装行业提供了高效、智能的管理解决方案。常达智能物联,作为RFID技术的领先企业,致力于将鸿蒙系统…

基于JavaSpringBoot+Vue+uniapp微信小程序校园宿舍管理系统设计与实现

基于JavaSpringBootVueuniapp微信小程序实现校园宿舍管理系统设计与实现 目录 第一章 绪论 1.1 研究背景 1.2 研究现状 1.3 研究内容 第二章 相关技术介绍 2.1 Java语言 2.2 HTML网页技术 2.3 MySQL数据库 2.4 Springboot 框架介绍 2.5 VueJS介绍 2.6 ElementUI介绍…

7-1、2、3 IPFS介绍使用及浏览器交互(react+区块链实战)

7-1、2、3 IPFS介绍使用及浏览器交互(react区块链实战) 7-1 ipfs介绍7-2 IPFS-desktop使用7-3 reactipfs-api浏览器和ipfs交互 7-1 ipfs介绍 IPFS区块链上的文件系统 https://ipfs.io/ 这个网站本身是需要科学上网的 Ipfs是点对点的分布式系统 无限…

如何在 Android Studio 中导出并在 IntelliJ IDEA 中查看应用的 SQLite 数据库

在 Android 应用开发过程中,调试和查看应用内的数据库内容是常见的需求。本文将介绍如何使用 Android Studio 导出应用的 SQLite 数据库,并在 IntelliJ IDEA 中查看该数据库。 步骤一:在设备上运行您的应用 首先,确保您的应用已…

5G-A通感融合赋能低空经济-RedCap芯片在无人机中的应用

1. 引言 随着低空经济的迅速崛起,无人机在物流、巡检、农业等多个领域的应用日益广泛。低空飞行器的高效、安全通信成为制约低空经济发展的关键技术瓶颈。5G-A通感一体化技术通过整合通信与感知功能,为低空网络提供了强大的技术支持。本文探讨了5G-A通感…

未来互联网的新篇章:深度解析Facebook的技术与战略

随着科技的飞速发展和社会的不断变迁,互联网作为全球信息交流的重要平台,正经历着前所未有的变革和演进。作为全球最大的社交媒体平台之一,Facebook不仅是人们沟通、分享和互动的重要场所,更是科技创新和数字化进程的推动者。本文…

自己动手写一个滑动验证码组件(后端为Spring Boot项目)

近期参加的项目,主管丢给我一个任务,说要支持滑动验证码。我身为50岁的软件攻城狮,当时正背着双手,好像一个受训的保安似的,中规中矩地参加每日站会,心想滑动验证码在今时今日已经是标配了,司空…

数据结构——考研笔记(二)线性表的定义和线性表之顺序表

文章目录 二、线性表2.1 定义、基本操作2.1.1 知识总览2.1.2 线性表的定义2.1.3 线性表的基本操作2.1.4 知识回顾与重要考点 2.2 顺序表2.2.1 知识总览2.2.2 顺序表的定义2.2.3 顺序表的实现——静态分配2.2.4 顺序表的实现——动态分配2.2.5 知识回顾与重要考点2.2.6 顺序表的…

如何在Linux上如何配置虚拟主机

在Linux上配置虚拟主机可以通过使用Apache HTTP服务器来实现。Apache是一个开源的跨平台的Web服务器软件,可以在多种操作系统上运行并支持虚拟主机的配置。 以下是在Linux上配置虚拟主机的步骤: 安装Apache HTTP服务器 在终端中运行以下命令来安装Apache…

通过vm可以访问那些属性——06

1.通过vue实例都可以访问那些属性?(通过vm都可以vm.什么) vue实例中的属性很多。有的以$开始,有的以_开始。 所有以$开始的属性,可以看做是公开的属性,这些属性是提供给程序员使用的 所有以_开始的属性&…

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

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

系统架构设计师教程(清华第2版)<第2章 计算机系统基础知识>解读

系统架构设计师教程 第二章 计算机系统基础知识-2.1计算机系统概述 2.2 计算机硬件 2.1 计算机系统概述2.2 计算机硬件2.2.1 计算机硬件组成2.2.2 处理器2.2.2.1 控制单元(CU)2.2.2.2 算术逻辑单元(ALU)2.2.2.3 指令集2.2.2.3.1 CISC的特点2.2.2.3.2 RISC的特点2.2.3 存储器2.2…

Lottery 分布式抽奖(个人向记录总结)

1.搭建(DDDRPC)架构 DDD——微服务架构(微服务是对系统拆分的方式) (Domain-Driven Design 领域驱动设计) DDD与MVC同属微服务架构 是由Eric Evans最先提出,目的是对软件所涉及到的领域进行建…

html(抽奖设计)

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>抽奖</title><style type"text/css">* {margin: 0;padding: 0;}.container {width: 800px;height: 800px;border: 1px dashed red;position: absolut…

【学术会议征稿】第三届智能电网与能源系统国际学术会议

第三届智能电网与能源系统国际学术会议 2024 3rd International Conference on Smart Grid and Energy Systems 第三届智能电网与能源系统国际学术会议&#xff08;SGES 2024&#xff09;将于2024年10月25日-27日在郑州召开。 智能电网可以优化能源布局&#xff0c;让现有能源…

C++之多态使用小结

1、多态定义 1.1 多态概念 C多态性&#xff08;Polymorphism&#xff09;是面向对象编程(OOP)的一个重要特性之一&#xff0c;它允许我们使用统一的接口来处理不同类型的对象。多态性使得程序更加灵活、可扩展并且易于维护。 通俗来说&#xff0c;就是多种形态&#xff0…

Java小白入门到实战应用教程-开发环境搭建-IDEA2024安装激huo详细教程

writer:eleven 安装IDEA2024 一、下载IDEA 推荐大家去官网下载 我这里也给大家直接准备了安装包&#xff0c;和激huo教程&#xff0c;大家可以自行下载使用。 注意&#xff1a;激huo教程只用于学习交流&#xff0c;不可商用。 IDEA2024安装包及激huo教程 说明&#xff1a…

stm32入门-----初识stm32

目录 前言 ARM stm32 1.stm32家族 2.stm32的外设资源 3.命名规则 4.系统结构 5.引脚定义 6.启动配置 7.STM32F103C8T6芯片 8.STM32F103C8T6芯片原理图与最小系统电路 前言 已经很久没跟新了&#xff0c;上次发文的时候是好几个月之前了&#xff0c;现在我是想去学习st…