首页 > 其他分享 >USB协议详解第3讲(USB描述符-设备描述符)

USB协议详解第3讲(USB描述符-设备描述符)

时间:2024-08-11 09:54:33浏览次数:10  
标签:USB USBD 描述符 详解 字节 设备 define

我们第一个学习要点就是USB描述符,所谓描述符其实就是C语言里面的结构体或者数组,数组包含的信息说明当前的设备具有哪些特征。USB描述符有设备描述符配置描述符接口描述符端点描述符字符串描述符,HID设备有HID描述符报告描述符物理描述符。我们先学会每个描述符的细节,我会写的非常详细且简洁,后面在学习USB枚举的时候会通过抓包和波形来学习每一个描述符在总线上的作用,并且会介绍每一个描述符是在什么时候以哪种方式在总线上进行传输的,今天主要是学习USB设备描述符的组成。

设备描述符是USB主机枚举USB设备申请的第1个描述符,每个设备有且仅有一个设备描述符,也就是大家以后看到的任何的USB设备都只有一个设备描述符数组,设备描述符的长度是18字节,下面我们来学习设备描述符数据结构,看看USB设备具有哪些特征,它的结构我们可以通过下面的表格来逐一了解。

STM32 设备描述符代码实现如下:

	#define 	USB_DEVICE_DESCRIPTOR_TYPE              	0x01		// 设备描述符类别
	#define 	USB_OTG_MAX_EP0_SIZE                 		64			// 端点0支持的最大包长
	#define 	USBD_VID                        			0x0483		// 厂商ID		
	#define 	USBD_PID                       		 		0xDF11		// 产品ID
	#define  	USBD_IDX_MFC_STR                            0x01 		// 厂商字符串的索引
	#define  	USBD_IDX_PRODUCT_STR                        0x02		// 产品字符串的索引
	#define  	USBD_IDX_SERIAL_STR                         0x03		// 产品序列号字符串的索引
	#define 	USBD_CFG_MAX_NUM                			1 			// 设备的配置数	
	/* USB Standard Device Descriptor */
	uint8_t USBD_DeviceDesc[USB_SIZ_DEVICE_DESC] =
	  {
	    0x12,                       /*bLength */
	    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
	    0x00,                       /*bcdUSB */
	    0x02,
	    0x00,                       /*bDeviceClass*/
	    0x00,                       /*bDeviceSubClass*/
	    0x00,                       /*bDeviceProtocol*/
	    USB_OTG_MAX_EP0_SIZE,      /*bMaxPacketSize*/
	    LOBYTE(USBD_VID),           /*idVendor low*/
	    HIBYTE(USBD_VID),           /*idVendor high*/
	    LOBYTE(USBD_PID),           /*idVendor low*/
	    HIBYTE(USBD_PID),           /*idVendor high*/
	    0x00,                       /*bcdDevice rel. 2.00*/
	    0x02,
	    USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/
	    USBD_IDX_PRODUCT_STR,       /*Index of product string*/
	    USBD_IDX_SERIAL_STR,        /*Index of serial number string*/
	    USBD_CFG_MAX_NUM            /*bNumConfigurations*/
	  } ; /* USB_DeviceDescriptor */

下面来介绍设备描述符每一个内容的详细含义(所有的描述符都是小端格式,先低后高)

(1)bLength

描述符长度(18字节,十六进制为0x12),就是标志描述符数据结构的长度。

(2)bDescriptorType

bDescriptorType代表了本描述符的类型,设备描述符为0x01。所有的描述符类型表示如下图,大家以后也可以速查:

(3)bcdUSB

USB协议版本,表示形式0xJJMN版本JJ.M.N(JJ - 主要版本号,M - 次要版本号,N - 次要版本)

例子:如果是USB2.0,写成:0200H;如果是USB1.1,写成:0110H 如果是USB3.11,写成:0311H

(4)bDeviceClass、bDeviceSubClass、bDeviceProtocol

bDeviceClass、bDeviceSubClass、bDeviceProtocol分别代表设备类型,子类型,设备使用的协议,USB-IF区分设备类分了三个等级(类-子类-协议码)其中,类包含人机交互类、图像类、无线类、音频类等等,子类比如音频类的音频控制、音频流等等,协议比如人机接口类中的鼠标、键盘、触摸屏等,为何会有这么多USB的Class分类,子分类,设备协议。我们要知道,USB协议设计的目的,就是为实现通用,用单一的USB接口取代之前种类繁多的各种其他接口。而为了取代其他各种接口,那意味着就要实现各种设备所对应的各种功能。如下图显示USB设备的各种类别,USB设备类信息更详细内容可进入https://www.usb.org/defined-class-codes查看。

(5)bMaxPackeSize0

就是端点一次最大传多少个字节。USB协议里有规定,端点0最低8字节,端点的最大传输大小和USB速度等级以及传输类型有关,控制传输一般使用端点0,低速最大8字节,全速和高速最大传输64字节,如下图:

(6)idVender

