USB 端点描述符
端点描述符
USB设备中的每个端点都有自己的端点描述符,由接口描述符中的bNumEndpoint决定其数量
struct _ENDPOIN_DESCRIPTOR_STRUCT
{
BYTE bLength; //设备描述符的字节数大小,为0x7
BYTE bDescriptorType; //描述符类型编号,为0x05
BYTE bEndpointAddress; //端点地址及输入输出属性
BYTE bmAttribute; //端点的传输类型属性
WORD wMaxPacketSize; //端点收、发的最大包的大小
BYTE bInterval; //主机查询端点的时间间隔
} ENDPOIN_DESCRIPTOR_STRUCT ;
- bLength : 描述符大小.固定为0x07.
- bDescriptorType : 端点描述符类型.固定为0x05.
- bEndpointAddress : USB设备的端点地址.Bit7,方向,对于控制端点可以忽略,1/0:IN/OUT.Bit6-4,保留.BIt3-0:端点号.
bmAttributes : 端点属性.Bit7-2,保留(同步有定义).BIt1-0:00控制,01同步,02批量,03中断.
当为同步传输时,bEndpointType的bit3-2的值不同代表的含义不同:
00:无同步
01:异步
10:适配
11:同步
BIT5:4
00: 表示数据端点
01:表示反馈端点Feedback endpoint
10:表示隐式反馈数据端点 Implicit feedback Data endpoint
11:保留wMaxPacketSize : 本端点接收或发送的最大信息包大小.
USB2.0时:对于同步端点,此值用于指示主机在调度中保留的总线时间,这是每(微)帧数据有效负载所需的时间,有效负载时间就是发送一帧数据需要占用的总线时间,在实际数据传输过程中,管道实际使用的带宽可能比保留的带宽少,大家想想,如果实际使用的带宽比保留的还多,那就丢数了;
对于其类型的端点,bit10~bit0指定最大数据包大小(以字节为单位);
bit12~bit11对于高速传输的同步和中断端点有效:bit12~bit11可指定每个微帧的额外通信次数,这里大家一定要知道是在高速传输中,当一个事务超时时,在一个微帧时间内重传的次数,如果设置为00b(None),则表示在一个微帧内只传输一个事务,不进行额外的超时重传,如果设置为01b,则表示在一个微帧内可以传输两次事务,有一次额外的重传机会,从下面可以看出,一个微帧最多可以有两次重传事务的机会,如果微帧结束了还是失败,就需要等到下一个微帧继续发送该事务;
USB3.0时:wMaxPacketSize表示包的大小。对于bulk为1024,而对于同步传输,可以为0~1024或 1024。
- bInterval : 轮询数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略.对于同步传送的端点,必须为1,对于中断传送的端点,范围为1-255.
对于全速/高速同步端点,此值必须在1到16之间。bInterval值用作2的指数,例如bInterval为4,表示周期为8个单位;
对于全速/低速中断端点,该字段的值可以是1到255,也就是主机多少ms给设备发一次数据请求;
对于高速中断端点,使用bInterval值作为2的指数,例如bInterval为4表示周期为8。这个值必须在1到16之间;
对于高速批量/控制输出端点,bInterval必须指定端点的最大NAK速率。值0表示端点永不NAK。其它值表示每个微帧的bInterval*125us时间最多1个NAK。这个值的范围必须在0到255之间;
00 = None (1 transaction per microframe)
01 = 1 additional (2 per microframe)
10 = 2 additional (3 per microframe)
11 = Reserved
其它位默认为0,
对于全速/低速批量/控制输出端点,此值无意义,可以任意指定。
3: kd> dt _USBD_PIPE_INFORMATION 0xffffbe09`4a851a58
xxx!_USBD_PIPE_INFORMATION
+0x000 MaximumPacketSize : 0x200
+0x002 EndpointAddress : 0x1 '' //写数据
+0x003 Interval : 0 ''
+0x004 PipeType : 2 ( UsbdPipeTypeBulk )
+0x008 PipeHandle : 0xffffbe09`54126d20 Void
+0x010 MaximumTransferSize : 0x400000
+0x014 PipeFlags : 0
3: kd> dt _USBD_PIPE_INFORMATION 0xffffbe09`4a851a58
xxx!_USBD_PIPE_INFORMATION
+0x000 MaximumPacketSize : 0x200
+0x002 EndpointAddress : 0x1 '' //写数据
+0x003 Interval : 0 ''
+0x004 PipeType : 2 ( UsbdPipeTypeBulk )
+0x008 PipeHandle : 0xffffbe09`54126d20 Void
+0x010 MaximumTransferSize : 0x400000
+0x014 PipeFlags : 0