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.

[参考译文] TM4C129XKCZAD:与 DMA 一起使用时、USBHCPIPEWrite()的行为异常

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/678416/tm4c129xkczad-usbhcdpipewrite-behaving-oddly-when-used-with-dma

器件型号:TM4C129XKCZAD

我正在编写一个主机驱动程序、该驱动程序必须将大量数据从网络发送到特定于供应商的全速器件。

我的器件会枚举、我可以使用 DMA 进行批量处理。

我一直在阅读 usbhostenum.c 中的现有错误、并已将其修补以供非 DMA 使用。  它可以正常工作。

不起作用的是输出的 DMA 模式。

下面是我的管道配置代码:

//用于发送数据的输出管道。
DFUInfo.ui32BulkOutPipe = USBHCSDPipeAlloc (0、
USBHCD_PIPLE_BULK_OUT_DMA、psDevice、DFUPipeCallback);

//配置管道以与端点4配合使用。
if (DFUInfo.ui32BulkOutPipe!= 0){
int ret = USBHCPDPipeConfig (DFUInfo.ui32BulkOutPipe、
64、// uint32_t ui32MaxPayload -在描述符中观察到。
0、// uint32_t ui32Interval
4 // uint32_t ui32TargetEndpoint
);
//确保它正常工作...
if (ret!= 0){
USBHCPepeFree (DFUInfo.ui32BulkOutPipe);
DFUInfo.ui32BulkOutPipe =-1;
}

我看到的是、短写入(32字节)永远不会向总线发送数据。     较长的写入会卡在 USBHCPDPipeWrite()内部的 while (1)循环中、而它"等待状态更改"-这是有道理的、因为符号是 DMA 写入永远不会发生。

的文档  

USBHDPipeSchedule()表示它用于输入事务,但代码表示它也会处理输出事务。  这是正确的方法吗?

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

    R Sexton、您好!

    我认为可能是这样。 我对 DMA + USB 过程不是很熟悉、只是通过浏览 USB 库和我们的主机示例、就像音频示例对输入和输出操作都使用 USBHCPpeSchedule:

    //
    //安排将数据写入 FIFO。
    //
    ui32Bytes = USBHCPipeSchedule (psAudioInstance->ui32IsochOutPipe、pvBuffer、
    ui32Size); 

    我想您应该尝试这种方法、看看这是否有助于使用 DMA 输出管道数据、 因为我在 usbhostenum.c 文件中看不到任何其他 API 会对我来说同样有用、它确实包含 了用于 ePipeWriteDMASend 状态的代码、这表明它也可以用于 out。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    运气差。 USBHDPipeSchedule()在输出事务时挂起。 这里有些东西是坏的。 我从数据表中看到 TM4C129上的 USB 控制器有一个集成的 DMA 控制器、所以没有通道竞争的可能性。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    R Sexton、您好!

    我同意、不应存在通道争用。 虽然我怀疑损坏的是在实施方面而不是在库方面、因为这是我通过在论坛中搜索类似问题发现的首次出现此类问题。 虽然我了解 USB 库、但我没有编写它、因此很遗憾、我并不总是知道所有组件是如何组合在一起的。 下周我可以进一步研究一下、但我周一不在办公室、可能没有时间深入了解周二/周三的图书馆、因此可能需要几天时间才能在这一主题上提供进一步帮助。

    同时,如果您想在末尾进一步调试,我建议您继续浏览 usbhostenum.c 文件,并查找 ePipeWriteDMA*状态的用法(发送大部分,但也有其他),并查看您是否可以通过这种方式从实现中标识任何缺少的片段。 如果您对调查结果有具体问题、请将其发布在此处、我至少会尝试澄清我可以提出的任何问题、直到我有更多可用带宽。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    R Sexton、您好!

    我一直(现在仍在)出差、因此我很难将您的各种线程组合在一起。 您最近在前一晚发表的突破性文章是否解决了此问题? 相关帖子: e2e.ti.com/.../679752
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    否 到目前为止、我已经浪费了大约三天的时间来尝试让 USB 库在概念验证之外的任何级别执行。 糟糕的文档、不正确的文档和库代码中的错误之间的关系、它的工作非常缓慢、令人抓狂。

    我已经使用这些器件五年多了、其中超过10万件已经发货。 USB 代码令人非常失望、尤其是在多年拥有一流 DriverLib 的丰富经验之后。 这是我第一次必须读取库源代码以确定 API。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    R Sexton、您好!

    作为一个受命来支持当前书目的人、我可以理解对文档和库代码状态的沮丧... 虽然作为 TivaWare 示例提供的 USB 应用很强、尤其是对于器件应用、但主机端似乎只有很少的此类示例。 此外、当应用程序偏离经过充分测试的 USB 示例时、可能会出现挑战。

    所以我们仍然在同一页上,因为明天我将在旅行回来的时候再次深入探讨这个问题,然后我们总结为:“我看到的是,短写入(32字节)永远不会将数据发送到总线上。”?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我一直在检测 TI 代码、我已经确定 USBHCPDPipeWrite()不一定使用 DMA。  如果指定了 DMA、它会尝试使用 DMA、如果有问题、它会返回到非 DMA 行为。  这可能是我在大传输中看到的不可靠行为的原因。

    问题的核心似乎是 usblib/usbdma.c 中的这一点未记录代码-我使用的是具有内部 USB DMA 的器件、而不是 UDMA。

    //
    //
    // USBLibDMATransfer (),用于带有集成 DMA 控制器的 USB 控制器。
    ////
    *****************
    静态 uint32_t
    iDMAUSBTransfer (tUSBDMAInstance * psUSBDMAInst、uint32_t ui32通道、
    void *pvBuffer、uint32_t ui32Size)
    {
    uint32_t ui32PacketCount;
    
    if ((uint32_t) pvBuffer & 0x3)
    {
    返回(0);
    }
    
    //
    

    iDMAUSBTransfer()正在对缓冲区进行对齐检查,如果缓冲区未对齐则返回。   

    我的缓冲区未对齐、我无法控制它们。  它们属于网络堆栈。   

    我无法看到任何说明 USB 缓冲器必须对齐的文档。  如果它们实际上必须保持一致、我就会受困于低性能解决方案。

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

    感谢您的耐心等待。 我很确定丢弃的32字节写入是我的错误。

    看起来、DMA 的运行状态与 USB 控制器要求所有 DMA 传输都是字对齐的、并且是四个字节的倍数有关。 这是一个相当大的限制、抵消了 DMA 对于现实应用的许多优势。 它在任何地方都没有明确记录、但您可以通过读取寄存器定义从数据表中推断它。

    我正在最后一次尝试使用此接口处理 DMA、因为这对我的应用中的系统性能有很大影响。 DMA 对齐要求意味着我必须重新设计一些处理方法。

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

    我向您发送了一个 E2E 朋友请求。 我想在公共论坛上由您运行的数据表的 USB 部分有几点。