说到USB设备,不得不提到各种描述符(descriptors), 一般来说,描述符有如下几种:
1:设备描述符(Device Descriptors)
2:配置描述符(Configuration Descriptors)
2:接口描述符(Interface Descriptors)
3:端点描述符(Endpoint Descriptors)
一个USB设备只有一个设备描述符,设备描述符里面定义了该设备有多少种配置,每种配置描述符对应着配置描述符;而在配置描述符中又定义了该配置里面有多少个接口,每个接口有对应的接口描述符;在接口描述符里面又定义了该接口有多少个端点,每个端点对应一个端点描述符;端点描述符定义了端点的大小,类型等等。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。
详细关系如下图所示:
下面我们从软件的角度来看看这些描述符的详细定义(以下定义取自Window系统, Linux下命名稍有区别,成员内容一致)
设备描述符结构体如下:
typedef struct _USB_DEVICE_DESCRIPTOR { UCHAR bLength; //该描述符结构体大小(18字节) UCHAR bDescriptorType; //描述符类型(本结构体中固定为0x01) USHORT bcdUSB; //USB版本号 UCHAR bDeviceClass; //设备类代码(由USB官方分配) UCHAR bDeviceSubClass; //子类代码(由USB官方分配) UCHAR bDeviceProtocol; //设备协议代码(由USB官方分配) UCHAR bMaxPacketSize0; //端点0的最大包大小(有效大小为8,16,32,64) USHORT idVendor; //生产厂商编号(由USB官方分配) USHORT idProduct; //产品编号(制造厂商分配) USHORT bcdDevice; //设备出厂编号 UCHAR iManufacturer; //设备厂商字符串索引 UCHAR iProduct; //产品描述字符串索引 UCHAR iSerialNumber; //设备序列号字符串索引 UCHAR bNumConfigurations; //当前速度下能支持的配置数量 } USB_DEVICE_DESCRIPTOR, *PUSB_DEVICE_DESCRIPTOR;
typedef struct _USB_CONFIGURATION_DESCRIPTOR { UCHAR bLength; //该描述符结构体大小 UCHAR bDescriptorType; //描述符类型(本结构体中固定为0x02) USHORT wTotalLength; //此配置返回的所有数据大小 UCHAR bNumInterfaces; //此配置的接口数量 UCHAR bConfigurationValue; //Set_Configuration命令所需要的参数值 UCHAR iConfiguration; //描述该配置的字符串的索引值 UCHAR bmAttributes; //供电模式的选择 UCHAR MaxPower; //设备从总线提取的最大电流 } USB_CONFIGURATION_DESCRIPTOR, *PUSB_CONFIGURATION_DESCRIPTOR;
接口描述符结构体如下:
typedef struct _USB_INTERFACE_DESCRIPTOR { UCHAR bLength; //该描述符结构大小 UCHAR bDescriptorType; //接口描述符的类型编号(0x04) UCHAR bInterfaceNumber; //该接口的编号 UCHAR bAlternateSetting; //备用的接口描述符编号 UCHAR bNumEndpoints; //该接口使用的端点数,不包括端点0 UCHAR bInterfaceClass; //接口类型 UCHAR bInterfaceSubClass; //接口子类型 UCHAR bInterfaceProtocol; //接口遵循的协议 UCHAR iInterface; //描述该接口的字符串索引值 } USB_INTERFACE_DESCRIPTOR, *PUSB_INTERFACE_DESCRIPTOR;
typedef struct _USB_ENDPOINT_DESCRIPTOR { UCHAR bLength; //端点描述符字节数大小(7个字节) UCHAR bDescriptorType; //端点描述符类型编号(0x05) UCHAR bEndpointAddress; //端点地址及输入输出属性 UCHAR bmAttributes; //端点的传输类型属性 USHORT wMaxPacketSize; //端点收、发的最大包大小 UCHAR bInterval; //主机查询端点的时间间隔 } USB_ENDPOINT_DESCRIPTOR, *PUSB_ENDPOINT_DESCRIPTOR;
typedef struct _USB_STRING_DESCRIPTOR {
UCHAR bLength; //字符串描述符字节数
UCHAR bDescriptorType; //字符串描述符类型编号(0x03)
WCHAR bString[1]; //unicode字符串
} USB_STRING_DESCRIPTOR, *PUSB_STRING_DESCRIPTOR;
转载:http://blog.csdn.net/saloon_yuan/article/details/7837492
参考资料:
1、libusb开源库相关
2、USB设备开发---- 基于libusb的无驱设计