usb setup 数据结构解释 非常好理解

https://blog.csdn.net/luckywang1103/article/details/25243979

在USB通讯里,从主控器发出来的第一个配置包就是设备描述符配置包,目的只有一个,就是获取插入的USB属性,以便加载合适的驱动程序。现在就来详细地分析一下设备描述符包的定义。

在USB2.0的协议里找到9.3 USB Device Requests里就找到这个结构的定义,这里我使用C的定义结构如下:

typedef struct _USB_SETUP_PACKET

{

 REQUEST_TYPE bmRequestType;

 BYTE         bRequest;

 WORD_BYTE    wValue;

 WORD_BYTE    wIndex;

 WORD         wLength;

} USB_SETUP_PACKET;

 

bmRequestType是包含有下面几方面的内容:

D7 D6 D5 D4 D3 D2 D1 D0

在这一个字节里,又按位分为:

D7位是表示后面传送数据的方向位。

当D7等于0时,表示后面的数据从主控器发送到USB设备。在PC里,就是从PC机发送到USB的设备。

当D7等于1时,表示后面的数据是从USB设备发送到主控器。在PC里,就是从USB设备发送到USB设备。在上次里,我收到并显示出来的数据是80,就表示从USB设备里发送数据给PC。在这里再次给出上一次的包数据:

80 06 00 01 00 00 40 00

这里的80,就是D7位为1。

 

D6-D5位是请求主分类型

0 是表示标准的请求。

1 是表示类别的请求。

2 是表示厂商的请求。

3 是保留。

 

D4-D0位是表求接收这个包的接口。

0 是表示USB设备接收。

1 是表示接口接收。

2 是表示端点接收。

3 是表示其它接收,不知道的。

4-31是保留。

 

bRequest是本描述符的请求类型,也就是后面发送的数据是什么样的东西。由于USB里有很多配置信息,比如获取设备描述符,又有设置USB地址等等,就是通过这个字节来区分的。

从USB协议里查找表9-4,就可看到如下的编码:

GET_STATUS              0

CLEAR_FEATURE          1

Reserved for future use      2

SET_FEATURE             3

Reserved for future use      4

SET_ADDRESS             5

GET_DESCRIPTOR         6

SET_DESCRIPTOR          7

GET_CONFIGURATION      8

SET_CONFIGURATION      9

GET_INTERFACE           10

SET_INTERFACE            11

SYNCH_FRAME              12

在上面的数据包里,看到它的内容是06,那么它就是GET_DESCRIPTOR类型。也就是主控器想读取USB设备的描述符,到这里就已经分析出来的意思,就是主控器想读取USB描述符,但还不知道是什么描述符的内容。

 

wValue是根据不同的请求而设置不同的值。一般就是传送参数给设备标明这是什么请求。在上面GET_DESCRIPTOR获取设备描述符里,它的值是00 01。在GET_DESCRIPTOR里这个字段的低字节表示描述符的索引高字节表示描述符的类型。高字节的类型如下:

DEVICE                   1

CONFIGURATION          2

STRING                   3

INTERFACE                4

ENDPOINT                5

DEVICE_QUALIFIER         6

OTHER_SPEED_CONFIGURATION             7

INTERFACE_POWER1                  8

wValue值在这里的高字节是01,那么它就是设备描述符了低字节是00,那么它就是表示从偏移地址0开始读取设备描述符由于在配置描述符里有很多配置,所以低字节在那里就可以用来识别获取同样类型的描述符不同的配置。

wIndex是根据不同的请求而设置不同的值。一般用来说明端点号或者说明接口标识。在获取描述符里,设置为0,或者是语言ID。在这个发送的描述符里,它是设置为00 00

wLength是根据请求来决定下一阶段发送数据的长度前面请求第一个字节里,已经说明下一阶段数据传送的方向,这里说明了传送数据的长度。不管是发送数据,还是接收数据,都不要超过这个数据长度,否则主机会出问题,或者设备有问题。在这个获取设备描述里,它的长度是40 00,按小端格式去解释,就是64个字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值