ARM Cortex-A72

问题描述

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

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

也许这是一个缓存一致性问题。我已启用所有缓存(I 和 D)。在 ARM 手册中有关于 SCU(监听控制单元)的讨论,我不知道我是否对 SCU 有过烦恼。

我的问题是:

  • 是否有必要在 Cortex-A72 上启用 SCU?如何实现?
  • 在使用 dma 进行设备访问时还需要注意哪些其他事项?

解决方法

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

文档可以在这里找到: https://datasheets.raspberrypi.org/bcm2711/bcm2711-peripherals.pdf 1.2.地址图 1.2.4.旧主地址

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