usb 设备描述符举例说明

    xiaoxiao2021-03-26  10

    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种配置。

    转载请注明原文地址: https://ju.6miu.com/read-600381.html

    最新回复(0)