gpt4 book ai didi

windows - USB 设备何时应在批量管道上发送 ZLP?

转载 作者:可可西里 更新时间:2023-11-01 14:48:24 25 4
gpt4 key购买 nike

我正在为与 WinUSB 主机通信的 USB 2.0 全速设备编写固件,每个方向都有一个 Bulk Pipe。设备应何时发送零长度数据包 (ZLP) 以终止 IN 传输,它如何知道应该发送?

USB 2.0 spec 的第 5.8.3 节说:

A bulk transfer is complete when the endpoint does one of the following:

  • Has transferred exactly the amount of data expected
  • Transfers a packet with a payload size less than wMaxPacketSize or transfers a zero-length packet [ZLP]

我将此解释为当传输大小是最大数据包大小的整数倍时,应该发送 ZLP,“预期”大小传输大于实际 大小(即可以发送的大小)。但收件人如何知道预期的内容?

例如,我正在使用 WinUSBNet C# 中的包装器。当我像这样从管道中读取时

int bytesRead;
buffer = new byte[128];
try
{
bytesRead = m_PipeIN.Read(buffer);
buffer = buffer.Take(bytesRead).ToArray();
}

图书馆调用WinUsb_ReadPipe()像这样:

WinUsb_ReadPipe(InterfaceHandle(ifaceIndex),
pipeID,
pBuffer + offset,
(uint)bytesToRead,
out bytesRead,
IntPtr.Zero);

假设设备恰好有 128 个字节要发送,最大数据包大小为 64 个字节。设备如何确定主机“期待”什么,从而确定它是否应该发送 ZLP 来终止传输?

(类似于 this question ,但那个是关于控制管道的。我问的是散装管道。)

最佳答案

规范说明:

案例一

Has transferred exactly the amount of data expected

这意味着如果主机期望 X 字节数,而您发送恰好 X 字节数,传输就在那里停止。 MPS 和 ZLP 不参与其中。


案例2

Transfers a packet with a payload size less than wMaxPacketSize or transfers a zero-length packet [ZLP]

这意味着如果主机需要 X 个字节,但您只想发送 Y 个字节,其中 Y < X,只要您发送一个“短”数据包(一个减去 MPS 的数据包),传输就完成了。如果 Y 字节是 MPS 的倍数,那么您必须执行 ZLP。

示例 1(无 ZLP)

MPS = 512,主机需要 8192 字节。

您只想发送 1500 字节。有效负载将像这样分 3 个数据包:

Packet 0: [512 bytes]  MPS
Packet 1: [512 bytes] MPS
Packet 2: [476 bytes] short packet

当主机收到短数据包时,它知道传输完成,不会继续要求更多的数据包进行传输。

示例 2(使用 ZLP)

MPS = 512,主机需要 8192 字节。

您只想发送 2048 字节。有效负载将像这样分 4 个数据包:

Packet 0: [512 bytes]  MPS
Packet 1: [512 bytes] MPS
Packet 2: [512 bytes] MPS
Packet 3: [512 bytes] MPS

此时,主机已收到 4 个 MPS 大小的数据包,因此它不知道传输已完成。因此它将继续向设备请求数据包。

Packet 4: [0 bytes]  short packet (ZLP)

当主机收到短数据包时,它知道传输完成,不会继续要求更多的数据包进行传输。


确定传输大小

您可能想知道如何确定“预期”的字节数,因为 BULK 传输不像 CTRL 传输那样具有长度。这完全由更高级别的协议(protocol)决定,该协议(protocol)指定如何在 BULK 管道上进行传输。主机和设备都遵循此协议(protocol),因此它们在任何给定时间都同步传输多少数据。

此协议(protocol)通常由类规范指定,例如大容量存储类协议(protocol),或者它可以是您自己设计的一些非常简单的协议(protocol)。

关于windows - USB 设备何时应在批量管道上发送 ZLP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41855995/

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