【usb】winusb 接口设计分析

news/2024/4/20 9:43:32/文章来源:https://blog.csdn.net/C2681595858/article/details/129171307

文章目录

  • 获取interfaceHandle
  • 控制传输
  • Overlapped机制简介
  • 获取端点信息
    • 获取接口信息
    • 获取端点信息
  • 进行批量(bulk)传输和中断(interrupt)传输
  • 管道策略
  • 总结
  • 参考资料

获取interfaceHandle

  • 首先使用CreateFile获取设备操作句柄,DeviceHandle
  • 然后使用WinUsb_Initialize获取接口操作句柄,默认获取设备的第一个接口的操作句柄。

控制传输

BOOL WinUsb_ControlTransfer([in]            WINUSB_INTERFACE_HANDLE InterfaceHandle,[in]            WINUSB_SETUP_PACKET     SetupPacket,[out]           PUCHAR                  Buffer,[in]            ULONG                   BufferLength,[out, optional] PULONG                  LengthTransferred,[in, optional]  LPOVERLAPPED            Overlapped
);
  • InterfaceHandle就是通过上述WinUsb_Initialize获取到的 接口操作句柄。
  • SetupPacket对应usb协议里面的Setup 包。
  • Buffer要发送或者接收数据的缓冲区。
  • BufferLength缓冲区大小。
  • LengthTransferred实际发送或者接收的数据长度。
  • Overlapped用来进行异步传输,如果这个字段没有被设置,那么该接口是同步接口,等本次传输全部完成后,函数才会返回。否则函数立即返回,等传输完成后,通过Overlapped机制进行回调通知。

Overlapped机制简介

获取端点信息

获取接口信息

BOOL WinUsb_QueryInterfaceSettings([in]  WINUSB_INTERFACE_HANDLE   InterfaceHandle,[in]  UCHAR                     AlternateInterfaceNumber,[out] PUSB_INTERFACE_DESCRIPTOR UsbAltInterfaceDescriptor
);
  • USB_INTERFACE_DESCRIPTOR对应USB协议里面的标准接口描述符。通过该参数我们可以知道,接口有多少个端点。

获取端点信息

BOOL WinUsb_QueryPipe([in]  WINUSB_INTERFACE_HANDLE  InterfaceHandle,[in]  UCHAR                    AlternateInterfaceNumber,[in]  UCHAR                    PipeIndex,[out] PWINUSB_PIPE_INFORMATION PipeInformation
);typedef struct _WINUSB_PIPE_INFORMATION {USBD_PIPE_TYPE PipeType;UCHAR          PipeId;USHORT         MaximumPacketSize;UCHAR          Interval;
} WINUSB_PIPE_INFORMATION, *PWINUSB_PIPE_INFORMATION;

知道有多少端点后,我们就可以逐个获取端点信息。

  • WINUSB_PIPE_INFORMATION通过该参数,我们可以知道pipe的类型(控制传输/批量传输/中断传输/等时传输),以及pipe的方向(host-to-device或者device-to-host)。

进行批量(bulk)传输和中断(interrupt)传输

  • 通过上面端点信息,我们可以知道该端点支持什么传输类型以及其数据传输的方向。接着我们就可以根据端点的这些信息进行数据传输。
BOOL WinUsb_ReadPipe([in]            WINUSB_INTERFACE_HANDLE InterfaceHandle,[in]            UCHAR                   PipeID,[out]           PUCHAR                  Buffer,[in]            ULONG                   BufferLength,[out, optional] PULONG                  LengthTransferred,[in, optional]  LPOVERLAPPED            Overlapped
);BOOL WinUsb_WritePipe([in]            WINUSB_INTERFACE_HANDLE InterfaceHandle,[in]            UCHAR                   PipeID,[in]            PUCHAR                  Buffer,[in]            ULONG                   BufferLength,[out, optional] PULONG                  LengthTransferred,[in, optional]  LPOVERLAPPED            Overlapped
);
  • 中断传输和批量传输都使用上面的两个接口传输数据。根据端点信息,我们可以知道管道的传输方向。如果方向是host-to-device,那么就是写,也就是我们需要用WinUsb_WritePipe接口向该端点写数据。
  • 如果方向是device-to-host,那么我们可以用WinUsb_ReadPipe接口从端点读取数据。
  • 和控制传输一样,这两个接口通过Overlapped机制来控制同步或者异步传输。

