USB 协议及通讯过程

时间:2023-02-20 19:54:14

1. 查看[知识点]中的枚举过程.

2. 传输过程

USB中存在4种传输,分别是

控制传输:主要用于在设备连接时对设备进行枚举以及其他因设备而已的特定操作。

中断传输:用于对延迟要求严格、小量数据的可靠传输,如键盘、游戏手柄等。

批量传输:用于对延迟要求宽松,大量数据的可靠传输,如盘等。

同步传输:用于对可靠性要求不高的实时数据传输,如摄像头、USB 音响等。

l 设备连接后发生控制传输HOST USB设备通过地址0发出

USB 协议及通讯过程

SETUP包共8个字节,它的格式见USB 2.0规范(英文版).pdfP248.

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

USB 协议及通讯过程

每一种对应于一个结构体,分别在9.6.1到9.6.7中有详细定义.这里要揭示的是它们之间的关系.

如下图所示,设备描述符Device里面包含配置描述符Configuration,它里面又包含接口描述符Interface,最后是端点描述符EndPoint.这是一个树状结构.

USB 协议及通讯过程

为什么有这个结论呢,它们的结构体暗示了这种层次关系.