主题中讨论的其他器件:AM62A7、 AM4376
工具与软件:
这是一个奇怪的问题、我在从 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 代码的人能找出此损坏如何进入目标缓冲区。
谢谢!
胜利