管道策略

  • 所谓管道策略就是,可以根据需要控制端点的行为。比如设置传输超时时间。或者在发送请求时,如果请求包的大小刚好是端点能发送的最大长度的整数倍,是否需要发送一个零长度的包,等等。接口如下:
BOOL WinUsb_SetPipePolicy([in] WINUSB_INTERFACE_HANDLE InterfaceHandle,[in] UCHAR                   PipeID,[in] ULONG                   PolicyType,[in] ULONG                   ValueLength,[in] PVOID                   Value
);BOOL WinUsb_GetPipePolicy([in]      WINUSB_INTERFACE_HANDLE InterfaceHandle,[in]      UCHAR                   PipeID,[in]      ULONG                   PolicyType,[in, out] PULONG                  ValueLength,[out]     PVOID                   Value
);

总结

  • 对于控制传输和等时传输,winusb分别提供了传输接口。WinUsb_ControlTransfer ,WinUsb_ReadIsochPipeWinUsb_WriteIsochPipe
  • 对于批量传输和中断传输,则统一使用一套接口。WinUsb_ReadPipe, WinUsb_WritePipe
  • 上述接口都通过Overlapped机制来控制同步传输或者异步传输。
  • 可以通过修改管道策略,个性化的控制管道的行为。
  • 除了上述接口,winusb也提供了各种请求,可以灵活使用。比如IOCTL_GENERICUSBFN_GET_INTERFACE_DESCRIPTOR_SET可以获取接口的所有端点信息等。

参考资料

Access a USB device by using WinUSB functions
用于管道策略修改的 WinUSB 函数

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

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

相关文章

一文速学-Adaboost模型算法原理以及实现+Python项目实战

目录 前言 一、Adaboost算法概述 二、Adaboost模型原理 类推 计算原理 特点 适应较小量数据集,训练时间长 三、Python实例运用 AdaBoostClassifier分类 参数 实例实现分类 导入数据集 划分数据集 训练模型 评估算法 模型效果 前言 集成学习的方法在全…

[NOIP2002 普及组] 过河卒

题目描述: 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。 棋盘用坐标表…

干测试5年,经常被开发看不起,现在总算证明了自己····

测试不止是点点点 我感觉我是一个比较有发言权的人吧,我在测试行业摸爬滚打5年,以前经常听到开发对我说,天天的点点点有意思没? 和IT圈外的同学、朋友聊起自己的工作,往往一说自己是测试,无形中也会被大家…

利用global mapper导出等高线 在sketch up制作三维模型

为了做一个地形模型,绞尽脑汁实验了所有能查到的教程,在免费的基础上总体尝试失败,一是需要花钱的插件例如bitmap to mesh,即便能下载到,也是无法安装使用。如果你能下到且安装上,别忘了分享给我。 二是有的…

什么是品牌营销?学会正确推广您的业务

什么是品牌营销? 品牌营销涉及长期战略规划,以推广整个品牌,而不是营销单个产品或服务。它分享了一个引人入胜的故事,以在潜在客户中产生品牌知名度并建立声誉。 面向消费者的品牌使用品牌智能软件来了解人们对其品牌的看法&#…

超级详细的Maven教程

超级详细的 Maven 教程(基础高级) 1. Maven 是什么 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。 一个 Maven 工程有约定的目录结构,约定的目录结构对于 Maven 实现自动化构建而言是必不可少…

10套“2023年软考备考资料”送给你

距离软考考试越来越近了,备考的形势越发紧张了。考点那么多,我们需要抓出常考的大部分知识点。 ​为此,为大家整理了《2023年软考免费备考资料》,内含软考各科目不同类型共10套备考资料。 ​ 第1套:早鸟学习计划&am…

表格内容过多时单行/多行显示

分析 单行多行显示涉及到 table-layout: fixed; 这个属性,默认状态下的属性值是 auto (自动表格布局),两种不同的属性值区别如下: 方法 我在设置表格内容单行/多行显示时采用的方法: table 添加的样式&a…

