gpt4 book ai didi

usb - USB 主机何时在控制读取传输结束时需要零长度的 IN 数据包?

转载 作者:行者123 更新时间:2023-12-04 09:43:12 32 4
gpt4 key购买 nike

我正在为 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 中请求的数据,则可能需要零长度数据包。

    我知道我可以让我的代码足够灵活以处理任何一种情况,但我希望我不必这样做。

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

    最佳答案

    仔细阅读 USB 规范:

    当端点执行以下任一操作时,从端点到主机的控制传输的数据阶段就完成了
    下列:

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

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

    如果 wLength > 传输大小,并且(传输大小 % ep0 大小)== 0 答案是肯定的,则您需要 ZLP。

    关于usb - USB 主机何时在控制读取传输结束时需要零长度的 IN 数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3739901/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com