龙芯软件开发(36)- USB协议深入分析 返回设备描述符

回应设备描述符
上一次已经介绍怎么样收到主控器的获取设备描述符的数据,这里就解释怎么样发送回应数据给主控器。
先从USB协议里找到标准设备的定义,我把它用C语言定义如下:
typedef struct _USB_DEVICE_DESCRIPTOR {
 BYTE bLength;
 BYTE bDescriptorType;
 WORD bcdUSB;
 BYTE bDeviceClass;
 BYTE bDeviceSubClass;
 BYTE bDeviceProtocol;
 BYTE bMaxPacketSize0;
 WORD idVendor;
 WORD idProduct;
 WORD bcdDevice;
 BYTE iManufacturer;
 BYTE iProduct;
 BYTE iSerialNumber;
 BYTE bNumConfigurations;
} USB_DEVICE_DESCRIPTOR;
返回给主控器的数据结构就是上面的内容,只要把上面的结构填写合适的内容,就可以发送回去给主控器。在我的USB设备里,我把它填写如下的数据:
12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01
 
看到这串数据是不明白是什么东西的,现在就来仔细地分析它的具体定义。下面就按着一个字段一个字段地分析它。
bLength是本结构的数据长度,这样可以方便以后兼容不同的版本协议。因为不同的结构是不同的长度,这样就可以区分不同的协议了。比如有一天想添加一个字段,那么它的长度就会改变,这时就可以根据不同的长度进行解释不同的协议了。这次返回的结构长度是0x12,也就是18个字节,它的长度是从 bLength长度开始,也就是说是完全整个结构的长度。
 
bDescriptorType是描述符的类型。它的定义跟主控器发下来描述符的类型是一样的,如下:
DEVICE                   1
CONFIGURATION          2
STRING                   3
INTERFACE                4
ENDPOINT                5
DEVICE_QUALIFIER         6
OTHER_SPEED_CONFIGURATION             7
INTERFACE_POWER 1                   8
由于返回的是设备描述符,所以就选择了1,也就是包里显示的第二个字节01。用这个类型来区分不同的描述符。
 

你可能感兴趣的:(软件开发)