USB主机何时要求在控制读取传输结束时数据包长度为零?
我正在为USB设备编写代码。假设USB主机启动控制读取传输以从设备读取一些数据,并且请求的数据量(设置数据包中的wLength)是端点0最大数据包大小的倍数。然后,在主机接收到所有数据(以具有最大大小数据包的多个in事务的形式)后,它是否会启动另一个in事务以查看是否有更多的数据,即使不能有更多的数据 下面是我想知道的事件序列示例:USB主机何时要求在控制读取传输结束时数据包长度为零?,usb,protocols,packets,Usb,Protocols,Packets,我正在为USB设备编写代码。假设USB主机启动控制读取传输以从设备读取一些数据,并且请求的数据量(设置数据包中的wLength)是端点0最大数据包大小的倍数。然后,在主机接收到所有数据(以具有最大大小数据包的多个in事务的形式)后,它是否会启动另一个in事务以查看是否有更多的数据,即使不能有更多的数据 下面是我想知道的事件序列示例: USB枚举进程:端点0上的最大数据包大小报告为64 SETUP-DATA-ACK事务启动控制读取传输,wLength=128 IN-DATA-ACK事务将前64个字
(*)我见过在控制传输期间(调试主机解决方案时)在不正确的时间发出输入/输出请求时设备崩溃。因此,任何做你担心的事情的主机,都可能会杀死那些设备,希望不会出现在市场上 通常,USB使用小于最大长度的数据包来划分传输的结束。因此,在传输是最大数据包长度的整数倍的情况下,ZLP用于划分 你经常在散装管道中看到这种情况。例如,如果您有一个4096字节的传输,它将被分解为整数个最大长度数据包加上一个零长度数据包。如果SW驱动程序设置了足够大的接收缓冲区,则当ZLP发生时,更高级别的SW会立即接收整个传输 控制传输是一种特殊情况,因为它们有wLength字段,所以ZLP不是严格必需的
但我强烈建议SW对两者都要灵活,因为您可能会看到不同USB主机硅或低级别HCD驱动程序的变化。仔细阅读USB规范: 当端点执行以下操作之一时,从端点到主机的控制传输的数据阶段即完成: 以下是:
- 已准确传输设置阶段指定的数据量
- 传输有效负载大小小于wMaxPacketSize的数据包或传输长度为零的数据包
如果wLength>transfer size,and(transfer size%ep0 size)==0,答案是肯定的,您需要ZLP。我想详述MBR的答案。第5.5.3节中的说明如下: 从端点到主机的控制传输的数据阶段是 当终结点执行以下操作之一时完成:
- 已准确传输设置阶段指定的数据量
- 传输有效负载大小小于wMaxPacketSize的数据包或传输长度为零的数据包
wLength
)。我认为停止是指发送暂停数据包
换句话说,在这种情况下,设备不需要零长度数据包,事实上,USB规范说它不应该提供零长度数据包。USB有一些臭名昭著的糟糕实现。有助于提高它的健壮性:在你接受的内容上要自由,在你做的事情上要保守。因此,确保你的设备在这种情况下不会损坏。没有合规主机会关心您在第三次请求时返回一个空数据包。在第一种情况下发送ZLP不必要时是否不符合规范?“ZLP不是严格必要的”-不,在“控制读取”请求的数据阶段可能是必要的,因为设备发送的数据可能少于
wLength
(例如,对于设备描述符,请求64个字节,但仅传输18个字节)“所有请求的数据”应更正为“