我正在为基于 SDK 版本的 iMX6Q 编写裸机 uSDHC 驱动程序,但遇到读取问题(尚未尝试写入)。我可以向 SDHC 卡发送命令并得到正确的响应,因此发送命令不是问题。我相信设置读取的代码也是正确的,包括 adma2 的设置。我正在使用 CMD17(读取单块)尝试使用 Boundary Devices 的已知良好 OTS 板读取已知良好 (16GB) SDCARD 的 MBR(扇区 0)。我用值 0x5a 初始化读取缓冲区(512 字节)以检测读取的内容。这是我得到的(缓冲区从 0x104098a0 开始):
最后的 55 aa 是正确的,一些 00 字节也可能是正确的。由于没有字节是 0x5a,因此从某处读取了 512 个字节。
以下是数据应该是什么:
以下是发送命令之前的寄存器:
下面是读取后的寄存器(注意INT_STATUS已经被清除):
在我的设置中,我使用了三个 adma2 描述符。第一个覆盖从缓冲区的开始直到第一个缓存行的开始。读取的数据被读入一个单独的未缓存缓冲区(在 DRAM 中),然后复制到实际缓冲区中。第二个用于读取其余数据直至最后一个完整的 32 字节(最后一个完整缓存行)。该数据被读入物理内存,然后虚拟内存失效,迫使缓存重新加载。第三个描述符用于读取剩余的任何内容,其作用与第一个描述符相同。
adma2 描述符在本例中设置(在未缓存的 DRAM 中),缓冲区在缓存行上启动,因此仅使用两个描述符(不需要第三个)。似乎没有任何描述符错误 (AMDA_ERR_STATUS = 0),使用的 2 个描述符的地址是 0x184000C0 和 0x184000C8。ADMA_SYS_ADDR reg 显示 0x184000D0,这表明所使用的 2 个描述符已被执行。INT_STATUS reg 中没有报告错误。
它出现某种计时问题或数据未准备好,卡可以足够快地发送数据 (@25MHz)。CIHB 和 CDIHB 都被选中,如您在附加代码中所见。
有什么想法可以从哪里开始寻找有关数据为何不正确的错误?