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.

[参考译文] SK-AM62:DMA 已使用 OSPI 控制器损坏数据读取。

Guru**** 2457760 points
Other Parts Discussed in Thread: AM62A7, AM4376

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1476789/sk-am62-dma-has-corrupt-data-reading-using-ospi-controller

器件型号:SK-AM62
主题中讨论的其他器件:AM62A7AM4376

工具与软件:

这是一个奇怪的问题、我在从 AM64-EVM 开始时看到了它。  当时、我认为它与 H/W 或更低版本的 Linux 相关。  我现在将我们的定制电路板与 AM62a7 CPU 配合使用、仍然存在这个问题。

该设计使用处于 QSPI 模式的 OSPI 控制器对 ASIC 提供1-1-4个接口。  我们的驱动程序从 SPI-cadency-quadspi.c 移植   我们的 ASIC 配置为以8kHz 的频率生成中断、我们使用 QSPI 接口读取512字节的块。  来自接收的数据是一种已知模式、每16位改变一次、我们使用该模式来确认数据完整性。  我们的系统将使用非 DMA 模式成功地从 QSPI FIFO 中读取数据、而不会出现任何错误。  切换到 DMA 模式是另一回事。  请注意、唯一的变化是驱动程序代码从非 DMA 模式切换到使用 DMA。   在协议或 ASIC 配置方面、QSPI 接口没有变化。  我确认 QSPI 波形在非 DMA 模式或 DMA 模式之间没有变化。

DMA 中显示的错误有一种模式。   第一个数据缓冲区始终没有错误。  第二个至第五个数据缓冲器始终具有32位错误。  第二个数据缓冲区中的错误总是从第18个字节开始、第三个数据缓冲区中的错误从第22个字节开始、第四个数据缓冲区中的错误从第26个字节开始、第五个数据缓冲区中的错误从第30个字节开始。  第六至第九个数据缓冲区没有错误。  该周期在第十个缓冲区上重复、但起始偏移可能会发生变化。

在后续重新启动测试时、将始终遵循这种错误数据缓冲区和偏移模式、但损坏的数据永远不会相同、而是遵循类似的模式。

上述测试方法用于通过非 DMA 或 DMA 模式将问题隔离到驱动程序代码。  DMA 模式的实际实现是以低得多的中断频率传输4K 值的数据。  使用该数据长度进行测试会产生与512字节读取相同的错误。   第一个和第六个到第九个缓冲区没有错误、而第二个到第五个缓冲区在相同的偏移量下具有相同的32位错误。

我的驱动程序有一个 DMA Rx 完成回调函数。  我在该函数的开头添加了调试代码、以验证第二个缓冲区上的数据是否损坏、然后恢复为正数。  驱动程序中还分配了用于通过 DMA 接收数据的缓冲区。 我还使用在.dts 文件中分配的静态存储器区域进行了测试、错误未发生变化。

希望了解最低层 DMA 代码的人能找出此损坏如何进入目标缓冲区。

谢谢!

