什么时候USB主机在控制读传输结束时需要零长度的IN数据包?

我正在为USB设备编写代码.假设USB主机启动控制读取传输以从设备读取一些数据,并且请求的数据量(设置数据包中的wLength)是端点0最大数据包大小的倍数.然后在主机收到所有数据(以几个具有最大数据包的IN事务的形式)之后,它是否会启动另一个IN事务以查看是否有更多数据,即使没有更多数据?

以下是我想知道的一系列事件示例:

> USB枚举过程:端点0上的最大数据包大小报告为64.
> SETUP-DATA-ACK事务启动控制读传输,wLength = 128.
> IN-DATA-ACK事务将前64个字节的数据传送到主机.
> IN-DATA-ACK事务向主机提供最后64个字节的数据.
>带有零长度DATA数据包的IN-DATA-ACK?这次交易是否会发生?
> OUT-DATA-ACK事务完成传输的状态阶段;转移结束了.

我在我的计算机上测试了这个(Windows Vista,如果它很重要),答案是否定的:主机足够聪明,知道无法从设备接收到更多数据,即使设备发送的所有数据包都已满(端点0上允许的最大大小.我想知道是否有任何主机不够智能,并将尝试执行另一个IN事务并期望接收零长度数据包.

我想我从usb.org上阅读了USB 2.0和USB 3.0规范的相关部分,但我没有发现这个问题.如果有人能指出我在其中任何一个文件中的正确部分,我将不胜感激.

我知道如果设备选择发送的数据少于wLength中请求的主机,则可能需要零长度数据包.

我知道我可以使我的代码足够灵活,以处理任何一种情况,但我希望我没有必要.

感谢能够回答这个问题的任何人!

仔细阅读USB规范:

当端点执行其中之一时,从端点到主机的控制传输的数据阶段完成
下列:

>已准确传输在安装阶段指定的数据量
>传输有效负载大小小于wMaxPacketSize的数据包或传输零长度数据包

因此,在您的情况下,当wLength ==传输大小时,答案为否,您不需要ZLP.

在wLength>转移大小,和(转移大小%ep0大小)== 0回答是,你需要ZLP.

相关文章
相关标签/搜索