器件型号: J721EXCPXEVM
Thread: DRA829 中讨论的其他器件
尊敬的 TI 团队:
我当前在使用 DRA829 器件时遇到问题。
我的系统配置了 4GB DDR 内存、我需要使用 MSMC2DDR 桥接内联 ECC 功能启用 DDR ECC。
从 SoC 的角度来看、DDR 地址空间分为两个区域:
-
低 DDR 区域:
0x80000000 ~ 0xFFFFFFFF
-
高 DDR 区域:
0x880000000 ~ 0x8FFFFFFFF
目前、我能够在 C7x 内核的下部 2GB DDR 地址区域内成功注入和触发 ECC 错误。
但是、我无法在上部 2GB DDR 地址区域内触发 ECC 错误。
您能解释一下为什么会发生这种情况吗?
非常感谢您的支持。
我的 ECC 配置如下、我已经使用 UDMA 初始化 DDR 存储器空间、
并保留 1/9 的 DDR 空间用于 ECC 奇偶校验存储:

用于在 C7x 内核上的高 DDR 地址区域触发 ECC 错误的代码如下所示:
{
volatile uint64_t *gTest_Addr = NULL; volatile uint64_t testVal; volatile uint64_t testVal2; volatile uint64_t *translatedMemPtr;
/* Clear any residual ECC errors */ DDR_clearAllECCError();
/* Inject error */ gTest_Addr = (uint64_t *) ((0x880000000));
/* Write back any pending writes */ CacheP_wbInv ((void *)gTest_Addr, 4);
/* Read value from test location */ testVal = gTest_Addr[0];
/* Flip one bit to introduce error */ testVal2 = testVal ^ 0x00010000u;
/* Calculate translated address */ translatedMemPtr = (volatile uint64_t *)(DDRGetTranslatedAddress((uintptr_t)gTest_Addr));
/* Generating a 1b ECC error */ /* NOTE: The following section should NOT be useed in actual application */ /* ================================================================================ */
/* Temporarily disable ECC */ CSL_emifDisableECC ((CSL_emif_sscfgRegs *)CSL_COMPUTE_CLUSTER0_SS_CFG_BASE);
/* Now corrupt the value */ *(translatedMemPtr) = testVal2; CacheP_wbInv ((void *)translatedMemPtr, 4);
/* Enable back ECC */ CSL_emifEnableECC ((CSL_emif_sscfgRegs *)CSL_COMPUTE_CLUSTER0_SS_CFG_BASE);
/* ================================================================================ */
/* Invalidate cache */ CacheP_Inv ((void *)gTest_Addr, 4);
/* Read value to trigger error */ testVal2 = gTest_Addr[0];
}
#define EMIF_ECC_MEM_BLOCK_SIZE 0x200#define EMIF_ECC_DATA_SIZE_PER_BLOCK 0x40uintptr_t DDRGetTranslatedAddress(uintptr_t memAddress){ uint64_t memIndex; uintptr_t translatedMemAddr;
memIndex = (memAddress-0x880000000u)/EMIF_ECC_MEM_BLOCK_SIZE; if ((memIndex & 0x1u) == 0) { translatedMemAddr = memAddress + ((memIndex)*EMIF_ECC_DATA_SIZE_PER_BLOCK); } else { translatedMemAddr = memAddress + ((memIndex+1u)*EMIF_ECC_DATA_SIZE_PER_BLOCK); } return translatedMemAddr;}
您能告诉我、我的过程或配置是否有问题吗?