枚举过程
USB设备枚举一般会经过插入、供电、初始化、分配地址,配置,获取设备描述符、获取配置描述符、获取字符串和配置设备这么几个过程。(第一次获取设备描述符就是为了获取最大包长,在设备描述符的第8字节(因此USB规定端点0的最大包长至少8字节)。在复位之后,才会真正获取完整的设备描述符)
枚举过程基本上就是分配地址和获取描述符的过程。那么什么是描述符呢?
描述符
描述符是USB设备用来描述自己属性及用途的,因此设备端必须实现对应的描述符。主机会在枚举过程中根据描述符去确定这是一个什么设备,安装相应的驱动。
标准的描述符有5种,USB为这些描述符定义了编号:
0x01.设备描述符:USB设备至少有一个配置描述符,但是主机同一时间只能选择一种配置。
0x02.配置描述符:USB配置至少有一个接口描述符。
0x03.接口描述符:USB接口可以至少有一个端点描述符,也可以没有端点描述符。
0x04.端点描述符
0x05.字符串描述符
还有一些不太常用的描述符:
0x06.限定描述符
0x07.其它速率配置描述符
0x08.接口功率描述符
0x21.HID描述符
0x22.报表描述符
设备描述符
- bLength : 描述符大小。固定为0x12.
- bDescriptorType : 描述符类型。固定为0x01.
- bcdUSB : 本设备能适用于那种协议,如2.0=0200,1.1=0110等。
- bDeviceClass : 类型代码。当它的值是0时,表示所有接口在配置描述符里,并且所有接口是独立的。当它的值是1到FEH时,表示不同的接口关联的。当它的值是FFH时,它是厂商自己定义的。
- bDeviceSubClass : 子类型代码。如果bDeviceClass值是0,一定要设置为0。其它情况就跟据USB-IF组织定义的编码。
- bDeviceProtocol : 协议代码。如果使用USB-IF组织定义的协议,就需要设置这里的值,否则直接设置为0。如果厂商自己定义的可以设置为FFH。
- bMaxPacketSize0 : 端点0最大包长(只有8,16,32,64有效)。
- idVendor : 供应商ID。
- idProduct : 产品ID。由供应商ID和产品ID,就可以让操作系统加载不同的驱动程序。
- bcdDevice : 设备出产编码。由厂家自行设置。
- iManufacturer : 厂商描述符字符串索引。索引到对应的字符串描述符。 为0则表示没有。
- iProduct : :产品描述符字符串索引。为0则表示没有。
- iSerialNumber : 设备序列号字符串索引。为0则表示没有。
- bNumConfigurations : 配置描述符个数。
配置描述符
- bLength : 描述符大小。固定为0x09。
- bDescriptorType : 描述符类型。固定为0x02。
- wTotalLength : 此配置返回的配置描述符,接口描述符以及端点描述符的全部大小。
- bNumInterfaces : 该配置下接口描述符数量。
- bConfigurationValue : 作为Set Configuration的一个参数选择配置值。
- iConfiguration : 用于描述该配置字符串描述符的索引。
- bmAttributes : 供电模式选择。Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒。
- MaxPower : 总线供电的USB设备的最大消耗电流。以2mA为单位。
接口描述符
- bLength : 描述符大小。固定为0x09。
- bDescriptorType : 描述符类型。固定为0x04。
- bInterfaceNumber: 该接口的编号。
- bAlternateSetting : 用于为上一个字段选择可供替换的位置。即备用的接口描述符标号。
- bNumEndpoint : 使用的端点数目。端点0除外。
- bInterfaceClass : 类型代码(由USB分配)。
- bInterfaceSubClass : 子类型代码(由USB分配)。
- bInterfaceProtocol : 协议代码(由USB分配)。
- iInterface : 字符串描述符的索引
端点描述符
字符串描述符
- bLength : 描述符大小。由整个字符串的长度加上bLength和bDescriptorType的长度决定。
- bDescriptorType : 描述符类型。固定为0x03。
- bString[1] : Unicode编码字符串。
在USB标准类
类代码 | 用法 | 描述 |
---|
00h | 设备描述符 | Use class information in the interface Descriptors |
01h | 接口描述符 | 音频 |
02h | 设备描述符、接口描述符 | 通讯设备,如电话,moden等等 |
03h | 接口描述符 | HID设备 |
05h | 接口描述符 | Physical |
06h | 接口描述符 | Image |
07h | 接口描述符 | 打印机 |
08h | 接口描述符 | 大容量存储 |
09h | 设备描述符 | Hub USB集线器 |
0Ah | 接口描述符 | CDC-Data |
0Bh | 接口描述符 | Smart Card |
0Dh | 接口描述符 | Content Security |
0Eh | 接口描述符 | 视频 |
0Fh | 接口描述符 | Personal Healthcare |
10h | 接口描述符 | 音视频设备 |
11h | 设备描述符 | Billboard Device Class |
12h | 接口描述符 | USB Type-C Bridge Class |
DCh | 设备描述符、接口描述符 | Diagnostic Device |
E0h | 接口描述符 | 无线控制器 |
EFh | 设备描述符、接口描述符 | Miscellaneous |
FEh | 接口描述符 | Application Specific |
FFh | 设备描述符、接口描述符 | 厂商用自定义 |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)