【问题标题】:How to identify the data bytes used for CRC(checksum) in an USB ISO-Transfer?如何识别 USB ISO 传输中用于 CRC(校验和)的数据字节?
【发布时间】:2017-11-30 22:26:20
【问题描述】:

我正在使用 libusb 从 USB 音频设备实时获取数据。我的最大数据包大小为 196 字节。我知道为校验和添加了 4 个字节。我想识别用于校验和的字节,因此我只能存储传输的有用数据,但我有一些疑问:

1) 这些字节是添加在数据包的开头还是结尾?

2) 这些字节有保留值吗?

3) 在传输中丢失一些数据字节的情况下。对于用于校验和的字节,我应该使用哪些注意事项?

编辑 1

我有这些疑问是因为我的特定设备有一个接口和 alt 设置,它适用于 48 KHz 的采样率、2 个通道、16 位深度和 196 字节的最大数据包大小。

所以有 48 个样本 * 两个通道中的 2 个 * 2 字节 = 192 字节

所以我的数据包应该是 192 字节,但是当我将设备设置为使用该接口和 alt 设置时,我开始接收 196 字节的数据包。 OUT ISO Endpoint 的相应接口和 alt 设置以 48 KHz 的采样率、2 个通道、16 位深度和 192 字节的最大数据包大小工作。

4) 如果这些字节不是来自校验和,为什么要添加这些字节?

【问题讨论】:

  • 您应该能够从协议规范中获取此信息。如果没有,则必须对其进行逆向工程。

标签: c usb libusb


【解决方案1】:

我知道为校验和添加了 4 个字节

错了。 CRC 是 2 个字节的数据包和 5 位的令牌包。 CRC也永远不会存储/转发到用户缓冲区。它在 CRC 验证期间被控制器剥离。所以你根本不会看到 CRC。 但如果您仍想查看 CRC,请附加 USB 数据包分析器并查看跟踪。

1) 这些字节是添加在数据包的开头还是结尾?

在末尾添加 2 个字节。

2) 这些字节有保留值吗?

没有。它是根据数据包的内容计算出来的

3) 在传输中丢失一些数据字节的情况下。对于用于校验和的字节,我应该使用哪些注意事项?

如果在计算 CRC 后丢失了一些字节,您将收到 USB 事务错误(来自主机的 CRC 不匹配)。主机将重试相同的事务。

PS - 我假设你使用的是高速设备

【讨论】:

  • 我知道 16 位用于 CRC,但我认为我得到了 4 个字节,因为我正在接收同步立体声端点的数据。所以 2 个字节来自第一个通道,另外 2 个字节来自第二个通道。
  • 好的,但您的主机控制器使用 CRC 进行验证,并根据结果决定将其视为好数据包还是坏数据包。如果它的数据包好,主机会将数据存储在传输描述符(EHCI)或传输环(XHCI)中。所以没有CRC存储在你的缓冲区中。
  • 另外,我认为来自一个通道的 2 个字节和来自另一个通道的 2 个字节将被打包在一个数据包中并通过链路发送。 CRC 是每个数据包而不是每个通道。最终它的一个端点一次发送一个数据包。所以每个数据包一个 CRC。
  • 你说得很好。我开始怀疑是因为 ISO-In 的最大数据包大小为 196 字节,但相应的 ISO-Out 的最大数据包大小为 192。我找不到我在哪里读到这些额外的字节用于校验和。跨度>
  • 当您说“ISO-In 的最大大小为 196 字节”时,您指的是您的特定设备还是一般设备?如果您通常将它用于同步端点,那么这将是不正确的,因为 HS USB 设备的最大大小为 1024 字节。 OUT 端点也具有相同的最大大小。检查规范。
猜你喜欢
  • 2023-03-19
  • 2011-03-22
  • 2014-05-11
  • 2015-06-29
  • 1970-01-01
  • 2016-11-13
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多