1. 概述
USB 描述符信息存储在 USB 设备中,在枚举过程中,USB 主机会向 USB 设备发送 GetDescriptor 请求,USB 设备在收到这个请求之后,会将 USB 描述符信息返回给 USB 主机,USB 主机分析返回来的数据,判断出该设备是哪一种 USB 设备,建立相应的数据链接通道。
USB 设备使用描述符报告其属性。描述符是具有定义格式的数据结构,每个描述符都以字节宽度字段开头,该字段包含描述符中的总字节数,后跟一个标识描述符类型的字节宽度字段。在 USB 设备枚举过程中,主机端的协议软件需要解析从 USB 设备读取所有描述符信息。在主机 USB 向设备发送读取描述符的请求后,USB 设备将所有的描述符以连续的数据流方式传输给 USB 主机。主机从第一个读到的字符开始,根据双方规定好的数据格式,顺序地解析读到的数据流。
每个 USB 设备公开的设备描述符,指示设备的类信息、 供应商和产品标识符,以及多个配置。每个配置还公开其配置描述符,该值指示大量接口和功耗特征,每个接口公开其包含类和数量的终结点信息的替代设置的每个接口描述符,每个接口中的每个终结点公开终结点,描述符可指明终结点类型和最大数据包大小。
描述符类型:
标准的 USB 设备有 5 种 USB 描述符:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。描述符具有类似的格式,它们的第一个字段都是 bLength,第二个字段都是 bDescriptorType。不同描述符在使用时以 bDescriptorType 字段来区分。一设备至少要包含设备描述符、配置描述符和接口描述符。如果 USB 设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输。
每个 USB 设备只有一个设备描述符,而一个设备中可包含一个或多个配置描述符,即 USB 设备可以有多种配置。设备的每一个配置中又可以包含一个或多个接口描述符,即 USB 设备可以支持多种功能(接口),接口的特性通过描述符提供。
在 USB 主机访问 USB 设备的描述符时,USB 设备依照设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。一设备至少要包含设备描述符、配置描述符和接口描述符,如果 USB 设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输。
2. 设备描述符
设备描述符描述的是设备的整体信息,与设备本身一一对应,包括对设备及在设备配置中起全程作用的信息,包括制造商标识号 ID、产品序列号、所属设备类号、默认端点的最大包长度和配置描述符的个数等。一个设备只能有一个设备描述符。在主机对 USB 设备枚举的过程中,首先要做的就是获取设备描述符,以对设备有一个整体的了解。
设备描述符由 14 个字段组成,总长度 18 字节:
typedef struct _USB_DEVICE_DESCRIPTOR_
{
BYTE bLength,
BYTE bDescriptorType,
WORD bcdUSB, //2字节
BYTE bDeviceClass,
BTYE bDeviceSubClass,
BYTE bDeviceProtol,
BYTE bMaxPacketSize0,
WORD idVenderI, //2字节
WORD idProduct, //2字节<