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.
尊敬的所有人:
我对 Keystone II 系列的 DDRAM ECC 功能有疑问(我们使用 AM5K2E04):
在文档"Keystone II 架构 DDR3存储器控制器-用户指南"中、我找到了启用/禁用此功能的方法。
但我想知道如何测试 ECC 的运行。 是否有任何方法可以将错误(1位/2位)注入 Keystone II 处理器的 DDR3?
谢谢。
此致、
胡伊
您好、Huy、
请参阅 U-Boot 用户指南中的"DDR3 ECC"部分、
雷克斯
尊敬的 Rex:
感谢您的回答。
胡伊
尊敬的 Rex:
我对使用 U-Boot 的"DDR"命令注入1位错误时 ECC 的操作有疑问。
ECC 在0x80000000 - 0xFFFF 范围内被启用 (ECC 地址范围1寄存器: 0x3fff0000)、 1位 ECC 错误中断被启用。
整个存储器使用0x00000000模式进行初始化。
然后、我尝试使用"DDR"命令注入1位错误。 我运行它3次、结果如下:
第一次:
# DDR ECC_ERR 0x8000000 0x1
正在禁用 DDR ECC ...
ECC 错误测试、addr 0x80000000、读取数据0x0、写入数据0x1、错误模式:0x1、 写入数据0x1后读取
正在启用 DDR ECC...
ECC 错误测试、地址0x8000000、读取数据0x1
1位 ECC 错误计数:0x5
1位 ECC 错误地址日志:0x39d17040
第二次:
# DDR ECC_ERR 0x8000000 0x1
正在禁用 DDR ECC ...
ECC 错误测试、addr 0x80000000、读取数据0x1、写入数据0x0、错误模式:0x1、 写入数据0x0后读取
正在启用 DDR ECC...
ECC 错误测试、地址0x8000000、读取数据0x0
第三次:
# DDR ECC_ERR 0x8000000 0x1
正在禁用 DDR ECC ...
ECC 错误测试、addr 0x80000000、读取数据0x0、写入数据0x1、错误模式:0x1、 写入数据0x1后读取
正在启用 DDR ECC...
ECC 错误测试、地址0x8000000、读取数据0x1
1位 ECC 错误计数:0x4
1位 ECC 错误地址日志:0x3ca48b00
我的问题是:
谢谢。
此致、
胡伊
您好、Huy、
我怀疑当您写入 DDR 时数据可能会发生变化、因为 ECC 首先被禁用。 修改 DDR 后、启用 ECC。 系统不知道您故意修改了存储器、因此认为这是错误。
我不知道其他问题的答案。 我需要花时间进行一些读取。
雷克斯
尊敬的 Rex:
感谢您的回答。 我在过去的几天里尝试测试 ECC 的运行。
与上次不同、我已将 ECC 地址范围1寄存器的值设置为0x00010000 (ECC 覆盖范围为0x80000000 - 0x8003FFFF 的最小存储器区域)。 这样、我可以忽略不相关的错误、同时将 ECC 位错误注入 DDR。
然后、我尝试 使用"DDR"命令在地址0x8000000处注入1位 ECC 错误。 但 ECC 似乎无法检测到错误、因此无法纠正错误。
# DDR ECC_ERR 0x8000000 0x1
您是否知道为什么 ECC 无法检测到错误? 或者、您是否有任何与 ECC 操作和"DDR"命令相关的示例?
谢谢你。
胡伊
您好、 Huy、
很抱歉、我一直很忙、还没有机会查看问题并阅读。 我在星期四举行了全天会议,我最早可以在星期五看一下。 我在开始后会再回来讨论这个问题。
雷克斯
您好、Huy、
如何设置 ECC 地址范围1寄存器以及使用什么值对寄存器进行编程?
雷克斯
尊敬的 Rex:
我发现 ECC 地址范围1寄存器可以通过以下方法设置(运行命令"DDR ECC_ERR")
")在 cmd_ddr3.c 文件中:静态 int dr_memory_ecc_err (u32 base、u32 address、u32 ecc_err);
_raW_writel (ecc_start_ADDR1 |(ecc_end_ADDR1 << 16)、base + KS2_DDR3_ECC_ADDR_RANGE1_OFFSET);
在原始源代码中、ECC_END_ADDR1定义如下:
#define ECC_END_ADDR1 (((gd->start_addr_sp - DDR_remap_ADDR - CONFIG_STACKSIZE)>> 17)- 2)
我不完全理解这一定义。 在这里使用堆栈指针的起始地址有什么用途?
我的目的是为0x80000000 - 0x8003FFFF 的存储器启用 ECC。
ECC_START_ADDR1仍然相同(0x8000000)
ECC_END_ADDR1可定义为:
#define ECC_END_ADDR1 ((0x8003FFFF - DDR_REMAP_ADDR)>> 17)
我在这里犯了个错误吗?
胡伊
尊敬的 Rex:
我已经考虑了这一点。 正如我提到过的、我要为0x0.8000.0000到0x0.8003.FFFF 的存储器区域启用 ECC
因此、在本例中、ECC 地址范围的33位地址的起始地址和结束地址[32-17]仍然与32位相同、因为第33位为0。
RAM 的基地址为0x8000.0000、因此在我的情况下、需要写入 ECC 地址范围1寄存器的值为0x00001.0000
是这样吗?
胡伊
尊敬的 Rex:
我刚刚在 Linux 中写入了一个测试程序、而不是 uBoot、它可以立即确认 ECC 的操作(注入、正确检测1位错误)。
寄存器的配置值没有问题。 稍后我将使用 uBoot 命令再次进行检查。
总之、感谢您的支持。
胡伊