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 2.1 BOS 描述符

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/927395/tm4c1294ncpdt-usb-2-1-bos-descriptor

器件型号:TM4C1294NCPDT

您好!

我一直在尝试使用 TM4C1924NCPDT 的一个串行接口和一个批量接口来实现 USB 2.1复合器件。 我尝试搜索源代码、但无法找到使用 Tivaware USBlib 进行此操作的方法。
我缺少什么吗? 有人能给我指出这方面的正确方向吗?

谢谢!

-高拉夫

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

    [引用 user="Gaurav Pandit"]

    器件型号:TM4C1294NCPDT

    您好!

    我一直在尝试使用 TM4C1924NCPDT 的一个串行接口和一个批量接口来实现 USB 2.1复合器件。 我尝试搜索源代码、但无法找到使用 Tivaware USBlib 进行此操作的方法。
    我缺少什么吗? 有人能给我指出这方面的正确方向吗?

    [/报价]

    我对 USB 库的理解是、他们认为"复合"器件实际上是一个具有多个相同器件类实例的器件。 也就是说、考虑一个在两个方向上都有两个串行端口的 CDC 器件。

    从 USB 的角度来看、复合器件实际上是具有多个接口的器件。 例如、标准 USB 音频设备实际上是一个复合设备、因为它具有一个音频控制接口和一个或多个音频流接口。 但是、TI USB 库不会将其音频类驱动程序视为"复合"驱动程序。

    当您浏览库时、您会看到它试图变得非常聪明。 如果您的器件有两个实例、它将确定要使用的端点并跟踪所有端点。 但这是一个完整的莲花意大利面,而指向结构的重定向和指向结构的指针正在令人抓狂。

    这意味着您无法使用 TivaWare 框架轻松地将两个接口固定在一起。

    USB 库的文档中有一小部分介绍了如何实现该库不支持的器件类。 从那里开始。 基本上、您应该为复合器件创建描述符、然后使其与 tConfigHeader 和 tConfigSections 类型配合使用。

    然后创建 tCustomHandlers 结构的实例。 此结构保存您所有有关 USB 事件的回调。 该库可处理大多数事件(如枚举),但有一些需要处理的事项,主要是端点数据传输。

    然后、描述符和处理程序结构被打包成 tDeviceInfo 结构。 然后该结构作为参数在调用 USBDCDInit()时传递。

    为了使其全部正常工作、最重要的是描述符正确、以及您处理端点数据。 USB_DEV_BULK 等示例会给您带来很多障碍。 该示例使用 tUsbBuffer、这是一个位于端点数据处理程序和应用程序之间的软件环缓冲区。 您可以放弃它!

    所有操作都在包含在 tCustomHandlers 结构中的 Endpoint Handler 中完成。 有一个 USB 中断由库首先处理。 如果库无法处理该条件,它将调用您定义的处理程序。 在处理程序中、您处理触发中断的数据或条件。  

    总之、如果您认为该库令人困惑、您就不会错。

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

    尊敬的 Andy:

    感谢您发表这篇非常详细的文章。 您已经很好地描述了整个情况! 我会和大家一起同意图书馆令人困惑。 它使我以及继承它的人感到沮丧。

    您好、Gaurav、

    正如 Andy 所说的、这种能力本身并不是 USB 库的一部分、因此您需要在您的末端完成实施 我同意 Andy 关于如何执行该任务的指导。

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

    还有一件事。 Ralph 知道我一直在(作为支付账单的后台任务)实施 USB MIDI、这可能是人们想象中最简单的通信格式。 USB MIDI 设备与音频类设备的复合方式相同。 有一个音频控制接口和一个(单个) MIDI 流接口。 (实际上、可以向器件添加一个或多个音频流接口。) 我之所以这么做、是因为我的设计需要它。

    昨天晚上我终于得到了 USB 输出传输来工作了!

    USB MIDI 通过批量端点发送四字节消息。 端点数据包可以包含其中一条或多条消息。 对于输出事务(主机到器件)、HandleEndpoints 处理程序(由主 USB0 ISR 调用)会检查中断状态(传递给回调)以确保中断来自我的输出端点、然后检查端点状态以查看是否为"接收数据包就绪"。

    如果是这样、我将得到输出传输中实际接收到的字节数(USBEndpointDataAvail)、然后实际将数据从端点 FIFO 传输到本地64字节(最大包大小)缓冲区(USBEndpointDataGet)。 然后我获取该缓冲区、并使用它来构建四字节 USB MIDI 数据包。 每个数据包都被压入 FIFO。 最后、我会 ACK 数据(USBDevEndpointDataAck)、以使主机知道数据包已被接受。 这是我卡在打开状态的 ACK、但批量器件示例在 USBDBulkPacketRead 中有该 ACK 调用、因此添加后、传输工作正常。

    主循环监视我的消息 FIFO、如果它有消息、它会一次弹出一个消息、并将每个消息的内容打印到终端(UARTprintf)。 下一步是对消息执行更有用的操作、例如响应控制更改消息的指示灯 LED、或者将消息路由到基于 UART 的真正 MIDI 端口。 (基于 UART 的 MIDI 工作正常。)

    下一步是响应按钮按下操作的 USB 输入事务。 我将构建消息数据包并将其推送到 FIFO、但问题是如何开始传输? 我过去所做的是将数据排队以在缓冲区中发送、然后调用在传输完成时调用的 ISR。 ISR 将查看是否有更多字节要发送、如果有、则会启动该过程。 但我不知道在这种情况下如何调用 ISR (或者更有可能是 EndpointHandler 回调)。

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

    感谢 Andy 和 Ralph 的指导! 我不是很期待得到这么好的回应! 真的很感谢!
    USB 库有点令人困惑、但我想我会为所有 USB 请求绘制一个地图或一些内容、以便更好地了解该结构并为我的应用正确配置它。 )