ARM Cortex-A72上DMA设备访问的缓存配置



我正在为树莓派编写一个操作系统。自定义sdhost控制器(emmc2(的SD卡驱动程序有问题树莓派4(Cortex-A72,ARMv8-A,bcm2711芯片组(。如果不使用sdma,一切都会正常工作。使用sdma,读取可以工作,但在写入扇区后,SD卡上的数据有时会包含无效数据。

对于sdma数据传输,我使用一个具有设备类型内存属性(nGNNe(的传输缓冲区。当我使用新的数据缓冲区进行dma写入传输时,SD卡上的数据是正确的。但是,当我为下一次写入重用相同的缓冲区时,SD卡上的扇区部分包含来自前一缓冲区内容的数据。

也许这是缓存一致性问题。我已启用所有缓存(I和D(。在ARM手册中,有一个关于SCU(窥探控制单元(的讨论,我不知道我是否对SCU感到困扰。

我的问题是:

  • 是否有必要在Cortex-A72上启用SCU?如何做到这一点
  • 在使用dma进行设备访问时,还需要记住哪些其他事项

我找到了问题的解决方案:在树莓派4(bcm2711芯片(上,写入dma引擎寄存器的物理地址必须是传统的主地址。传统主地址在0xC0000000-0xFFFFFFFF范围内。因此,我必须将0xC0000000添加到写入sdhci控制器寄存器的物理地址的值中。

文档可在此处找到:https://datasheets.raspberrypi.org/bcm2711/bcm2711-peripherals.pdf1.2地址图1.2.4.传统主地址

另一个SCU问题的答案是:当启用缓存时,没有必要在Raspberry Pi 4上启用SCU。

相关内容

  • 没有找到相关文章

最新更新