【问题标题】:(libusb) Confusion about continous isochronous USB streams(libusb) 关于连续同步 USB 流的困惑
【发布时间】:2014-09-03 16:30:42
【问题描述】:

我正在使用支持高速 USB 的 32 位 AVR 微控制器 (AT32UC3A3256)。我想定期将数据从我的 PC 流式传输到设备(无需确认数据),就像 USB 音频接口一样,除了我要发送的数据不是音频。此处描述了这样的接口:http://www.edn.com/design/consumer/4376143/Fundamentals-of-USB-Audio

我对 USB 同步传输有点困惑。我了解单次转移的工作原理,但如何以及何时计划下一次后续转移?我想要一个提前计算的连续数据流,但以最小的延迟和没有中断(除了一些偶尔的数据丢失)进行流式传输。据我了解,Windows 不是实时操作系统,因此我认为不应每隔 x 毫秒使用计时器来计划传输,而是使用中断/事件?或者,可能需要用尽可能多的数据连续填充缓冲区?

我认为我的问题仍然是关于 USB 的概念而不是与代码相关,但是如果有人想查看我的代码,我正在测试和修改 Atmel Studio 的 ASF 框架中的“USB Vendor Class”示例,该示例包含 AVR 的固件源和 Windows EXE 的源。 Windows 示例程序使用 libusb 和提供的驱动程序。

【问题讨论】:

    标签: windows usb 32-bit avr libusb


    【解决方案1】:

    斯蒂芬-

    您说“完全像 USB 音频”;但要小心! USB Audio 类非常非常复杂,因为它实现了一个闭环伺服系统来建立 PC 和音频设备之间的长期同步。您的应用程序中可能不需要所有这些。

    关于长期同步的更多解释:一端的音频编解码器(例如 USB 耳机)可能以标称的 48KHz 采样率运行,而另一端(例如 PC)的音频文件可能是设计为每秒提供 48,000 个样本,但 PC 和耳机永远不会以完全相同的速度运行。迟早会有缓冲区溢出或不足。因此 USB 音频类实现了一个控制管道以及音频管道。控制管道用于在一端协商轻微加速或减速,通常是设备端(例如耳机),以避免数据丢失。这就是音频设备类产品的 USB 描述符如此复杂的原因。

    如果您的应用程序可以容忍从 PC 向 AVR 传输数据的速度存在轻微误差,那么您可以省去闭环伺服。这让事情变得非常简单。

    您完全正确地假设在使用同步管道传输数据时需要长期缓冲。单个同步传输是没有意义的——你也可以使用散装管道。同步管道的全部原因是处理数据流。因此,正如您所说,必须设置大量前瞻缓冲。

    我在产品特定应用程序中使用 LibUsbK 进行 iso 传输,这些应用程序不适合任何先入为主的 USB 类。 libusbk 有相当好的 ISO 传输文档。简而言之 - 您决定每个数据包有多少字节以及每次传输多少数据包。您决定预填充多少个缓冲区(我使用五个),并为 libusbk 驱动程序提供全部内容以开始工作。然后,当驱动程序清空每个缓冲区时,您会收到回调,因此您可以用新数据填充它们。它对我来说效果很好,即使我有尴尬的采样率要处理。在我的例子中,我设置了一堆 21 个数据包,其中 20 个携带 40 个字节,第 21 个携带 44 个字节!

    希望有所帮助 - 托尼

    【讨论】:

    • 谢谢,确实有帮助!问了我的问题后,我在官方 USB2.0 规范中找到了更多信息,这解释了我必须预先填充一些缓冲区,然后交换这些缓冲区。但我还没有找到如何访问这些回调。如果我花太多时间弄清楚这一点,我可能会考虑切换到 LibUsbK :)
    • 你能进一步解释回调是如何工作的吗?我现在使用 libusbK,但写入传输总是立即完成,它不会等到设备端的缓冲区清空。请参阅此处:sourceforge.net/p/libusb-win32/mailman/message/32780350 提前致谢!
    • 您似乎对 Android Audio 了解很多。你能给我一个关于如何控制 USB 插入音频设备上流的音量的提示吗?任何提示都会非常有价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 2020-03-06
    • 2016-03-16
    • 2013-07-27
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多