USB2.0协议学习笔记---描述符
阅读原文时间:2022年04月23日阅读:1

USB设备描述符

字段名

长  度(字节)

地址偏移

含           义

bLenth

1

0

描述符长度

bDescriptorType

1

1

描述符类型 (这里为 1)

bcdUSB

2

2

USB规范版本号(BCD码)

bDeviceClass

1

4

类代码

bDeviceSubClass

1

5

子类代码

bDeviceProtocol

1

6

协议代码

bMaxPackSize0

1

7

端点0最大支持数据包长度

idVendor

2

9

供应商ID

idProduct

2

11

产品ID

bcdDevice

2

13

设备版本号(BCD码)

iManufacturer

1

14

供应商字符串描述索引

iProduct

1

15

产品字符描述字符串索引

iSerialNumber

1

16

产品序列好描述符索引

bNumConfigurations

1

17

所支持的配置数

bLenth :该描述符的长度,单位字节一般USB设备描述符都是固定的18字节即0x12;

bDescriptorType :描述符种类代码。USB设备描述符为0x01;

bcdUSB :USB协议版本,采用BCD编码如2.0就是0x0200,但是USB是小端结构,因此实际就是 【0x00 ,0x20】

bDeviceClass: 设备类代码,大多数是0而在接口描述符中的bInterfaceClass中指定该接口实现的功能,注意的是当bDeviceClass为0时,bDeviceSubClass也必须为0;

bDeviceSubClass :配合bDeviceClass代码决定,USB标准定义。

bDeviceProtocol:设备所使用类的协议,如果没有定义类就为0 ,字段为0xFF表示使用自定义协议

bMaxPackSize0 :端点0的最大包长,最小是8,因为枚举过程,第一次获取设备描述符只会读取一次,因此需要在这个包中包含USB设备描述符的长度

idVendor:厂商ID VID,需要交保护费申请。

idProduct :产品ID PID由厂商自己定义。通常主机会根据VID和PID来加载本地或源的驱动程序。

bcdDevice :设备版本号,也采用BCD码,同理USB协议版本号。

iSerialNumber :设备序列号字符串索引值。

bNumConfigurations :设备有多少种配置,大部分USB设备就只有一个配置

USB配置描述符

需要注意的是在有些时候,配置描述符中会包含接口描述符,特殊类描述符,端点描述符等信息,并在主机枚举请求设备配置描述符时一起返回给主机,不能单独返回给主机。

字段名

长  度 (字 节)

地址偏移量

含义

bLenth

1

0

配置描述符长度

bDescriptorType

1

1

配置描述符类型

wTotalLength

2

2

配置信息总长度

bNumInterfaces

1

4

配置接口数

bConfigurationValue

1

5

配置值

iConfiguration

1

6

字符串描述符索引值

bmAttributes

1

7

配置特性

bMaxPower

1

8

最大电流(2mA为单位)

bLenth :该描述符长度

bDescriptorType:描述符类型,配置描述符为0x02

wTotalLength:表示整个配置描述符的总长度,包括配置描述符,接口描述符,类特殊描述符和端点描述符。

bNumInterfaces:配置支持的接口数

bConfigurationValue:每个配置都有一个标识值。

iConfiguration:配置描述符索引。

bmAttributes:描述特性 D7保留,D6辨识供电方式,为1表示自供电的,否则是总线供电,D5标识是否支持远程唤醒(1),D4-D0保留。

bMaxPower:总线供电时的最大电流,如值为100则最大电流为200mA。

USB接口描述符

 字 段 名 

 长 度 (字节)

 地址偏移 

   含  义   

bLenth

1

0

描述符的长度

bDescriptorType

1

1

描述符的类型

bInterfaceNumber

1

2

接口号

bAlterateSetting

1

3

可替换设置值

bNumEndpoint

1

4

端点0以外的端点数

bInterfaceClass

1

5

类代码

bInterfaceSubClass

1

6

子类代码

bInterfaceProtocol

1