厂商ID,就是个2字节的编号,由USB协议分配,厂商申请时需要交费。自己随便写的话,仅限于学习、测试的情况下,不能用做产品。

(7)idProduct

产品ID,厂家自己随便定义。

(8)bcdDevice

产品版本号,厂家自己随便定义。

(9)iManufacturer

描述厂商的字符串的索引,为0则表示没有,后面详细讲解。

(10)iProduct

描述产品的字符串的索引,为0则表示没有,后面详细讲解。

(11)iSerialNumber

产品序列号字符串的索引,为0则表示没有,后面详细讲解。

(12)bNumConfigurations

指示设备由多少个配置,前面提到过,一个USB可能有多个配置,一般USB产品都是1个配置。

标签:USB,USBD,描述符,详解,字节,设备,define
From: https://www.cnblogs.com/linhaostudy/p/18353120

相关文章

  • USB 控制写传输、控制读传输、无数据控制传输都是在什么场景下?
    在USB通信中,控制传输(ControlTransfer)是一个非常常见且重要的传输类型,主要用于配置设备、查询设备状态以及发送和接收命令。控制传输有三种主要形式:控制写传输(ControlWriteTransfer)、控制读传输(ControlReadTransfer)和无数据控制传输(NoDataControlTransfer)。这些传输类型......
  • 【数据结构】—— 内部排序算法详解
    1、前言2、常见排序算法3、排序算法实现3.1直接插入排序3.2希尔排序3.3选择排序3.4堆排序3.5冒泡排序3.6快速排序3.6.1单趟排序hoare法挖坑法双指针法3.6.2非递归实现3.6.3常见问题基准值的选取小区间优化3.7归并排序3.7.1递归实现3.7.2非递归实现3.8......
  • Python数据结构:列表详解(创建、访问、修改、列表方法)①
    @[toc]Python中的列表是一个非常强大的数据结构,它允许我们存储、访问和操作一系列的数据。列表可以包含任何类型的对象,包括数字、字符串、甚至其他列表。本文将详细介绍Python列表的创建、访问、修改以及列表方法,并附上一个综合的例子,全面展示列表在实际编程中的应用。一......
  • USB协议详解第1讲(核心概念通俗理解)
    0.概括USB协议学习中最重要几个概念如下,没有提及的就是对USB协议学习中不重要的或者编程不需要用到的。大家也不用着急,概念必须要学会,否则都不知道下面这些东西是什么还学什么通用串行总线协议,大家也不用怕,其实也没有那么高深莫测。1.USB传输(Transfer)2.USB传输中事务(Transactio......
  • SMA2:代码实现详解——Image Encoder篇(FpnNeck章)
    SMA2:代码实现详解——ImageEncoder篇(FpnNeck)总配置YAML文件、OmegaConf和hydraSAM2的官方实现是使用yaml文件来配置整体的模型结构与参数的。关键代码如下:defbuild_sam2(config_file,ckpt_path=None,device="cuda",mode="eval",hydra_overr......
  • 【Rust光年纪】探秘Rust地理空间数据处理利器:详解六大库
    探秘Rust地理空间数据处理与索引库:六大利器揭秘前言地理空间数据处理和空间索引是当今许多应用程序的重要组成部分,因此使用Rust语言开发的相关库具有极大的实用价值。本文将介绍几个用于处理地理空间数据和进行空间索引的Rust库,包括quadtree-rs、spatial、R-tree、Geosp......
  • RWKV模型详解与开源代码
    RWKV模型详解目录RWKV模型详解1.背景与简介2.RWKV原理与模型介绍2.1架构2.2TokenShift2.3WKV操作符2.4输出门控2.5Transformer-like训练2.6RNN-like推理2.7额外优化3.与现有大模型对比4.开源代码(代码来自论文中的开源链接:[RWKV](https://github.com/Blink......
  • MySQL基础详解(2)
    文章目录多表查询MySQL函数数字函数字符串函数日期函数高级函数使用Python操作MySQL1、安装第三方模块pymysql2、操作MySQLMySQL中的多表查询是数据库操作中非常常见且重要的一个环节,多表查询是数据库查询中非常强大的功能,能够让你根据需要从多个表中提取和组合数......
  • MySQL基础详解(1)
    文章目录Sql1.什么是Sql2、SQL通用语法3、SQL分类DDL:操作数据库、表3.1操作数据库:CRUD3.2操作表CRUDDML:增删改表中数据1.添加数据:2.删除数据:3.修改数据:DQL:查询表中的记录1.语法:2.基础查询3.条件查询4.排序查询其他函数5.聚合函数6.分组查询7.分页查询:DCL:管理用户......
  • Java IO 流详解
    概述流是一个抽象的概念,代表了数据的无结构化传递。流的本质是数据在不同设备之间的传输。在Java中,数据的读取和写入都是以流的方式进行的在Java中,根据数据流向的不同,可以将流分为输入(Input)流和输出(Output)流。根据单位的不同,可以将流分为字节流和字符流。根据等级的不同,可以......