广告

原创 USB协议深入分析_返回设备描述符(转载)

2009-5-15 16:53 1469 0 分类: MCU/ 嵌入式

 

回应设备描述符

上一次已经介绍怎么样收到主控器的获取设备描述符的数据,这里就解释怎么样发送回应数据给主控器。

先从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_POWER1                  8

由于返回的是设备描述符,所以就选择了1,也就是包里显示的第二个字节01。用这个类型来区分不同的描述符。

 


bcdUSB是USB发布的协议版本。也就是本设备能适用于那种协议,目前USB主要有两个版本,一个是1.10,一个是2.10版本。在本设备里,采用了1.10的协议版本。由于这个字段是采用BCD编码,所以1.10的表示为0x0110的格式,按小端格式输出来,就变成10 01的显示了。

 

bDeviceClass是设备分类。当它的值是0时,表示所有接口在配置描述符里,并且所有接口是独立的。当它的值是1到FEH时,表示不同的接口关联的。当它的值是FFH时,它是厂商自己定义的。在这个设备里,是定义为0。

 

bDeviceSubClass是设备子分类码。当前面的bDeviceClass值是0时,这里一定要设置为0。其它就跟据USB-IF组织定义的编码。

 

bDeviceProtocol是设备使用的协议。如果使用USB-IF组织定义的协议,就需要设置这里的值。如果不使用,就直接设置为0。如果厂商自己定义的可以设置为FFH。

以上三个值,在本设备里全部设置为0。

 

bMaxPacketSize0是端点0收发最大的包大小。仅允许设置8,16,32,64中的任何一个大小。在本设备里是设置为64个字节大小。所以看到这个字段是40 的大小。

12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01

 

idVendor是厂商标识。由USB-IF分配的编码。在这里使用0x8000。

 

idProduct是厂商定义的产品标识。由厂家和产品标识,就可以让操作系统加载不同的驱动程序。如下:

12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01

 

bcdDevice是用BCD表示的设备发布的版本号。这里是1.00。

12 01 10 01 00 00 00 40 00 80 00 80 00 01 04 2C 4A 01

 

iManufacturer是厂商字符串的偏移值。这值主要说明了它在字符串描述符里的偏移位置。如果它设置为0,表示没有厂商字符串。在这里是0x04,就是从字符串描述符开始位置算起第4个字节位置读取字符串。

 

iProduct是产品字符串的偏移值。这值主要说明了它在字符串描述符里的偏移位置。如果它设置为0,表示没有产品字符串。在这里是0x2C,就是从字符串描述符开始位置算起第2C个字节位置读取字符串。

 

iSerialNumber是序列号字符串的偏移值。这值主要说明了它在字符串描述符里的偏移位置。如果它设置为0,表示没有序列号字符串。在这里是0x4A,就是从字符串描述符开始位置算起第4A个字节位置读取字符串。

所有字符串,都是采有UNICODE编码。

 

bNumConfigurations是配置描述符的个数。在这里只使用了一个配置,所以设置为1。
广告

文章评论 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前面已经解释主控器怎么样发送设备描述符下来,然后设备返回相应的设备描述...
我要评论
0
0
广告