USB的端点描述符详解

端点描述符,是描述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,获取下载链接。

最后,感谢有道词典对本文章的大力支持!

留下评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据