This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:实现其他 USB 器件类

Guru**** 661510 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/882588/tm4c1294ncpdt-implementing-other-usb-device-classes

器件型号:TM4C1294NCPDT

这一问题可能是口头上的,但这里是这样的。

除了 Tiva USB 库支持的少数类别之外、有没有人成功地实现了 USB 器件?  

图书馆太疯狂了。 多层重定向、结构内的结构、虽然有一些有关如何执行此操作的文档、但这并不是很有用。

具体而言、我希望实现 USB MIDI 设备类。 这是音频类的子集(在 Tiva USB 库中具有"支持"、但未提供示例)。 由于它有两个接口、它应该被配置为一个复合器件、带有音频控制接口(通过控制端点)和 MIDI 流接口(使用两个批量端点、每个方向一个)。

我从提供的批量示例开始、因为这似乎接近我需要的内容。 但是、耶斯、它是否会更复杂? 只是描述符的设置方式,使用 tConfigSection,然后是它们的数组,然后是 tConfigHeaders,然后是它们的数组--为什么? 为什么不仅仅让描述符是两个结构、一个用于器件描述符、另一个用于整个配置描述符?  

有一个被定义为 tUSBBulkDevice 的结构、它会经常传递、并且它有一个私有成员结构 tBulkInstance、只是展开这一切都很困难、因为它没有记录为什么这样设置。 (doxygen 的巨大失败!)  

(我注意到、对于 MSP432器件而言、这一切几乎相同。)

