前面几个章节说了设备描述符、配置描述符和HID特有描述符,接下来继续讲解接口描述符。根据USB协议规定,接口描述符不能单独返回,必须附着在配置描述符后一并返回。
接口描述符
标准的接口描述符的结构如下:
偏移量/字节 | 域 | 大小/字节 | 说 明 |
0 | bLength | 1 | 该描述符的长度(9字节) |
1 | bDescriptorType | 1 | 该描述符类型(0x04) |
2 | bInterfaceNumber | 1 | 该接口的编号(从0开始) |
3 | bAlternateSetting | 1 | 该接口的备用编号 |
4 | bNumEndpoints | 1 | 该接口所使用的端点数 |
5 | bInterfaceClass | 1 | 该接口所使用的类 |
6 | bInterfaceSubClass | 1 | 该接口所使用的子类 |
7 | bInterfacPtotocol | 1 | 该接口所使用的协议 |
8 | iConfiguration | 1 | 描述该接口的字符串的索引 |
bLength:标准描述符的长度。
bDescriptorType:描述符的类型。
/* USB Descriptor Types */
#define USB_DEVICE_DESCRIPTOR_TYPE 1
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
#define USB_STRING_DESCRIPTOR_TYPE 3
#define USB_INTERFACE_DESCRIPTOR_TYPE 4
#define USB_ENDPOINT_DESCRIPTOR_TYPE 5
#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE 6
#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 7
#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 8
#define USB_OTG_DESCRIPTOR_TYPE 9
#define USB_DEBUG_DESCRIPTOR_TYPE 10
#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE 11
bInterfaceNumber:接口编号。当一个配置具有多个接口时,每个接口的编号都不相同。从0开始依次递增对一个配置的接口进行编号。
bNumEndpoints:该接口所使用的端点数(不包括0端点)。如果为0,则表示没有非0端点,只使用默认的控制端点。
端点描述符
USB协议规定的标准端点描述符的结构。端点描述符不能单独返回,必须附着在配置描述后一并返回。
偏移量/字节 | 域 | 大小/字节 | 说明 |
0 | bLength | 1 | 该描述符的长度(7字节) |
1 | bDescriptorType | 1 | 描述符的类型 |
2 | bEndpointAddress | 1 | 该端点的地址 |
3 | bmAttributes | 1 | 该端点的属性 |
4 | wMaxPackeSize | 2 | 该端点支持的最大包长度 |
6 | bInterval | 1 | 端口的查询时间 |
bLength:描述符的长度。
bDescriptorType:描述符的类型。
bEndpointAddress:该端点的地址。最高为D7为该端点的传输方向,1为输入,0为输出。D3~D0为端点号。
bmAttributes:端点的属性。最低两位D1~D0表示该端点的传输类型,0为控制传输,1为等时传输,2位批量传输,3为中断传输。如果该端点是非等时传输的端点,那么D7~D2为保留值,设置为0。如果该端点是等时传输的,则D3~D2表示同步的类型,0为无同步,1为异步,2为适配,3为同步;D5~D4表示用途,0为数据端点,1为反馈端点,2位暗含反馈的数据端点,3是保留值。D7~D6保留。
/* bmAttributes in Endpoint Descriptor */
#define USB_ENDPOINT_TYPE_MASK 0x03
#define USB_ENDPOINT_TYPE_CONTROL 0x00
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
#define USB_ENDPOINT_TYPE_BULK 0x02
#define USB_ENDPOINT_TYPE_INTERRUPT 0x03
#define USB_ENDPOINT_SYNC_MASK 0x0C
#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION 0x00
#define USB_ENDPOINT_SYNC_ASYNCHRONOUS 0x04
#define USB_ENDPOINT_SYNC_ADAPTIVE 0x08
#define USB_ENDPOINT_SYNC_SYNCHRONOUS 0x0C
#define USB_ENDPOINT_USAGE_MASK 0x30
#define USB_ENDPOINT_USAGE_DATA 0x00
#define USB_ENDPOINT_USAGE_FEEDBACK 0x10
#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK 0x20
#define USB_ENDPOINT_USAGE_RESERVED 0x30
wMaxPackeSize:该端点所支持的最大包长度。注意低字节在先。对于全速模式和低速模式,D10~D0表示端点的最大包长度,其他保留为0。对于高速模式,D12~D11为每个帧附加的传输次数,具体看USB2.0协议。
bInterval:该端点的查询时间。对于查询的帧间隔数。对于等时传输以及高速模式的中断、批量传输,该字段的意义请参看USB2.0协议。
例如:
/* Endpoint, HID Interrupt In 这个端点用来传状态包*/
USB_ENDPOINT_DESC_SIZE, /* bLength */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
USB_ENDPOINT_IN(1), /* bEndpointAddress */
USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */
WBVAL(0x0040), /* wMaxPacketSize 原来是04*/
2, /* 2ms */ /* bInterval 可控制时间片的长度*/
//增加一个输出端点,用于接收主机的数据
USB_ENDPOINT_DESC_SIZE, /* bLength */
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
USB_ENDPOINT_OUT(1), /* bEndpointAddress */
USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */
WBVAL(0x0020), /* wMaxPacketSize 接收数据包大小为32字节*/
20, /* 20ms */ /* bInterval */