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**** 2362840 points
Other Parts Discussed in Thread: AM62A7, SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

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

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

工具/软件:

您好:

我们使用 OSPI 控制器将出现此问题的 IP 移植到具有 FPGA 的 AM62A7平台。  我们将 OSPI 控制器交换到了 GPMC 控制器。  使用 DMA 使用此接口进行测试、结果没有损坏数据。  因此、这个 DMA 问题似乎仅出现在 OSPI 控制器上。

谢谢、

Victor

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

    Victor

    您是否有关于失败的更多详细信息(我知道您链接到的上一篇文章中有一些详细信息)。 这是否仍然是同样的失败?

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

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

    故障是否看起来是软件功能错误、容易且一致地重现等? 如果时序不同、您是否会看到任何区别(例如、如果您以较低的速度运行 OSPI)? 我假设没有简单的方法可以在 TI EVM 上显示再现性?

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

    是的、这是同样的失败。  我们首先注意到了集成到 FPGA 的 AM64EVM。  我们现在看到它在我们的 AM62A7电路板上、在 ASIC 上具有相同的 IP。  

    我运行了4个测试、其中前20个故障的状态将发送到控制台端口。 我插入了以下4项测试的屏幕截图。 请注意这些故障的相似之处。  在4个测试中、缓冲区和缓冲区中的索引都相同。  请注意每个迭代中以及在4个测试中的坏读取数据模式。

    我不再认为这是一个缓存问题、因为该 OSPI 驱动程序与我编写的另外两个 DMA 驱动程序共享用于分配目标缓冲区的通用代码、这两个驱动程序目前在我们的系统中工作正常。  一个驱动器在 DMA 循环模式下使用 SPI、另一个驱动器使用 GPMC 作为软件触发的 DMA 传输。  我认为故障出现在./drivers/dma/ti /*文件之一中。  

    您可以使用其中一个 EVM 和 QSPI 闪存复制此内容。  您需要将已知的4K 字节模式写入 QSPI 闪存、并以10ms 的速率重复读取。

    与其他 DMA 驱动程序不同、如果该 OSPI 驱动程序是 PKTDMA 或 BCDMA、则它没有在器件树中指定。 在驱动程序中、也没有调用 dmaengine_slave_config ()。   我假设所有这些都在为该 OSPI 控制器设置 DMA 的./drivers/dma/ti /*目录中处理、很可能是该代码中的错误。

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

    我想分享更多测试结果。

    如上一篇相关文章中所述、驱动程序可以通过 DMA 或 CPU 从 OSPI 控制器读入数据。  使用 DMA 时、数据帧将为4K 字节、以最大限度地减少中断次数。  使用 CPU、由于 FIFO 的大小、数据帧将为512字节。 使用 CPU 时、出现错误数据问题。  如果我们将 DMA 配置为也使用512字节的数据帧、则 ASIC 中的 IP 在由 DMA 或 CPU 驱动的传输之间不会看到任何差异。  因此、我使用 DMA 进行了一项测试、使用512字节的数据帧来传输数据、而前一篇文章中使用的是4K 字节。  以下是4项测试的结果。  请注意、不良数据与512数据帧在4个测试中的相似性、以及与前一篇文章中的结果的相似性。  根据这两个测试结果、相同的缓冲区和索引上会发生错误。

    请注意、在使用512或4K 数据帧的两个 DMA 传输中、某些缓冲区的不良数据为零、而其他缓冲区的数据为2个错误数据。  每个缓冲区之间的区别在于数据帧中发送到 ASIC IP 的读取地址。  读取地址从0开始、每个连续的缓冲区将读取地址递增(数据帧大小- 4)、然后在0x10000处回滚。

    由于读取地址为0的第一个缓冲区一直没有失败、因此我决定将读取地址修改为从不递增。   因此、所有数据帧的读取地址都为0。  我修改了测试程序、以便在每次数据传输后重置并重新启动 ASIC 中的 IP。  无论512或4K 数据帧如何、修改后的测试都不会导致错误数据。

    读取地址在以下代码中通过 参数 DMA_src 传递到 DMA。  是否知道读取地址导致一些缓冲区失败的原因?

    谢谢、

    Victor

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

    您好、Victor、

    感谢您提供的所有详细信息。

    我觉得问题出在 DMA 驱动程序内部。 下面创建一个测试用例并进行调试。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    读取地址从0开始、每个连续的缓冲区将读取地址递增(数据帧大小- 4)、然后回滚到0x10000。 [/报价]

    这是您的代码正在执行的操作还是您观察到发生的情况?

    如果是前者、为什么以增量"-4"? 在上一次 DMA 传输中是否读取了最后4个字节并将在下一次 DMA 传输中再次读取? src 和 DST 地址是否都按"DATA FRAME SIZE - 4"递增?

    drivers/spi/spi-cadence-quadspi.c 中的函数 cqspi_direct_read_execute ()的开头、它会检查 cqspi_use_phy ()是否存在。 您的用例是否使用 OSPI PHY 模式?

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

    我找到了问题、并使用了一种解决方法。  问题出在下面所示的函数调用中 dma_src。  此参数用作在 QSPI 数据帧中传递的基地址。  数据帧的大小为4096个字节、其中第一个字节是操作码、后跟3个字节(包含基地址)、最后是4092个字节的数据。  此 DMA_src 从0开始、每个连续的数据帧递增4092、直到超过0x10000、然后模数为0x10000。

    如果我将 DMA_src 更改为递增4096、从而使数据帧的大小为5000字节、则损坏的数据会消失。 这会导致该大小出现问题、因为我认为每次 DMA 传输都需要目标缓冲区为4K 字节对齐。  为了解决此对齐问题、每个5000字节数据帧都存储在环形缓冲区中、每个缓冲区从8192字节的偏移量开始。

    我不理解的是为什么这个 bug 发生。  如果我的 IP 存在未对齐基地址的问题、它发回的第一个字节应该有问题。 但在某些数据帧中、它始终是位于特定位置的四个字节。  不管怎么说,也许你可以解释为什么这个 bug 发生。

      Tx = dmaENGINE_PREP_DMA_memcpy (local_cqspi->rx_chanlocal_cqspi->DMA_dst、DMA_src、
                MAX8_QSPI_BUF_LEN标志);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Victor、

    感谢您在调试方面取得的巨大进展。

    DMA 本身没有缓冲区地址对齐要求。 数据缓冲区可以位于任何字节地址、DMA 硬件本身负责传输对齐。

    我想知道问题是否出在 OSPI 接口而不是 DMA 上。

    这是 OSPI SysConfig 寄存器:

    其位7"DISXIP"默认为0、这表示启用了 XIP 预取。 您能否在您的电路板上检查该位是否仍然为0? 如果是、请手动将其设置为1以禁用预取、以查看它是否会影响此数据损坏问题。

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

    您好:

    AM62A 中的 OPSI 在 XIP 的 CONFIG 寄存器中具有不同的位。  并非所有寄存器位都在驱动程序代码中定义、但定义的寄存器位是同步的。   驱动程序未定义位18:17。  因此、我必须假设这些位在复位时设置为0并保持该状态。

    谢谢、

    Victor

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

    您好:

    我将这段代码添加到 cqspi_controller_init ()中、并更改代码以确保在获得损坏的数据时 dma_src 不再像以前那样对齐。  测试导致相同的故障、这意味着此更改没有执行任何操作。

    谢谢、

    Victor

      /*启用直接访问控制器*/
      reg = readl (cqspi->iobase + CSSPI_REG_CONFIG);
      REG |= QSPI REG_CONFIG_ENB_DIR_ACC_CTRL;
      reg 且=~0x00060000
      writel (reg、cqspi->iobase + CSSPI_REG_CONFIG);

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

    您好、Victor、

    我并不是指 OSPI CONFIG_REG 寄存器、而是指 FSAS_SysConfig 寄存器。

    在不修改代码的情况下、我想您可以只使用"devmem2 0x0fc10004 w"来读取此寄存器、然后设置位7并再次使用 devmem2将其写回。

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

    是的、设置该位7会导致使用非对齐地址进行成功测试。  我会将其添加到驱动器。

    现在、我将开始研究如何实现 GPIO 触发 DMA 传输和循环模式。  我将于明天上午开始一个新职位。

    谢谢、

    Victor

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

    很棒! 感谢您的更新。

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

    您好:

    我说得太快了。  我还有一个问题。 一切都正常工作、但一次传输的整个数据完全损坏。  从上次测试开始、传送#27577和421133。  即使有这两个错误的传输,测试仍在进行中。

    我使用的是64个元素(4096字节)的环缓冲区。

    我认为环缓冲指数有某种比赛条件。

    谢谢、

    Victor

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

    您好:

    这是一个时间问题。  在某种程度上、read()函数没有返回更新值。  因此、我认为这个问题已解决。

    再次感谢您的帮助、

    Victor