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

我们第一个学习要点就是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个配置。

 

1.版权归本作者(一个早起的程序员)所有;

2.未经原作者允许不得转载本文内容,否则将视为侵权;

3.转载或者引用本文内容请注明来源及原作者;

4.对于不遵守此声明或者其他违法使用本文内容者,本人依法保留追究权等。

下面是我的个人微信公众号,关注【一个早起的程序员】精彩系列文章每天不断。

  • 41
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
gu8ConfigDescriptor是一个USB配置描述符数组,用于描述USB设备的配置信息。它通常由USB设备的制造商在设备固件中定义,由USB主机在插入设备时读取。 USB配置描述符包含了USB设备的配置信息,包括配置的唯一标识符、配置的描述信息、配置所需的最大功率、以及该配置所包含的所有接口和其他描述符的信息。 以下是一个典型的USB配置描述符的格式: ``` typedef struct { uint8_t bLength; // 描述符长度 uint8_t bDescriptorType; // 描述符类型 uint16_t wTotalLength; // 描述符总长度 uint8_t bNumInterfaces; // 接口数目 uint8_t bConfigurationValue; // 配置唯一标识符 uint8_t iConfiguration; // 配置描述信息 uint8_t bmAttributes; // 配置属性 uint8_t bMaxPower; // 配置所需的最大功率 } USB_ConfigurationDescriptorTypeDef; ``` 其中,bLength字段表示该描述符的长度;bDescriptorType字段表示该描述符类型,这里应该为0x02,表示该描述符是一个配置描述符;wTotalLength字段表示该配置描述符及其后续的所有描述符的总长度;bNumInterfaces字段表示该配置所包含的接口数目;bConfigurationValue字段表示该配置的唯一标识符;iConfiguration字段表示该配置的描述信息的字符串索引;bmAttributes字段表示该配置的属性,包括是否需要供电、是否支持远程唤醒等;bMaxPower字段表示该配置所需的最大功率,单位为2mA。 在gu8ConfigDescriptor描述符数组中,每个USB配置描述符之后通常还会包括该配置所包含的所有接口的描述符和其他描述符,如字符串描述符、端点描述符等。这些描述符的总长度应该等于wTotalLength字段指定的长度。通过读取gu8ConfigDescriptor数组中的各个描述符USB主机可以了解到USB设备支持的配置信息、接口信息和传输方式等,从而选择最合适的驱动程序进行通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个早起的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值