具体的描述符每个字节的含义可参考USB2.0协议
一个标注的描述符集合
/*********************************/
设备描述符[18]{0x12, //固定 bLength字段。设备描述符的长度为18(0x12)字节0x01, //固定 bDescriptorType字段。设备描述符的编号为0x010x10,0x01, //bcdUSB字段。这里设置版本为USB1.1,即0x0110。//由于是小端结构,所以低字节在先,即0x10,0x01。
//设备类参考:https://www.usb.org/defined-class-codes0x00, //bDeviceClass字段。类代码,不在设备描述符中定义设备类,在接口 描述符定义,这里为0则下面两个都是0 0x00, //bDeviceSubClass字段。bDeviceClass字段为0时,该字段也为0。0x00, //bDeviceProtocol字段。设备协议0x08, //bMaxPacketSize0字段。端点0最大包长(仅8(低速),16,32,64(全速/高速)合法)0x3d,0x41, //idVender字段,注意小端模式,低字节在先。从此6字节是描述设备信息0x3a,0x55, //idProduct字段 产品ID号。注意小端模式,低字节应该在前。0x00,0x00, //bcdDevice字段。注意小端模式,低字节应该在前。0x00, //iManufacturer字段。厂商字符串的索引从此3字节可以认为名字0x00, //iProduct字段。产品字符串的索引值,注意字符串索引值不要使用相同的值0x00, //iSerialNumber字段。设备的序列号字符串索引值。0x01 //bNumConfigurations字段。该设备所具有的配置描述数量。
}、实际传输的配置描述符集合:配置描述符+接口+hid等类+端点描述符,必须按照顺序定义
/***************配置描述符******************/0x09, //固定 bLength字段。配置描述符的长度为9字节
0x02, //固定 bDescriptorType字段。配置描述符编号为0x02
0x3b,0x00, //wTotalLength字段。配置描述符集合的总长度0x003b(配置描述符集合)
0x02, //bNumInterfaces字段。该配置包含的接口数,只有2个接口,使用时只能是某个
0x01, //bConfiguration字段。该配置的值为1,哪个配置生效,通过这个选择使用哪个
0x01, //iConfigurationz字段,该配置的字符串索引。
/*bmAttributes字段,
D7:默认1,D6:自供电(0)总线供电(1),D5:支持远程唤醒(1);D4-D0:保留*/
0xA0,
0x64, //bMaxPower字段,多少个电流单位。每单位电流为 2 mA /***************接口描述符******************/
0x09, //固定,描述符长度
0x04, //固定,接口描述符类型
0x00, //接口编号,从0开始
0x00, //备用编号,很少用,一般设置为0
0x01, //接口包含的端点数量,不包括端点0
0x03, //接口使用的(hid)类,当设备描述符该位0,则在这里设置设备类,单纯用作数据传输的话,直接写FFh就好,代表着用户自定义
0x01, //子类(hid类的话这里说明是支持引导(在bios环境可用鼠标键盘),00表示不支持引导)
0x01, //协议
0x00, //字符串索引值,没有就写0/***************hid类描述符******************/
0x09, //描述符(不是hid报告描述符)长度,由下级描述符的数量决定
0x21, //固定,hid类描述
0x11,0x01, // HID协议版本BCD,1.11
0x00, 国家代码not support
0x01, //下级描述符的数量。下级描述符的类型
0x22, //下级描述符的类型,报告描述符是0x22(常用),物理描述符0x23
0x3e, 0x00, //下级描述符长度,也就是下面定义的HID报表描述符的字节数
//下级描述符类型,和下级描述符长度交替定义,可定义多个下级描述符/***************端点描述符******************/
0x07, //固定,描述符长度
0x05, //固定,描述符种类 端点
//端点编号,D7:OUT(0),IN(1); D6-D4:保留默认0;D3-D0:编号值 ,下面就是IN 1
0x81, //D1,D0:控制传输(00),同步传输(01),批量传输(10),中断传输 (11) 中断传输,参考:usb2.0手册中的9.6.6
0x03, //最大数据包8字节 bit0-10决定,bit11-12每个微帧传输几个事务:00(1个),01(2个),10(3个),11保留
0x08,0x00, //主机和设备通讯时间多个时间单位,低速和全速单位是1ms,高速单位是1us,这里1ms*10
0x0A,
主要描述符
设备描述符,配置描述符,接口描述符,hid类(其他类)描述符,端点描述符
需要注意的:主机请求描述符时,上传的描述符分为两大部分,设备描述符和配置描述符集合(包含除设备描述符外的所有描述符)。虽然可以有多个配置描述符,但在某一时刻,设备起作用的只能是某一种描述符。
参考
usb中的标准请求,而描述符就是其中的GET_DESCRIPTION命令
获取设备描述符