我在 Silicon Labs EFM8UB2以及他们的 EFM32GG11上使用他们提供的 USB 器件库实施了此器件类、整个过程非常简单、只需不到一周的时间。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andy:

    作为一个继承了对 TM4C 器件的 USB 支持并完全不了解库编写方式的人... 您对该库的总结完全准确。  我希望我有时间将其拆分、然后从头开始构建它。 对于受支持的部件、毫无疑问、它 工作正常、运行良好。 但调试或添加功能会不必要地令人痛苦。

    我不确定是否有任何社区成员能够就如何进行 MIDI 设备类提供指导、我们将看到。 我不记得以前出现了 MIDI。

    为了达到这一目的、我在不久之前添加了一个仍将发布的 Host CDC 类、如果您想了解我是如何处理这种情况的、我可以与您共享这些文件。 尽管这比您尝试做的要简单得多、但我认为这可能是您的好参考点?

    理想情况下、您将能够重复使用大量驱动程序文件本身、只需制作器件级文件即可处理音频和复合片段... 也就是说、实际的复合驱动程序可能是库中最痛苦的区域。 特别是如何处理描述符创建。 我预计您将面临一些额外的挑战、但如果您成功通过复合材料、您可能会一路前进。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andy:

     遗憾的是、我们没有使用音频或 MIDI 类的 USB 设备示例。 但是、TivaWare 库中同时提供了 USB_HOST_AUDIO 示例和 USB_HOST_AUDIO_IN 示例。 您可以在中找到它们 /examples/boards/dk-tm4c129x/.  虽然它们不是针对器件的、但我希望您可以更轻松地将这些主机示例用作起点、而不是 USB_DEV_BULK。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

     我们的回答是交叉的。 感谢您的意见。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph、

    感谢您的支持和同意! 我可以理解您的立场、即必须支持您未写的内容(之前在那里)。

    至于主机 CDC 示例--正如您所知,主机和设备具有不同的功能。 对于器件端、它实际上归结为呈现描述符(响应 get_descriptor 请求)、然后当器件最终处于活动状态时、观察端点缓冲区中是否有新数据、并在端点缓冲区中呈现要发送到主机的数据。 从概念上讲、它很简单!

    从我在大容量器件示例中看到的情况来看、我应该 能够使用其中的大部分、因为它实际上只提供了两个端点缓冲器。 但它将获得与该库所需格式相同的描述符。 我过去在新处理器上启动 USB 器件时所做的是使描述符正常工作并按预期枚举器件。 一旦主机将其视为 XYZ 类的器件、我就会使数据处理工作。 现在、我甚至没有看到它尝试连接到 USB 的瞬间、更不用说开始枚举了。

    USB MIDI 实际上是一种易于实施的器件类、因为它不需要主机的自定义驱动程序、并且有许多主机工具可用于发送和接收数据。 (我喜欢 Mac 上的 PocketMIDI、有用于在 Python 中执行 MIDI 的 pyMIDI 库)。 一旦您了解了该课程如何定义"Jack"和"Jacks"之间的连接、一切都是正常的。

    如果您选择从头开始实际重做 USB 器件库、但决定仅支持 MSP432E4器件、我对此完全满意、因为它们似乎是 Tiva 器件的超集。 为此我选择了 Tiva 部件,因为它们提供了我需要的东西--高速 USB (带有附加 ULPI 芯片)和100MB 以太网,而且公平地说,当我开始寻找时,TI 网站的器件过滤器/搜索功能显示了 Tiva 部件领先于 MSP432E4!

    或者、我可能会跳入并为部件编写我自己的 USB 器件堆栈。 它会很有趣、对吧?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andy:

    从描述符的角度来看、您需要 仔细研究 USBDBulkCompositeInit API。 它将处理传递描述符信息的操作。

    要快速测试描述符在结构上是否相似、您可以尝试修改  usbdbbulk.c 中的批量设备描述符 您需要重新构建 usblib 或手动链接它、以便应用更改、然后查看是否可以证明这样开始枚举。

    希望您有一个 USB 分析器来查看发送的数据在您进行修改时是如何变化的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Ralph Jacobi"]

    尊敬的 Andy:

    从描述符的角度来看、您需要 仔细研究 USBDBulkCompositeInit API。 这将处理传递描述符信息的操作。

    我看到了! 我最初对这一点的削减是、基本上执行该函数中的操作、因为它似乎是执行实际工作的函数。 令人困惑的是、从 USB 规范的角度来看、该课程是一个复合器件。 它具有两个不同的接口。 但它不是同一类的两个实例、在 CDC 中有两个串行端口是复合的。 据我所知、库使用"复合"来表示后者、这就是它跟踪两个不同实例的交易的方式。

    [引用]要快速测试描述符的结构是否相似、您可以尝试修改  usbdbbulk.c 中的批量设备描述符 您需要重新构建 usblib 或手动链接它、以便应用更改、然后查看是否可以证明以这种方式开始枚举。

    好主意。 我已经将 usblib 源文件复制到我的工程中(并将-include 选项设置为指向它、我还删除了链接器内容中的 libusb.a 引用)。 我这么做了、所以我可以单步调试器中的库、看看什么是所谓的什么。

    [报价]希望您有一个 USB 分析器、可以在修改时查看发送的数据是如何变化的。[/报价]

    我可以了! 我已经有 Ellisys USB Tracker 很多年了--我买它是为了进行 TUSB3200A 设计。 (在那里、我自己正在老化。) 虽然我可能应该为用于高速产品的总相位 Beagle 480中的一个进行春季测试、因为其最终目标是使用 ULPI 芯片构建电路板并执行高速 USB。 (我没有做任何事情会调用 USB 3 SuperSpeed、因此使用 USB 2.0就足够了。)

    无论如何、我会将我的描述符输入到批量示例的副本中、然后报告。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 USER="Ralph Jacobi">如果描述符在结构上类似、您可以尝试修改  usbdbulk.c 中的批量器件描述符 您需要重新构建 usblib 或手动链接它、以便应用更改、然后查看是否可以证明以这种方式开始枚举。

    好的,我只是这样做了(因为包含路径是不可接受的,所以不得不与它们做点斗争)和成功--这个东西被枚举为一个 USB-MIDI 类设备。

    它不会显示在 Mac 的音频 MIDI 设置中、但这可能是因为数据传输不起作用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andy:

    很高兴看到概念证明效果良好。 您应该能够克隆大多数情况下批量描述符的处理方式、然后制作自定义 MIDI 描述符。 所有结构可能都有点乏味、但希望这能为您提供坚实的起点(也许您可以在过程中简化其中的某些部分)。

    顺便说一下、当您转向高速时、如果您还没有看到它、我们提供了 TI 参考设计 :http://www.ti.com/tool/TIDM-TM4C129USBHS

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    几天后、我又回到了这里。

    针对 Tiva 和 MSP432器件的所有类示例的所有文档都有一些关于设置各种内容的措辞、然后总是有一个调用:

    "从主初始化函数调用[class]设备驱动程序初始化函数、以配置 USB 控制器并将设备放置在总线上。"

    pvDevice = USBDCDInit (0、&g_sMouseDeviceInfo); 

    (例如鼠标设备)

    这里有一个问题。

    函数 USBDCDInit()声明为:

    void
    USBDCDInit (uint32_t ui32Index、tDeviceInfo *psDevice、void *pvDCDCBData); 

    有第三个参数!  此参数是指向包含其他结构的结构的指针、它是一个未记录的混乱。

    我是说、我理解 goofball 结构背后的原因。 源代码都编译为库、因此开发人员只需将库添加到项目中、并使用 VID、PID 和一些字符串填充空白。

    它简直无法使用、这让我想知道是否有人会感到困扰。 最糟糕的是这些东西都不是新的-- Tiva USB 库文档的日期是2013年3月-- 2016年7月修订。 因此它是死的。 MSP432库完全相同、因此也是死的。

    我正在寻找替代解决方案。 我想实际构建一些东西。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Andy:

    对于 CDC、您将使用 USBDCDCInit 进行初始化、而不是 使用 USBDCDInit。  

    USBDCDCInit 稍后将在 其中调用 USBDCDInit、并声明为:

    void *
    USBDCDCInit (uint32_t ui32Index、tUSBDCDCDevice * psCDCDevice) 

    话虽如此,我可以理解你的失望。 我们很明显地认识到它可以做得更好、但当它为成千上万的客户服务并从头开始重新做时、投资回报率将是巨大的努力、与其他活动相比、投资回报率还不够高。 我会将您的问题和投诉添加到 USB 问题列表中、但遗憾的是、这种情况很少出现、而是像现在使用的大多数工具一样。

    就文件日期而言,这将是2.1.3。 您的 TivaWare 中应该有一个2017年2月的文档、该文档是 TivaWare 的最后一个版本。 3月将发布新版本、尽管对于 usblib、更改 仅限于几个错误修复和添加 USB CDC 主机。