端点描述符,是描述USB通信通道或管道的类型和功能的标准USB描述符。
端点描述符和接口描述符还有配置描述符一样,不能单独发送给USB主机,需要以配置描述符集合的形式发送给主机。
在设备描述服务那篇文章里,我曾经提到过USB里面有一个定义叫做端点,并做了一个比较生动的比喻,我把那段话直接复制过来:
向前有4个行车道(1,2,3,4),向后有4个行车道(1,2,3,4),这就是4个双向端点。假设它们都属于一条津某高速路(一个USB接口),有的向前有的向后(有的输入有的输出),有向前的1号行车道(有输出的1号端点)。
所以端点描述符,就是对USB通讯中用到的端点做一个功能描述。我们看一下下面的表格:
偏移量 | 名称 | 大小 | 说明 |
0 | bLength | 1 | 描述符的长度(7字节) |
1 | bDescriptorTyep | 1 | 描述符类型(端点描述符为0x05) |
2 | bEndpointAddress | 1 | 该端点的地址 |
3 | bmAttributes | 1 | 该端点的属性 |
4 | wMaxPackeSize | 2 | 该端点支持的最大包长 |
5 | bInterval | 1 | 端点的查询时间 |
注意:关于端点描述符的详细内容,建议查阅USB文档:usb_20的9.6.6章节。
这里尽量给大家描述清楚。
bLength,长度,不解释。
bDescriptorTyep,描述符类型。看代码:
#define USB_DESC_TYPE_DEVICE 0x01U
#define USB_DESC_TYPE_CONFIGURATION 0x02U
#define USB_DESC_TYPE_STRING 0x03U
#define USB_DESC_TYPE_INTERFACE 0x04U
#define USB_DESC_TYPE_ENDPOINT 0x05U
#define USB_DESC_TYPE_DEVICE_QUALIFIER 0x06U
#define USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION 0x07U
#define USB_DESC_TYPE_BOS 0x0FU
bEndpointAddress,端点的地址。含义参照文档来解码:
Bit 3…0: 端点数量
Bit 6…4: 保留,默认为0
Bit 7:如果是控制端点可以忽略,否则一般表示数据传输方向
0 = OUT endpoint
1 = IN endpoint
bmAttributes,属性,这一位稍微有点复杂。如下:
Bits 1..0: Transfer Type,传输类型
00 = Control-控制传输
01 = Isochronous-等时传输
10 = Bulk-批量传输
11 = Interrupt-中断传输
如果不是一个等时传输端点,第5~2位是保留的,必须设置为0。如果它是等时的,则定义如下:
Bits 3..2: Synchronization Type-同步类型
00 = No Synchronization-无同步
01 = Asynchronous-异步
10 = Adaptive-适配
11 = Synchronous-同步
Bits 5..4: Usage Type-用途
00 = Data endpoint-数据端点
01 = Feedback endpoint-反馈端点
10 = Implicit feedback Data endpoint-暗含反馈的数据端点
11 = Reserved-保留
wMaxPackeSize,端点支持的最大包长。对于等时端点,此值用于在调度中保留总线时间,这是每(微)帧数据有效负载所需的时间。在进行中,管道实际使用的带宽可能比保留的带宽少。如果有必要,设备会报告通过其正常的、非usb定义的机制所使用的实际带宽。
对于所有的端点,bit10~bit0指定最大数据包大小(以字节为单位)。
对于高速同步和中断端点:bit12~bit11指定每个微帧的额外通信次数:
00 = None (1 transaction per microframe)
01 = 1 additional (2 per microframe)
10 = 2 additional (3 per microframe)
11 = Reserved
其它位默认为0,详细信息可参考usb_20文档第5章。
bInterval,查询时间,说白了就是主机多久和设备通讯一次。根据设备运行速度以帧或微帧表示。
对于全/高速等时端点,此值必须在1到16之间。bInterval值用作2的指数;例如,bInterval为4,表示周期为8, 2(4 – 1)。
对于全速/低速中断端点,该字段的值可以是1到255。
对于高速中断端点,使用bInterval值作为2的指数;例如,bInterval为4表示周期为8 ,2(4-1)。这个值必须在1到16之间。
对于高速批量/控制输出端点,bInterval必须指定端点的最大NAK速率。值0表示端点永不NAK。其它值表示每个微帧的bInterval数最多1个NAK。这个值的范围必须在0到255之间。
详细信息可参考usb_20文档第5章。
这里放一段STM32中端点描述符的代码:
/******************** Descriptor of Mouse endpoint ********************/
/* 27 */
0x07, /*bLength: Endpoint Descriptor size*/
USB_DESC_TYPE_ENDPOINT, /*bDescriptorType:*/
HID_EPIN_ADDR, /*bEndpointAddress: Endpoint Address (IN)*/
0x03, /*bmAttributes: Interrupt endpoint*/
HID_EPIN_SIZE, /*wMaxPacketSize: 4 Byte max */
0x00,
HID_FS_BINTERVAL, /*bInterval: Polling Interval */
好了,本来以为是比较简单的一个端点描述符,但实际包含的内容还是很多的。文章中提到的usb_20文档可以在USB官网获取,也可以关注公众号单片机爱好者,回复:usb_20,获取下载链接。
最后,感谢有道词典对本文章的大力支持!