USB协议详解第5讲(USB描述符-接口描述符)

news/2024/11/14 14:29:20/文章来源:https://www.cnblogs.com/linhaostudy/p/18353861

1.USB描述符

USB描述符有设备描述符、标准配置描述符接口描述符端点描述符字符串描述符,HID设备有HID描述符报告描述符物理描述符今天主要是学习USB接口描述符的组成。

2.接口描述符组成

前面讲了设备描述符和标准配置描述符,本篇我们讲解接口描述符。首先要明确的一点是接口描述符不能单独返回给USB主机,主机会请求获得配置描述符集合,配置描述符集合主要由标准配置描述符、接口描述符、端点描述符、HID描述符,报告描述符和物理描述符单独返回给主机。接口描述符包含9个字节,组成如下:

3.STM32配置描述符集合代码(必须按照顺序)

/* USB Configuration Descriptor */
const uint8_t CustomHID_ConfigDescriptor[CUSTOMHID_SIZ_CONFIG_DESC] =
{
//
// 标准配置描述符
//	0x09, /* bLength: Configuation Descriptor size */USB_CONFIGURATION_DESCRIPTOR_TYPE, 	/* bDescriptorType: Configuration */CUSTOMHID_SIZ_CONFIG_DESC,			/* wTotalLength low : Bytes returned */0x00,								/* wTotalLength high: Bytes returned */0x01,         /* bNumInterfaces: 1 interface */0x01,         /* bConfigurationValue: Configuration value */0x00,         /* iConfiguration: Index of string descriptor describing the configuration*/0xC0,         /* bmAttributes: Bus powered *//*Bus powered: 7th bit, Self Powered: 6th bit, Remote wakeup: 5th bit, reserved: 4..0 bits */0x96,         /* MaxPower 300 mA: this current is used for detecting Vbus *///
// 接口描述符
//		/************** Descriptor of Custom HID interface ****************//* 09 */0x09,         						/* bLength: Interface Descriptor size */USB_INTERFACE_DESCRIPTOR_TYPE,		/* bDescriptorType: Interface descriptor type */0x00,         /* bInterfaceNumber: Number of Interface */0x00,         /* bAlternateSetting: Alternate setting */0x02,         /* bNumEndpoints 此接口有两个端点 */0x03,         /* bInterfaceClass: HID */0x00,         /* bInterfaceSubClass : 1=BOOT, 0=no boot */0x00,         /* nInterfaceProtocol : 0=none, 1=keyboard, 2=mouse */0,            /* iInterface: Index of string descriptor *///
// HID描述符(后续讲解)
//		/******************** Descriptor of Custom HID HID ********************//* 18 */0x09,         /* bLength: HID Descriptor size */HID_DESCRIPTOR_TYPE, /* bDescriptorType: HID */0x10,         /* bcdHID: HID Class Spec release number */0x01,0x00,         /* bCountryCode: Hardware target country 国家代码 */0x01,         /* bNumDescriptors: Number of HID class descriptors to follow类别描述符数目(至少有一个报表描述符)*/0x22,         /* bDescriptorType 报告描述符 */CUSTOMHID_SIZ_REPORT_DESC,	/* wItemLength: Total length of Report descriptor 报告描述符大小 */0x00,						/* 标志类别描述符说明结束 */ //
// 端点1描述符
//		/******************** Descriptor of Custom HID endpoints ******************//* 27 */0x07,          /* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType: */0x82,          /* bEndpointAddress: Endpoint Address (IN) */               // bit 3...0 : the endpoint number// bit 6...4 : reserved// bit 7     : 0(OUT), 1(IN)0x03,          /* bmAttributes: Interrupt endpoint */0x40,          /* wMaxPacketSize: 64 Bytes max */0x00,0x02,          /* bInterval: Polling Interval (2 ms) *//* 34 *///
// 端点2描述符
//		0x07,	/* bLength: Endpoint Descriptor size */USB_ENDPOINT_DESCRIPTOR_TYPE,	/* bDescriptorType: *//*	Endpoint descriptor type */0x01,	/* bEndpointAddress: *//*	Endpoint Address (OUT) */0x03,	/* bmAttributes: Interrupt endpoint */0x40,	/* wMaxPacketSize: 64 Bytes max  */0x00,0x02,	/* bInterval: Polling Interval (2 ms) *//* 41 */
}; /* CustomHID_ConfigDescriptor */

4.接口描述符组成详解

1.bLength

配置描述符的长度。

2.bDescriptorType

描述符类型,接口描述符为0x04。描述符的结构开头是一样的,都是先说描述符长度,然后说类型,每种描述符的类型是不一样的,如下表格,可速查。

image

3.bInterfaceNumber

接口编号。如果一个配置有多个接口的话,那么每个接口的编号都有一个独立的编号,编号从0开始递增。这里可以设置为0。

4.bAlternateSetting

备用接口编号,一般很少用,设置为0。

5.bNumEndpoints