胜利

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

    您好、Victor:

    「我知道了。  spi-cadence-quadspi.c 的 SPI 外设本身不使用 AM62x 器件上的 DMA。  您是如何设置的? 是指使用 DAC 模式? 您是否可以发布自定义驱动程序以便我更好地了解一切是如何设置和使用的? 如果您愿意、也可以通过电子邮件进行私下共享。

    此致、Andreas

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

    您好、Victor:

    据我所知  spi-cadence-quadspi.c 驱动程序以及 OSPI 外设本身在我们的 AM62x 器件上不使用 DMA。
    使用 linux-5.10.168时、spi-cadence-quadspi.c 中的函数 cqspi_direct_read_dma ()如下所示:

    我需要澄清我之前的说法、没错、它确实使用了 DMA。 我被抛出了一些,因为我在查看当前的内核 v6.12树,那里`cqspi_direct_read_dma ()`函数被称为`cqspi_direct_read_execute ()`所以当我检查平台特定的函数调用赋值时,这并不容易明显。

    不管怎样、听起来您正在使用的是基于 TI SDK v8.6的树、因此一切都有点旧。 您能否查看 https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/tree/drivers/spi/spi-cadence-quadspi.c?h=ti-linux-6.12.y 上已提供的当前驱动程序(来自我们即将推出的 SDK v11.0) 并将其与您自己的自定义驱动程序进行比较、看看是否存在与 OSPI 和 DMA 设置和使用相关的需要/应该移植的内容? 很明显,你已经花了很多精力在你的自定义驱动程序,所以你应该在一个好的地方,以有效地审查这方面我希望.

    此外、我之前和一位同事讨论过这个问题、这可能是一个不同的项目、但听起来您可能已经在使用 GPMC+DMA 和自定义驱动程序的组合来满足您的外部传输需求了吗? 如果这是同一个工程、为什么现在要转到 OSPI/QSPI? (只是好奇)

    此致、Andreas

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

    您好!

    我在我的版本中查看了最新的 spi-cadence-quadspi.c、没有对 cqspi_direct_read_dma ()进行任何更改。 我不希望从任何更改开始、因为 DMA 传输在该级别可以正常工作。   我认为问题出在 k3-udma.c 中的 udma_prep_dma_memcpy ()或为设置或启动 DMA 传输而调用的最低级别函数的某个位置。  我认为、在 DMA 从 OSPI 存储器区域传输到分配的存储器期间、 32位的数据片段会以某种方式覆盖写入到分配的存储器中的内容。  我认为 QSPI 存储器区域不会损坏、因为 OSPI 控制器的配置未针对 DMA 传输进行更改。

    这是我第三个尝试让 DMA 在这个 CPU 上工作的项目。  我对每一个项目都有问题。  他们中没有一个工作令我感到满意。  我的第一个 DMA 项目是在从模式下使用 SPI 从模块读取 A2D。  我可以在使用 DMA 以循环模式运行的 iMX6或 AM4376系统中实现此功能。  我在此论坛上有一个问题、要求如何使此 AM62Ax 上的 DMA 以循环模式运行、但我从未听过。  现在我必须每41ms 启动一次 DMA 传输、由于没有循环模式、这完全是在浪费时间。

    第二个 DMA 项目是通过 GPMC 从 ASIC 读取数据。  我也让它开始工作了。 问题是隔夜测试导致一两次传输的数据损坏。  这将会是一个痛苦,因为它发生的频率如此之低。  这可能与此问题有关。

    我不熟悉 k3-udma.c 或 udma_prep_dma_memcpy ()为设置和启动 DMA 传输而调用的函数。  我希望您或其他了解 DMA 在此 CPU 中工作原理的人能够了解 DMA 传输期间如何滑动数据损坏。

    谢谢!

    胜利

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

    AM62A7是否可能有类似的问题?

    e2e.ti.com/.../processor-sdk-am64x-about-bcdma-corruption-issue-id-i2285-in-the-errata-document

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

    您好、Victor:

    感谢您提供的额外信息、我知道您目前想要使用的整个系统级解决方案实际上涵盖了多个 E2E 线程。 此后我还与我的同事 Bin 讨论过这个问题。 这是一个相当复杂的主题、我们现成的软件产品并不能立即支持这一主题。 我正在重新审核您发布的所有详细信息。 我们正在内部讨论如何才能更好地继续。

    此致、Andreas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [报价用户 id="76691" url="~/support/processors-group/processors/f/processors-forum/1476789/sk-am62-dma-has-corrupt-data-reading-using-ospi-controller/5692227 #5692227"]

    AM62A7是否可能有类似的问题?

    e2e.ti.com/.../processor-sdk-am64x-about-bcdma-corruption-issue-id-i2285-in-the-errata-document

    [报价]

    勘误表 i2285仅适用于 AM64x SR 1.0、不适用于任何其他 AM6x 器件、不适用于 AM62A。 您实际上可以看到 Linux 驱动程序中仅针对该器件处理 USB 的方式...   https://git.ti.com/cgit/ti-linux-kernel/ti-linux-kernel/commit/?h=ti-linux-6.6.y&id=be0bc87e26a122ca9cbefbf337af3b80ac7ac66e

    但是、当我重新回顾您发布的内容时、我将尝试调查潜在的相关行为。

    此致、Andreas