USB协议中7中常用的请求。
(1)如何设置usb设备的地址。设置usb设备地址的简略图如下:使用SET_ADDRESS命令:
(2)设置usb的配置与上图类似,只不过区别在于wValue的值为配置的值,bRequest的值为SET_CONFIGURATION。其余与上图一样。
(3)请求usb的设备描述符:
最后获得设备描述符成功。配置描述符的介绍:(以下表格转载自http://usb.baiheee.com/usb_article/usb_spec/usb_cmd_desc.html点击打开链接,并加入自己的理解。)
偏移量 | 域 | 大小 | 值 | 描述 |
0 | bLength | 1 | 数字 | 此描述表的字节数(这是固定的) |
1 | bDecriptorType | 1 | 常量 | 描述符的类型(此处应为0x01,即设备描述符)(固定的) |
2 | bcdUSB | 2 | BCD码 | 此设备与描述表兼容的USB设备说明版本号(BCD 码) |
4 | bDeviceClass | 1 | 类 | 设备类码: |
5 | bDeviceSubClass | 1 | 子类 | 子类掩码 |
6 | bDevicePortocol | 1 | 协议 | 协议码 |
7 | bMaxPacketSize0 | 1 | 数字 | 端点0的最大包大小(仅8,16,32,64 |
8 | idVendor | 2 | ID | 厂商标志(由USB-IF组织赋值) |
10 | idProduct | 2 | ID | 产品标志(由厂商赋值) |
12 | bcdDevice | 2 | BCD 码 | 设备发行号(BCD 码) |
14 | iManufacturer | 1 | 索引 | 描述厂商信息的字符串描述符的索引值。 |
15 | iProduct | 1 | 索引 | 描述产品信息的字串描述符的索引值。 |
16 | iSerialNumber |
1
| 索引 | 描述设备序列号信息的字串描述符的索引值。 |
17 | bNumConfigurations | 1 | 数字 | 可能的配置描述符数目(这个是比较重要的,hosT会根据这个来请求设备描述符) |
设备的类别(bDeviceClass)
| ||
值(十进制)
|
值(十六进制)
| 说明 |
0
|
0x00
| 接口描述符中提供类的值 |
2
|
0x02
| 通信类 |
9
|
0x09
| 集线器类 |
220
|
0xDC
| 用于诊断用途的设备类 |
224
|
0xE0
| 无线通信设备类 |
255
|
0xFF
| 厂商定义的设备类 |
(4):请求配置描述符。
在获得了这个usb设备一共有多少个usb配置后,host开始请求usb的配置描述符。
USB配置描述符的结构 | ||||
偏移量 | 域 | 大小 | 值 | 描述 |
0 | bLength | 1 | 数字 | 此描述表的字节数长度。(固定的) |
1 | bDescriptorType | 1 | 常量 | 配置描述表类型(此处为0x02)(固定的) |
2 | wTotalLength | 2 | 数字 | 此配置信息的总长(包括配置,接口,端点和设备类及厂商定义的描述符) |
4 | bNumInterfaces | 1 | 数字 | 此配置所支持的接口个数(比较重要,依据它来请求接口描述符) |
5 | bCongfigurationValue | 1 | 数字 | 在SetConfiguration()请求中用作参数来选定此配置。 |
6 | iConfiguration | 1 | 索引 | 描述此配置的字串描述表索引(如果有字符串描述符的话,这个就比较重要了); |
7 | bmAttributes | 1 | 位图 | 配置特性: |
8 | MaxPower | 1 | mA | 在此配置下的总线电源耗费量。以 2mA 为一个单位。 |
(5)字符串描述符。这是一种格式最简单的描述符,自然也最没有什么用的描述符。
格式如下:
USB字符串描述符(响应主机请求时返回的表示语言ID的字符串描述符) | ||||
偏移量 | 域 | 大小 | 值 | 描述 |
0 | bLength | 1 | N+2 | 此描述表的字节数(这个长度就不固定了。) |
1 | bDescriptorType | 1 | 常量 | 字串描述表类型(此处应为0x03)(固定的) |
2 | wLANGID[0] | 2 | 数字 | 语言标识(LANGID) |
| … | … | … | … |
N | wLANGID[x] | 2 | 数字 | 语言标识(LANGID) |
(6)接口描述符。
USB接口描述符的结构 | ||||
偏移量 | 域 | 大小 | 值 | 说明 |
0 | bLength | 1 | 数字 | 此表的字节数 |
1 | bDescriptorType | 1 | 常量 | 接口描述表类(此处应为0x04) |
2 | bInterfaceNumber | 1 | 数字 | 接口号,当前配置支持的接口数组索引(从零开始)。 |
3 | bAlternateSetting | 1 | 数字 | 可选设置的索引值。 |
4 | bNumEndpoints | 1 | 数字 | 此接口用的端点数量,如果是零则说明此接口只用缺省控制管道。(依据这个,然后host来读取端点配置) |
5 | bInterfaceClass | 1 | 类 | 接口所属的类值: |
6 | bInterfaceSubClass | 1 | 子类 | 子类码 |
7 | bInterfaceProtocol | 1 | 协议 | 协议码:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一个接口支持设备类相关的请求此域的值指出了设备类说明中所定义的协议. |
8 | iInterface | 1 | 索引 | 描述此接口的字串描述表的索引值。 |
表11、USB协议定义的接口类别(bInterfaceClass) | |
值(十六进制) | 类别 |
0x01 | 音频类 |
0x02 | CDC控制类 |
0x03 | 人机接口类(HID)(鼠标键盘属于这一类) |
0x05 | 物理类 |
0x06 | 图像类 |
0x07 | 打印机类 |
0x08 | 大数据存储类 |
0x09 | 集线器类 |
0x0A | CDC数据类 |
0x0B | 智能卡类 |
0x0D | 安全类 |
0xDC | 诊断设备类 |
0xE0 | 无线控制器类 |
0xFE | 特定应用类(包括红外的桥接器等) |
0xFF | 厂商定义的设备 |
(7)端点描述符。
端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点0(控制端点,一般一个设备只有一个控制端点)为双向端口外,其它均为单向。端点描述符描述了数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。
除了描述符中描述的端点外,每个设备必须要有一个默认的控制型端点,地址为0,它的数据传输为双向,而且没有专门的描述符,只是在设备描述符中定义了它的最大包长度。主机通过此端点向设备发送命令,获得设备的各种描述符的信息,并通过它来配置设备。
USB端点描述符的结构 | ||||
偏移量 | 域 | 大小 | 值 | 说明 |
0 | bLength | 1 | 数字 | 此描述表的字节数长度(固定大小) |
1 | bDescriptorType | 1 | 常量 | 端点描述表类(此处应为0x05) |
2 | bEndpointAddress | 1 | 端点 | 此描述表所描述的端点的地址、方向: |
3 | bmAttributes | 1 | 位图 | 此域的值描述的是在bConfigurationValue域所指的配置下端点的特性。 |
4 | wMaxPacketSize | 2 | 数字 | 大小单位为字节,这个域规定这个端点可以接受的最大的包的长度。D0-D10指出最大的包长。D11-D12为每帧传输的次数(我还没有理解这是什么意思)。 |
6 | bInterval | 1 | 数字 | 周期数据传输端点的时间间隙。 |