USB学习笔记(2)USB协议
本文对前面提到的USB枚举过程中的标准请求以及各种描述符做出大致解释,方便后面的实操。
1. USB标准请求
USB协议定义了一个8字节的标准设备请求,主要用在设备的枚举过程。这8字节的数据是在控制传输的建立过程通过默认控制端点0发出的。在这8字节的数据中,包含了数据过程所需要传输数据的传输方向,长度以及数据类型。
USB标准设备请求的数据结构:
偏移量/字节 | 域 | 大小/字节 | 取值 | 说明 |
---|---|---|---|---|
0 | bmRequestType | 1 | 位图 | 请求特性:【D7:数据的传输方向;0-主机到设备;1-设备到主机】【D6-5:请求的类型;0-标准请求;1-类;2-厂商;3-保留】【D4-0:请求的接收者;0-设备;1-接口;2-端点;3-其他;4~保留】 |
1 | bRequest | 1 | 数值 | 请求代码 |
2 | wValue | 2 | 数值 | 该域的意义由具体的请求决定 |
4 | wIndex | 2 | 索引或偏移量 | 该域的意义由具体的请求决定 |
6 | wLength | 2 | 字节数 | 数据过程所需要传输的字节数 |
针对标准请求(bmRequestType[6:5]=00),USB协议定义了11个 标准请求代码(bRequest):
bmRequestType | bRequest | wValue | wIndex | wLength | 数据过程 |
---|---|---|---|---|---|
0x00/0x01/0x02 | 1(CLEAR_FEATURE) | 特性选择 | 0/接口号/端点号 | 0 | 无 |
0x80 | 8(GET_CONFIGURATION) | 0 | 0 | 1 | 配置值 |
0x80 | 6(GET_DESCRIPTOR) | 描述符类型(高字节)或索引(低字节) | 0或者语言ID | 描述符长度 | 描述符 |
0x81 | 10(GET_INTERFACE) | 0 | 接口号 | 1 | 备用接口号 |
0x80/0x81/0x82 | 0(GET_STATUS) | 0 | 0/接口号/端点号 | 2 | 设备,接口或者端点状态 |
0x00 | 5(SET_ADDRESS) | 设备地址 | 0 | 0 | 无 |
0x00 | 9(SET_CONFIGURATION) | 配置值 | 0 | 0 | 无 |
0x00 | 7(SET_DESCRIPTOR) | 描述符类型和索引 | 0或语言ID | 描述符长度 | 描述符 |
0x00/0x01/0x02 | 3(SET_FEATURE) | 特性选择 | 0/接口号/端点号 | 0 | 没有 |
0x01 | 11(SET_INTERFACE) | 备用接口号 | 接口号 | 0 | 无 |
0x82 | 12(SYNCH_FRAME) | 0 | 端点号 | 2 | 帧号 |
2. USB描述符
2.1. 设备描述符(Device Descriptor)
设备描述符主要记录的信息有:设备所使用的USB协议版本号,设备类型,端点0的最大包大小,厂商ID(VID)和产品ID(PID),设备版本号,厂商字符串索引,产品字符串索引,设备序列号索引,可能的配置数等。
设备描述符结构 :
偏移量/字节 | 域 | 大小/字节 | 说明 |
---|---|---|---|
0 | bLength | 1 | 该描述符的长度(18字节) |
1 | bDescriptorType | 1 | 描述符类型(设备描述符为0x01),见表 |
2 | bcdUSB | 2 | 本设备所使用的USB协议版本(USB2.0 0x00 0x02),小端模式 |
4 | bDeviceClass | 1 | 设备所使用的类代码,由USB协会规定,见表;对于大多数标准的USB设备类,该字段通常设置为0;当bDeviceClass为0的时候,下面的bDeviceSubClass和bDeviceProtocol也必须为0;如果bDevice为0xff,表示厂商自定义设备类 |
5 | bDeviceSubClass | 1 | 设备所使用的子类代码,当bDeviceClass不为0或者0xff的时候,由USB协会规定,见表 |
6 | bDeviceProtocol | 1 | 设备所使用的协议,由USB协会规定,见表;为0的时候表示不适用类所定义的协议,为0xff的时候表示厂商自定义协议;bDeviceProtocl与bDeviceClass和bDeviceSubClass结合起来用才有具体意义 |
7 | bMaxPackeSize0 | 1 | 端点0的最大包长度,取值可以为8,16,32,64 |
8 | idVender | 2 | 厂商ID(VID),一般不能随意使用,小端模式 |
10 | idProduct | 2 | 产品ID(PID),小端模式 |
12 | bcdDevice | 2 | 产品版本号,自定义,,小端模式 |
14 | iManufacturer | 1 | 描述厂商字符串的索引值,为0表示没有厂商字符串 |
15 | iProduct | 1 | 描述产品字符串的索引值,为0表示没有产品字符串 |
16 | iSerialNumber | 1 | 设备的序列号字符串的索引值,如果产品VID和PID一样,可以通过这个来区别 |
17 | bNumConfigurations |