7

协议代码

iInterface

1

8

字符串描述符索引值

bLenth: 描述符的长度。

bDescriptorType: 描述符的类型(接口描述符为4)

bInterfaceNumber: 表示该接口的编号,用在配置有多个接口,每个接口有唯一放入编号,从0 开始编号。

bAlterateSetting:接口的备用编号,规则同上。一般不用

bNumEndpoint:该接口使用的端点数,不包括端点0。即如果为0 就只有控制端点

bInterfaceClass:接口使用的类

bInterfaceSubClass:接口使用的子类

bInterfaceProtocol:接口使用的协议。三个一起定义了设备的功能,鼠标键盘就只需要改协议部分就可以。其他两个都是HID类

iInterface:接口字符串描述符的索引值。

USB端点描述符

域 

大小(字节)

偏移

bLenth

1

0

bDescriptorType

1

1

bEndpointAddress

1

2

bmAttributes

1

3

wMaxPackSize

2

4

bInterval

1

6

bLenth: 该描述符的长度(字节)

bDescriptorType: 该描述符的类型(0x05)

bEndpointAddress:端点的地址,D7表示端点的传输方向,为1则为输入,为0则为输出,D3-D0为端点号,其他位没有用。

bmAttributes:一个字节的属性描述字节,D1~D0表示端点传输类型,0 为控制传输,1为等时传输,2为批量传输,3为中断传输。如果为等时传输,D3-D2表示等时传输的类型,0表示无同步,1为异步,2为适配,3为同步;D5-D4辨识用途,0为数据端点,1为反馈端点,2为暗反馈端点,3保留;D7-D6保留。但是如果不是同步传输则只用到D1-D0其他位全部保留。

wMaxPackSize:该端点支持的最大数据长度,对于低速和全速设备而言,D10-D0表示数据包最大长,其他位未用,对于高速设备D12-D11表示每个帧的附件传送次数,具体参考USB标准协议。

bInterval:表示该端点的查询时间,对于中断传输表示查询的帧间隔数;对于其他传输方式参考USB标准协议。

类特殊描述符

有些设备还需要有类特殊描述符,这里拿HID设备举例,HID设备的特殊描述符如下

大小

偏移

说明

bLenth

1

0

描述符长

bDescriptorType

1

1

描述符类型

bcdHID

2

2

HID 协议版本

bCountryCode

1

4

国家代码

bNumDescriptors

1

5

下级描述符数量

bDescriptorType

1

6

下级描述符类型

bDescriptorLength

2

7

下级描述符长度

bDescriptorType

1

9

下级描述符的类型(可选)

wDescriptorLength

2

10

下级描述符的长度(可选)

类比前面描述符的作用这里只需要记一下一下几个字段的意义:

bcdHID:为 HID设备的版本,用BCD码表示,两个字节,如下表示版本为1.10

bCountryCode:  国家代码(这个用在特殊情况下 比如键盘,美式键盘等)。

bNumDescriptors:下级描述符的数量,在HID设备中至少有一个是报告描述符。

bDescriptorType:HID报告描述符为0x22.

bDescriptorLength:对应描述符的大小

因为下级描述符至少有一个因此,HID类描述至少是10个字节,底下就是一个HID描述符的例子。

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,

看了这么多,现在我对USB协议的理解是这样的:USB设备可以理解为一个类,描述符就是这个类的属性,而枚举过程就是host主动请求调用,获取属性的方法,从而知道这个类的属性,其余在主机和设备数据交换过程的处理细节就是设备类的方法,我们实现一个USB设备就是在定义设备属性和定义方法接口的过程,只是定义属性需要了解到以上USB标准中的这些规则(profile),同时枚举过程的一些操作就是必须要实现的接口,其余的部分就要看我们的设备,设计出来支持的操作有哪些,选择的实现了,好了暂时就这些,后面还有一部分概念需要学习,待续。。。

参考:《圈圈教你玩USB(第二版)》

2019-06-02 11:39:57

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器