USB设备端点描述符最大传输wMaxPacketSize和bMaxBurst
2025-08-12
0
0
USB设备端点描述符结构体定义如下:
struct _ENDPOIN_DESCRIPTOR_STRUCT
{
BYTE bLength; //设备描述符的字节数大小,为0x7
BYTE bDescriptorType; //描述符类型编号,为0x05
BYTE bEndpointAddress; //端点地址及输入输出属性
BYTE bmAttribute; //端点的传输类型属性
WORD wMaxPacketSize; //端点收、发的最大包的大小
BYTE bInterval; //主机查询端点的时间间隔
} ENDPOIN_DESCRIPTOR_STRUCT
其中wMaxPacketSize代表着端点的最大传输包大小。
这个值一般取:
epd->wMaxPacketSize = epd->wMaxPacketSize & 0x07ff;
但对于USB3.0这种超高速设备,在设备端点描述符下还有一个叫做USB设备端点伴随描述符,其定义如下:
typedef struct _SUPER_SPEED_ENDPOINT_COMPANION
{
UCHAR bLength;
UCHAR bDescriptorType;
UCHAR bMaxBurst;
UCHAR bmAttributes;
USHORT wBytesPerInterval;
}SUPER_SPEED_ENDPOINT_COMPANION;
其定义了该端点的最大突发传输maxburst,根据端点的类型,其值不同。
- 对于同步传输,ep->mult = comp_desc->bmAttributes & 0x3
- 对于中断或批量传输:ep->maxburst = comp_desc->bMaxBurst + 1
- 对于控制传输:控制传输不支持突发传输,所以认为为1。
if (g->speed == USB_SPEED_SUPER)
{
switch (usb_endpoint_type(_ep->desc)) {
case USB_ENDPOINT_XFER_ISOC:
/* mult: bits 1:0 of bmAttributes */
_ep->mult = comp_desc->bmAttributes & 0x3;
case USB_ENDPOINT_XFER_BULK:
case USB_ENDPOINT_XFER_INT:
_ep->maxburst = comp_desc->bMaxBurst + 1;
break;
default:
if (comp_desc->bMaxBurst != 0)
ERROR(cdev, "ep0 bMaxBurst must be 0\n");
_ep->maxburst = 1;
break;
}
}
代码来源于config_ep_by_speed函数
HID人机交互QQ群:564808376
UAC音频QQ群:218581009
UVC相机QQ群:331552032
BOT&UASP大容量存储QQ群:258159197
STC-USB单片机QQ群:315457461
USB技术交流QQ群2:580684376
USB技术交流QQ群:952873936