usb 设备描述符举例说明

来源:互联网 发布:spss数据分析 编辑:程序博客网 时间:2024/06/05 05:54

usb协议中规定了8个字节的标准请求,主要是用来进行设备枚举的。

假如是usb 的标准请求,那么bmRequestType 的D6~5 bit是00。bRequest的取值可以是以下的几种:


wValue和wIndex的取值取决于之前的bRequest请求。

常用的获取描述符结构:GET_DESCRIPTOR


其中wValue第一个字节是表示选择具体的哪个描述符,第二个字节是描述符的类型编号


wIndex在获取除了字符串描述符时是语言ID,其它都是0.

对于全速设备以及低速设备,获取描述符的3种标准请求是获取设备,获取字符串,获取配置描述符,另外的接口,端点描述符是随着配置描述符一起返回给主机的。

设置设备的地址:SET_ADDRESS:


设置地址是给设备一个唯一的地址,当设置地址后,主机将由原来复位状态默认的0地址改变为新的地址。

设置配置:SET_CONFIGURATION


关于配置值的设置,即wValue,一般与配置描述符中的值相同时,表示选中该配置,即配置生效,假如配置的值为0,表示进入设置地址状态,即上面所讲的set_ADDRESS的状态,当配置的值是非0时,才能启动非0的端点。


设备描述符的定义:

标准的设备描述符的字节是18个字节,以下是定义:



bLength:描述符的长度,假如标准的是18个,那么就是0x12

bdescriptortype:在上面所讲的描述符编号中有定义,假如是设备描述符,那么是0x01

bcdUSB:usb的版本,比如说usb2.0,就写作为0x02,0x00,因为高位在前,低位在后。

bDeviceClass:请看下图,这个指明了连接usb host的是什么类型的设备


一般来讲通常的做法是将这个字段写为0x00,而在后面的interface class中定义实际的作用,但是将bDeviceClass写成0时,bDevicesubClass也应该是0.有一个特殊的值是0xFF,是厂商自定义的设备类。

bDeviceProtocol:当类定义为0时,这个应该也为0,当定义为FF时,表示厂商自定义协议。

bMaxPacketSize0:端点0的最大包长,可以取值为8,16,64等等。

idVendor,idPr oduct:这个是VID,PID,这个可以让帮助主机寻找该设备对应的驱动。

bcdDevice:设备的版本号

iManufacture:厂商字符串的索引值,当值为0时,表示没有厂商字符串,当为其他值时,主机会利用这个索引值来获取相应的字符串。

iProduct:类似于iManufacture,用这个值获取到字符串是显示在主机上的设备名称。

iSerialNumber:设备序列号的索引值,用来索引设备序列号字符串我们可以通过VID,和PID来区分设备,但是当很多相同的设备添加同时插入主机时,可以通过iSerialNumber来区分这些个设备,当为0的时候,表示没有设备序列号字符串

bNumConfigurations:表示设备有多少种配置,大部分usb设备只有一个配置。

摘抄圈圈书上的一段代码:




然后再看一下我们的用的cypress的usb设备描述符:

/* Standard Device Descriptor for USB 2 */const uint8_t CyCx3USB20DeviceDscr[] ={    0x12,                               /* Descriptor size */    0x01                                   /* Device descriptor type */    0x10, 0x02,                      /* USB 2.1 */    0xEF,                               /* Device class */    0x02,                               /* Device sub-class */    0x01,                               /* Device protocol */    0x40,                               /* Maxpacket size for EP0 : 64 bytes */    0xB4, 0x04,                         /* Vendor ID */    0xC3, 0x00,                         /* Product ID */    0x00, 0x00,                        /* Device release number */    0x01,                               /* Manufacture string index */    0x02,                               /* Product string index */    0x00,                               /* Serial number string index */    0x01                                /* Number of configurations */};

首先从devicecclass sub-class,protocol定义中可以找到


定义设备为组合设备,具体介绍可以查看http://www.cnblogs.com/shangdawei/p/4712305.html

定义EP0的包为64byte,VID和PID分别是0x04b4,0x00c3,Device release number是0x00,0x00,iManufacturer,iProduct索引分别是0x01,0x02,,iSerialNumber是0x00,bNumConfigurations是0x01表明支持1种配置。


0 0