1. 查看[知识点]中的枚举过程.
2. 传输过程
USB中存在4种传输,分别是:
控制传输:主要用于在设备连接时对设备进行枚举以及其他因设备而已的特定操作。
中断传输:用于对延迟要求严格、小量数据的可靠传输,如键盘、游戏手柄等。
批量传输:用于对延迟要求宽松,大量数据的可靠传输,如U 盘等。
同步传输:用于对可靠性要求不高的实时数据传输,如摄像头、USB 音响等。
l 设备连接后发生控制传输, 由HOST 向USB设备通过地址0发出
SETUP包共8个字节,它的格式见USB 2.0规范(英文版).pdf的P248.
SETUP包的重点在bRequest字段,见英文版的P250. bRequest包括11种请示,这11种请示如下表
编号 |
请求 |
值 |
说明 |
1 |
CLEAR_FEATURE |
1 |
|
2 |
GET_CONFIGURATION |
8 |
获取配置描述符 |
3 |
GET_DESCRIPTOR |
6 |
获取设备描述符 |
4 |
GET_INTERFACE |
10 |
|
5 |
GET_STATUS |
0 |
|
6 |
SET_ADDRESS |
5 |
|
7 |
SET_CONFIGURATION |
9 |
|
8 |
SET_DESCRIPTOR |
7 |
|
9 |
SET_FEATURE |
3 |
|
10 |
SET_INTERFACE |
11 |
|
11 |
SYNCH_FRAME |
12 |
l 发送时,LSB在前.比方说一个setup包
80 06 00 02 00 00 20 00
它的格式对应于Table 9-2. Format of Setup Data
offset |
value |
field |
|
0 |
bmRequestType |
0x80 |
|
1 |
bRequest |
0x06 |
GET_DESCRIPTOR |
2 |
wValue |
0x0200(00 02 -> 00: LSB 02: MSB) |
02: CONFIGURATION 00: descriptor index 为0 |
4 |
wIndex |
0x0000 |
Language ID=0 |
6 |
wLength |
0x0020(20 00 -> 20: LSB 00: MSB) |
要返回0x20B |
l HOST请求什么DEVICE就响应什么. 请求通过8Byte的setup包发送.共11个请求.
n 请求和响应的对应关系
这里要特别注意的是获取配置描述符请求的响应.它的结构体是这样安排的:
参考 英文版P254
struct configuration_response /* 配置描述符的响应*/ { struct configuration_descriptor configuration_descriptor; struct interface_descriptor interface_descritor; struct endpoint_descriptor endpoint_descriptor[ENDPOINT_NUMBER]; }; 也就是这样的格式: struct configuration_response /* 配置描述符的响应*/ { 配置描述符 第一个接口描述符 第一个接口描述符的所有的端点描述符 第二个接口描述符 第二个接口描述符的所有的端点描述符 .... 第n个接口描述符 第n个接口描述符的所有的端点描述符 }; |
如上 setup 包请求获取configuration descriptor.这时DEVICE的响应是:
09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 81 02 00 02 ff 07 05 02 20 00 02 ff
09 02 20 00 01 01 00 80 32
09 04 00 00 02 08 06 50 00 07 05 81 02 00 02 ff 07 05 02 20 00 02 ff
配置 描述符 Table 9-10 英文版 P265 |
offset |
field |
value |
|
0 |
bLength |
0x09 |
||
1 |
bDescriptorType |
0x02 |
CONFIGURATION |
|
2 |
wTotalLength |
0x0002 (20 00 -> 20: LSB 00: MSB) |
||
4 |
bNumInterfaces |
0x01 |
Language ID=0 |
|
5 |
bConfigurationValue |
0x01 |
要返回0x20B |
|
6 |
iConfiguration |
0x00 |
||
7 |
bmAttributes |
0x80 |
||
8 |
bMaxPower |
0x32 |
2mA*0x32=100mA |
|
接口 描述符 Table 9-12. Standard Interface Descriptor P267 |
9 |
bLength |
0x09 |
|
10 |
bDescriptorType |
0x04 |
INTERFACE |
|
11 |
bInterfaceNumber |
0x00 |
||
12 |
bAlternateSetting |
0x00 |
||
13 |
bNumEndpoints |
0x02 |
||
14 |
bInterfaceClass |
0x08 |
Mass Storage |
|
15 |
bInterfaceSubClass |
0x06 |
SCSI transparent command set |
|
16 |
bInterfaceProtocol |
0x50 |
USB Mass Storage Class Bulk-Only Transport |
|
17 |
iInterface |
0x00 |
||
第一个 端点 描述符 |
18 |
bLength |
0x07 |
|
19 |
bDescriptorType |
0x05 |
ENDPOINT |
|
20 |
bEndpointAddress |
0x81 |
//// |
|
21 |
bmAttributes |
0x02 |
Bulk |
|
22,23 |
wMaxPacketSize |
0x0200(00, 02) |
512B |
|
24 |
bInterval |
0xff |
//// |
|
第二个 端点 描述符 |
25 |
bLength |
0x07 |
|
26 |
bDescriptorType |
0x05 |
ENDPOINT |
|
27 |
bEndpointAddress |
0x02 |
//// |
|
28 |
bmAttributes |
0x02 |
Bulk |
|
29,30 |
wMaxPacketSize |
0x0200(00, 02) |
512B |
|
31 |
bInterval |
0xff |
描述符(Descriptor)
说到描述符,不得不提到setup包中的请求字段.请求共有11种,其中一种是GET_DESCRIPTOR.
描述符的类型(Descriptor Type)共有8种,如下表:
见英文版P251
每一种对应于一个结构体,分别在9.6.1到9.6.7中有详细定义.这里要揭示的是它们之间的关系.
如下图所示,设备描述符Device里面包含配置描述符Configuration,它里面又包含接口描述符Interface,最后是端点描述符EndPoint.这是一个树状结构.
为什么有这个结论呢,它们的结构体暗示了这种层次关系.