我正在为 USB 设备编写代码。假设 USB 主机启动控制读取传输以从设备读取一些数据,并且请求的数据量(设置数据包中的 wLength)是端点 0 最大数据包大小的倍数。那么在主机收到所有数据后(以数个最大数据包的 IN 事务的形式),它是否会发起另一个 IN 事务以查看是否还有更多数据,即使不能更多?
这是我想知道的事件序列示例:
- USB 枚举过程:端点 0 上的最大数据包大小报告为 64。
- SETUP-DATA-ACK 事务启动控制读取传输,wLength = 128。
- IN-DATA-ACK 事务将前 64 个字节的数据传送到主机。
- IN-DATA-ACK 事务将最后 64 个字节的数据传送到主机。
- 带有零长度数据包的 IN-DATA-ACK?这种交易是否发生过?
- OUT-DATA-ACK 事务完成传输的状态阶段;转移结束。
我在我的计算机上测试了这个(Windows Vista,如果重要的话),答案是否定的:主机足够聪明,知道无法从设备接收更多数据,即使设备发送的所有数据包都已满(端点 0 上允许的最大大小)。我想知道是否有任何主机不够聪明,并且会尝试执行另一个 IN 事务并期望收到一个零长度的数据包。
我想我从 usb.org 阅读了 USB 2.0 和 USB 3.0 规范的相关部分,但我没有发现这个问题得到解决。如果有人能指出我在这些文件中的正确部分,我将不胜感激。
我知道如果设备选择发送的数据少于 wLength 中请求的主机,则可能需要一个零长度的数据包。
我知道我可以使我的代码足够灵活以处理任何一种情况,但我希望我不必这样做。
感谢任何可以回答这个问题的人!