广告

原创 USB协议深入分析_设备描述符配置包(转载)

2009-5-15 16:49 3371 0 分类: MCU/ 嵌入式

 

设备描述符配置包

在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个字节。

 

到这里,就把主控器发下来的数据解释完成了,知道去做什么的事情和回应。下一次就去分析怎么样返回设备描述符。
广告

文章评论 0条评论)

登录后参与讨论
相关推荐阅读
haoran_flying 2009-05-20 20:45
Mega16+CH375硬件测试程序
前几天在做usbd12调试时不小心把12V电压接到5V上去了,烧了几个片子,D12也挂了,由天手头上没有D12了,再说手工焊接也挺麻烦的,上次买D12时顺便带了CH375。因为这一直都是用的AVR的片...
haoran_flying 2009-05-16 20:59
我做的OO的usb鼠标
  五一放假在家没事,逛到了END圈圈的USB专区,小组公告的那段话很实在。原来做的项目都是通过串口通讯,看来有时间还是要学习一下USB。  这段时间看了一下协议和其他的一些资料,还只是一个模糊的认识...
haoran_flying 2009-05-15 16:58
USB协议深入分析_字符串描述符(转载)
原载于:http://blog.csdn.net/caimouse/archive/2007/04/25/1584778.aspx上一次说到把配置描述符返回给主控器那里了,现在接着下来,就会收到主控器...
haoran_flying 2009-05-15 16:56
USB协议深入分析_配置(转载)
原载于:http://blog.csdn.net/caimouse/archive/2007/04/23/1575676.aspx前面已经介绍设置USB的设备地址,接着下来是做什么呢?其实有了设备地址...
haoran_flying 2009-05-15 16:55
USB协议深入分析_设置USB地址(转载)
原载于:http://blog.csdn.net/caimouse/archive/2007/04/18/1568991.aspx前面已经解释主控器怎么样发送设备描述符下来,然后设备返回相应的设备描述...
haoran_flying 2009-05-15 16:53
USB协议深入分析_返回设备描述符(转载)
原载于:http://blog.csdn.net/caimouse/archive/2007/04/12/1561959.aspx 回应设备描述符上一次已经介绍怎么样收到主控器的获取设备描述符的数据,...
我要评论
0
0
广告