该接口使用的端点个数,前面讲过一个接口就是一种功能,每个接口需要用户为其分配端点来实现对应的功能,注意一点,这个端点个数不包括端点0。

6.bInterfaceClass、bInterfaceSubClass、bInterfaceProtocol

当设备描述符设备类型bDeviceClass为0时,也就是指示用接口描述符来标识类别,此时用接口类、接口子类、接口协议来说明USB设备此功能所属的类别。如下图显示设备和接口的各种类别,这个类别给设备描述符用还是给接口描述符用要看Descriptor Usage标识(如图中所示)。我们如果单纯用作数据传输的话,直接写FFh就好,代表着用户自定义。USB类信息更详细内容可进入https://www.usb.org/defined-class-codes查看。

7.iInterface

描述此接口的字串索引值,没有的话一般都是0。

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

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

相关文章

RabbitMQ Web管理界面简介

Overview TotalsQueued messagesReadyNumber of messages that are avaliable to be delivered now.待消费的消息数量 一般来说,如果队列中ready状态的消息数量比较多,则说明消费者的处理能力可能不足,可以考虑适当增加消费者UnackedNumber of messages for which the serve…

并发修改异常 ConcurrentModificationException详解

并发修改异常 ConcurrentModificationException详解异常产生原因:并发修改异常指的是在并发环境下,当方法检测到对象的并发修改,但不允许这种修改时,抛出该异常。异常抛出在ArrayList类中的checkForComodification()方法中。checkForComodification()方法实际上就是当modCo…

2024暑假集训测试21

前言比赛链接。T1 写得和正解差不多但少了个细节炸 long long 了;T2 只会 \(n^3\) 的本来只有 \(50pts\),但考虑出题人大概率会搞一个 \(n\) 越大 \(T\) 越小,所以对于 \(n\) 很大的直接 \(rand\) 正确率还是有的,所以获得了 \(80pts\);T3 不会;T4 没有和 \(n\) 取 \(\m…

线性整数规划的三道经典例题

目录一、背包问题1.模型建立2.代码实现二、指派问题1.模型建立2.代码实现(1)输入目标函数系数(2)输入不等式约束(3)输入等式约束(4)调用函数求解三、钢管切割问题1.问题分析2.模型建立(1)利用枚举法找到料头小于等于0.9的切割方法(2)得到目标函数与约束3.代码实现(…

qt 设计界面中 scrollarea等子控件内部widget布局方法

默认这个右键布局里的选项为灰色,点不了,可以先往widget中拖一个按钮进去,然后再右键布局,然后再把按钮删掉,就相当于在设计界面 就设置好布局了

DataWhale-2024夏令营第四期-从零入门AI生图原理实践-学习笔记

DataWhale-2024夏令营第四期-从零入门AI生图原理&实践-学习笔记 Datawhale (linklearner.com)学习链接 AI生图基础知识 一、文生图(Text-to-Image Generation)历史随着深度学习的发展,近些年来越来越多的AI生图效果通过大语言模型得到了一定的提升。文生图的历史:文生图的…

036.Vue3入门,组件的生命周期

1、App.vue代码如下:<template><div><h3>主页面</h3><button @click="change">改变</button></div> </template><script> export default {beforeCreate() { console.log(beforeCreate) },created() { conso…

035.Vue3入门,使用具名插槽Slot中,同时显示主页面和多个插槽页面内容

1、App.vue代码如下:<template><div><h3>主页面</h3><Slot001><template #s1="slotProps"><h4>{{ msg }} === {{ slotProps.msg1 }}</h4></template><template #s2="slotProps"><h4>{…

CF1264E Beautiful League 题解

CF1264E 你有一张竞赛图,给你竞赛图中 \(m\) 条边的方向,让你对于没有给定的边确定方向使得整张图的三元环个数最多 \(n \leq 50, m \leq \frac{(n-1)n}{2}\)费用流好题三元环是一个非常难考虑的东西,我们考虑求他的补集:不是三元环的个数最少我们发现不是三元环的情况是存…

一步一步微调小模型

本文记录一下,使用自顶向下的编程法一步步编写微调小语言模型的代码。微调一个语言模型,本质上是把一个已经预训练过的语言模型在一个新的数据集上继续训练。那么一次微调模型的任务,可以分为下面三个大个步骤(不包含evaluation):加载已经预训练好的模型和新的数据集 预处…

最全MySQL面试20题和答案(三)

接第二期的MySQL面试二十题,这是之后的20题!视图 1. 为什么要使用视图?什么是视图?为了提高复杂 SQL 语句的复用性和表操作的安全性,MySQL 数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的…

实战-行业攻防应急响应

实战-行业攻防应急响应简介: 服务器场景操作系统 Ubuntu 服务器账号密码:root/security123 分析流量包在/home/security/security.pcap 相关jar包在/home/security/ruoyi/ruoyi-admin.jar 应急主机: 192.168.0.211 网关: 192.168.0.1/24 其它傀儡机: 段内 本次环境来自某次行…