设备描述符配置包



在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描述符,但还不知道是什么描述符的内容。