13- 信用卡匹配 (OpenCV基础) (项目十三) *

项目要点 _, ref cv2.threshold(ref, 10, 255, cv2.THRESH_BINARY_INV) 二值化处理图片, 黑白化图片ref cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度化处理ref_contours, _ cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) 计算轮廓cv2.dr…

xselect 实现已用数据禁止选择

function queryExamtemplate() {layui.$.ajax({url: 接口地址,type: "get",data: {id: id, name: name},//传参数方式 无参[]dataType: "json",contentType: "application/json",success: function (res) {if (res.code 0) {let data [];res.…

滤波算法:经典卡尔曼滤波

卡尔曼滤波实质上就是基于观测值以及估计值二者的数据对真实值进行估计的过程。预测步骤如图1所示: ​图1 卡尔曼滤波原理流程图 假设我们能够得到被测物体的位置和速度的测量值 ​,在已知上一时刻的最优估计值 ​以及它的协方差矩阵 的条件下&#xff…

【数据结构】时间复杂度

🚀write in front🚀 📜所属专栏:初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对…

Nordic nRF芯片FDS模块学习

FDS系统学习 文章目录FDS系统学习一、ROM,RAM,FLASH作用二、ROM,RAM和FLASH在单片中的运作原理三、Flash访问模块FDS用法1. FDS在sdk_config.h中的配置2. fds_register()注册3. fds_record_write()写记录4. fds_record_find()查找5. fds_record_open()读…

常见的排序算法 | 直接插入排序 | 希尔排序 | 选择排序 | 堆排序 | 冒泡排序 | 快速排序 | 归并排序 |(详解,附动图,代码)

思维导图: 一.插入排序 1.直接插入排序(InsertSort) ①手机通讯录时时刻刻都是有序的,新增一个电话号码时,就是使用插入排序的方法将其插入原有的有序序列。 ②打扑克 步骤: ①如果一个序列只有一个数&am…

报表开发难上手?这里有一份 Fastreport 最新中文用户指南,请查收

Fast Reports,Inc.成立于1998年,多年来一直致力于开发快速报表软件,包括应用程序、库和插件。FastReport的报表生成器(VCL平台和.NET平台)、跨平台的多语言脚本引擎FastScript、桌面OLAP FastCube,如今都受到世界各地开…

工赋开发者社区 | 工业数字孪生:西门子工业网络与设备虚拟调试案例(TIA+MCD+SINETPLAN)

PART1案例背景及基本情况新生产系统的设计和实施通常是耗时且高成本的过程,完成设计、采购、安装后,在移交生产运行之前还需要一个阶段,即调试阶段。如果在开发过程中的任何地方出现了错误而没有被发现,那么每个开发阶段的错误成本…

建议收藏!数据可视化大屏设计必备步骤

相信对于从事大数据相关的人员来说,数据的可视化大屏是最能展现自己工作价值的一个途径。可视化大屏就是数据分析的最后成果的展示,而如果能设计出更直观、更酷炫、更具有科技感的大屏,更能获得客户的青睐。 那么客户喜欢的究竟是怎样的可视化…

嵌入式开发:在嵌入式应用程序中混合C和C++

许多嵌入式应用程序仍使用c语言编写,但越来越多的嵌入式开发人员现在使用C语言编写程序。某些应用程序甚至共享这两种语言。这有意义吗?C是嵌入式应用中最常用的编程语言。多年来,人们一直期待着向C过渡,但过渡速度相当缓慢。但是&#xff0…

Appium自动化测试 Inspector定位Webview/H5页面元素

目录操作步骤Python操作该混合App代码Appium在操作混合App或Android App的H5页面时, 常常需要定位H5页面中的元素, 传统方式是 FQ 使用Chrome://inspect来定位元素, 环境准备相当繁琐, 不仅需要想办法FQ, 而且还需要Android设备安装Google框架以及手机版Chrome浏览器以及相应的…

问题记录-网卡丢失导致Temporary failure in name resolution

没网了,ifconfig查看一下 发现是网卡丢失 使用如下命令: sudo ifconfig eth0 up sudo dhclient解决