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.

[参考译文] AM5K2E02:为 DDR3启用 ECC

Guru**** 655270 points
Other Parts Discussed in Thread: AM5K2E02, 66AK2E05
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/859465/am5k2e02-enabling-ecc-for-ddr3

器件型号:AM5K2E02
主题中讨论的其他部件:EVMK2G66AK2E05

现在我们在定制板上运行 DDR3、我需要启用 ECC 并测试它是否正常工作。

DDR3从地址0x8000_0000开始

我已经尝试设置了 ECCCTRL 寄存器中的 ECC 使能位。 即在0x2101_0110处设置值0x8000_0000

我的测试是启用 ECC、在 DDR3存储器中写入一个字、然后禁用 ECC 并在该位置更改一位。

我希望在重新启用 ECC 并尝试读取该位置后、它应该被校正并且 One_bit_ECC_ERR_CNT (0x2101_0130) 递增。

我还尝试按照 pdk_k2e_4_0_9分布随附的示例 ECC_TEST_APP 获取中断。 根据 AM5K2E0x 文档、DDR3_ERR 中断号为388。 这与分布中的任何中断编号都不匹配。

请帮我找到正确的设置。

谢谢

Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dan、

    该 器件的软件中的 DDR ECC 支持仅在此器件的 Linux SDK 中提供。 PDK 中对 DDR ECC 的支持仅针对 K2G、AM65x 和 AM57x 器件启用。 K2G 的实现方式应与 K2E 相似、因此请参阅此处提供的测试用例:

    pdk_k2g_1_0_15\packages/ti\CSL\examples\ecc\ecc_test_app (DDR ECC 的测试根据版本说明仅从 DSP 进行)

    您可以参阅此处定义的 DDR 初始化函数、该函数用于在文件 pdk_k2g_1_0_15\packages/ti\board\src\evmK2g\evmK2G_DDR.c 中启用 DDR ECC

    让我在内部检查一下是否有 ARM/A15测试、以检查 DDR 地址范围内的 ECC 校正并返回给您。

    此致、

    Rahul

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 Rahul 的回应、

    有一个类似的目录 pdk_k2e_4_0_9\packages/ti\cSL\examples\ecc\ecc_test_app

    我将查看两者之间的差异
    pdk_k2e_4_0_9\packages/ti\board\src\evmK2G\evmK2G_DDR.c
    pdk_k2e_4_0_9\packages/ti\board\src\evmK2e\evmK2E_DDR.c

    谢谢

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dan、您好!

    "DDR3_ERR 中断编号为388"这是 DDR3_A 的 ARM 中断 遗憾的是、在 Processor SDK RTOS 下、ARM 上没有 Keystone II 器件中断测试示例代码。 我们计划在 K2G 上执行此操作、但尚未完成。

    要解除阻止,请执行以下操作:

    一种方法是查看适用于 K2E 的处理器 SDK Linux、U-boot 下有 DDR 测试。   http://processors.wiki.ti.com/index.php/MCSDK_UG_Chapter_Exploring#DDR3_ECC。然后查看 U-boot 代码的工作原理。

    另一种方法是在 Keystone II 器件上使用裸机封装、该封装由前 TI 工程师创建、请参阅附件。 我看了它,它有 main()---- >USIM_CONFIG()和 USIM_TEST()。  


    void K2_USIM_INTERRUPTS_Init()

    GIC_INT_Config INT_cfg;

    INT_cfg.TRIGGER_TYPE= GIC_TRIGGER_TYPE_EDGE;
    INT_cfg.ucGroupNum= 1;//路由到组1,IRQ
    Int_cfg.ucPriority = GIC400_Priority_Lower;

    gpUSIM_regs->IRQSTATUS = 0xFFFFFFFF;//清除中断标志
    GIC_INTERRUPT_Hook (GIC_CONVERSIT_SPI_ID (CSL_ARM_GIC_USIM_PONIRQ)、∫μ_cfg、K2_USIM_ISR);

    这用于 ARM 中断#82。  

    请注意、该封装未进行维护、不是 TI 产品、我只能假设它在一段时间之前就可以正常工作。 这可能为您提供了一些指针、以#388替换中断、当您引入1位 ECC 错误时、您应该会看到 IRQSTATUS_RAW_SYS 设置和 One_bit_ECC_ERR_CNT 增量。 希望这能有所帮助、但我们不能支持该软件包。

    此致、Eric

    e2e.ti.com/.../K2_5F00_STK_5F00_ARM.7z

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:  

    感谢您的回答。

    我一直在研究各种代码建议、包括 K2G 代码库、以及您描述的 USIM 包。

    我的问题似乎更基本、因为我甚至看不到错误计数递增。

    我的顺序如下:

    设置映射在0x8000_0000的 DDR3后

    I SET

    ECCCTL (0x2101_0110)0xD000_0001 (ECC _EN | ECC_ADDR_RNG_PROT | RMW_EN | ECC_ADDR_RNG_1_EN)

    ECCADDR1 (0x2101_0114)0x1001_1000 (保护区域0x9000_00000x9001_0000)

    在受保护区域中设置一个值

    * 0x9000_0100 = 0xFFF_FFFF
    * 0x9000_0200 = 0xFFF_FFFF

    通过设置禁用 ECC
    ECCCTL (0x2101_0110)0x4000_0001 (ECC_ADDR_RNG_PROT | ECC_ADDR_RNG_1_EN)

    将受保护区域中的值更改一位

    * 0x9000_0100 = 0xEFFF_FFFF
    * 0x9000_0200 = 0xFFF_EFFF

    重新启用 ECC
    ECCCTL (0x2101_0110)0xD000_0001 (ECC _EN | ECC_ADDR_RNG_PROT | RMW_EN | ECC_ADDR_RNG_1_EN)

    读取写入的值

    TEST =* 0x9000_0100

    TEST =* 0x9000_0200

     

    我希望在读取值后、one 位_ECC_ERR_CNT 应该为2。

    我读取存储在的值时  

    0x2101_0130、它仍然读取0x0000_0000。

    我在这里出了什么问题?

    我已经尝试过这几次、以确保缓存被禁用(SCTLR 位 C、I 和 Z 全部设置为0)、并在写入和读取之间清除缓存并使其无效。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    "0x2101_0130、它仍然读取0x0000_0000。" === >如何读取此地址? 来自 A15或 C66x 内核? 您是否使用 CCS 存储器窗口? 是 CPU 内存视图还是物理内存视图?

    我想说 DDR ECC 寄存器实际上是36位物理地址。 它是0x1_2101_xxxx。 您可以从0x2101_xxxx 读取它、因为您有一些映射设置来转换它。 确保可以  正确查看您编程的 ECCCTL 和 ECCADDR1、然后使用相同的方法查看 USE_BIT_ECC_ERR_CNT 寄存器。 对于1位 ECC 错误、您还会在偏移量0x0138和0x013C 处看到一些日志。

    此外、您将 ECCADDR1 (0x2101_0114)编程 为 0x1001_1000 (保护区域 0x9000_0000 至 0x9001_0000)。 这对我来说并不合适。  您可以参阅 https://e2e.ti.com/support/processors/f/791/t/280814下的内容。 该计算也适用于 K2E。

    我之前测试过 Linux U-boot 中的 K2H DDR ECC、这同样适用于 K2E。 下面是1位 ECC ccurred 之后的寄存器转储:

      
    1位 ECC 由以下器件引入: http://processors.wiki.ti.com/index.php/MCSDK_UG_Chapter_Exploring#DDR3_ECC

    DDR ECC_ERR 0x90000000 0x1

    请更新 ECCADDR1、然后引入0x9000_0000处的错误。 您应该在 K2E 使用自己的代码时看到相同的结果、与使用 U-boot 的 K2H 相同。

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    从  CCS 存储器窗口和代码(计数=* 0x21010130)读取 One_bit_ECC_ERR_CNT (0x2101_0130)时、我会得到相同的结果。

    我已经查看了 CPU 内存0x2101_0110以及转换为0x00_2101_0110的物理内存。 0x01_2101_0110显示为不可用。

    阅读您所说的话、我认为重映射不正确。 它是通过 MSMC (0x0bc0_0000)中的 MPAX 寄存器进行设置的、我现在尝试使用 XMC (0x0800_0000)。

    我现在在看这个科域了吗?

    感谢你的帮助。

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dan、

    您需要具有如下所示的内容(以黄色突出显示)。

    此致、Eric  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    与这一目的更加奇怪

    我一直在尝试按照您的建议设置 XMC MPAX、但它始终在内存浏览器中显示为零。

    Ihave 一直使用折页序列来设置寄存器值。

    uint32_t * reg = 0x08000010

    *reg =0x121010FF

    ++调节

    *REG=0x2101000B

    在存储器浏览器窗口中、0x0800_0000中的存储器显示为0000_0000、如果我将鼠标悬停在数据上、则会显示消息"Target failed to read 0x0800_0010"。

    我查看了在 CCS 中设置的存储器映射。 它使用命令进行设置

    GEL_MapAddStr (0x00000000、0、0xFFFFFFFF、"R|W|AS4"、0)

    我已经尝试用"R|W"和"RAM"替换访问字符串

    我还尝试设置高速缓存。

    这些都不会产生任何影响。

    意外、我在"Memory Browser"窗口中看不到"cache"复选框。

    谢谢

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    要在 ARM 内核上测试 K2E ECC 中断、需要解决几个问题。

    1) 1)确保 通过 JTAG/CCS 存储器窗口访问 DSP C66x (非 ARM A15)内核0x0800_0000区域。

    我刚刚在 TI K2E EVM 上使用 CCS_9_0_1\CCS\ccs_base\emulation\boards\evmk2e\gel 下的标准 GEL 进行了测试、没有问题、您不必修改 GEL_MapAddStr。  

    MPAX 设置用于 DSP 内核(而非 ARM 内核)、因此您能够在0x21010000处读取如下所示的 EMIF 配置(非零)

    40461C02 40000004 6200CE62 00000000 00001869 00000000 166C9455 00001D4A
    321DFF53 00000000 543F07FF 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00FFFFFF C0071410 00021C1C
    00002010 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00010000 00000000 F2476311 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 70073200 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000305 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

    我不确定是否需要在 ARM 端进行任何设置、我可以在不执行任何操作的情况下从 A15看到地址0x21010000。

    2) 2)至少需要确保该区域可以从 ARM 内核或 DSP 内核正确回读、以便查看是否触发并记录1/2位 ECC 以及是否设置了中断位

    3) 3)设置中断位后、您可以调试 ARM 未接收中断的原因。

    此致、Eric  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    处理器是 AM5K2E02、因此没有 DSP 内核。

    谢谢

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dan、

    即使没有 C66x 内核,我也尝试了 TI K2E EVM (它具有 C66x),方法是直接连接到 A15_0,然后查看地址(32位地址) 0x2101_0000,我仍然可以看到 EMIFCFG 的正确值。

    我只需要在 A15上运行 GEL 文件:  \ccs_9_0_1\ccs\ccs_base\emulation\boards\evmk2e\gel\evmk2e_arm.gel。 您可以看到 GEL 文件配置了 DDR、它具有类似的代码

    #define DDR3A_BASE_ADDR (0x21010000)

    #define DDR3A_STATUS (*(int*)(DDR3A_BASE_ADDR + 0x00000004))
    #define DDR3A_SDCFG (*(int*)(DDR3A_BASE_ADDR + 0x00000008))
    #define DDR3A_SDRFC (*(int*)(DDR3A_BASE_ADDR + 0x00000010))
    #define DDR3A_SDTIM1 (*(int*)(DDR3A_BASE_ADDR + 0x00000018))
    #define DDR3A_SDTIT2 (*(int*)(DDR3A_BASE_ADDR + 0x0000001C))
    #define DDR3A_SDTIM3 (*(int*)(DDR3A_BASE_ADDR + 0x00000020))
    #define DDR3A_SDTIM4 (*(int*)(DDR3A_BASE_ADDR + 0x00000028))
    #define DDR3A_ZQCFG (*(int*)(DDR3A_BASE_ADDR + 0x000000C8)
    #define DDR3A_TMPALRT (*(int*)(DDR3A_BASE_ADDR + 0x000000CC))
    #define DDR3A_DDRPHYC (*(int*)(DDR3A_BASE_ADDR + 0x000000E4)

    这些寄存器由 GEL 使用并成功运行。 因此、直接使用 A15内核从 CPU/CCS 存储器窗口访问0x2101_0000区域不会出现任何问题。

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    这是令我感到困惑的地方。

    我已使用 GEL 脚本设置 DDR3、并运行您的同事提供的测试。

    然后、我将确定的值传输到 C 代码中、DDR3存储器是可访问的。

    我希望 DDR3 ECC 的设置是直接的-这只是将寄存器中的使能位设置为0x2101_0110的情况。 我最初没有设置 ECCADDR1或 ECCADDR2值、而是在 ECCCTL 中保留这些位未设置。 当我无法检测到任何 ECC 错误计数时、我实施了这些错误计数、以防出现这种情况。

    是否有启用和测试 ECC 的 GEL 脚本?

    谢谢

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经比较了66AK2E05数据表和 AM5K2E0x 数据表中的值、它们看起来都是一样的、我也在代码中包含了使用的地址。

    66AK2E05 AM5K2E02 常数
    DDRA PHY 配置 00 0232 9000 00 0232 9FFF 00 0232 9000 00 0232 9FFF C_DDRA_PHY_CONFIG_BASE 0x02329000ul
    DDR3PLL (C_BOOTCFG_DEVICE_STATE CTRL_BASE+360ul) 0x02620168ul Bootcfg
    XMC 00 0800 0000 00 0801 FFFF C_XMC_BASE 0x08000000ul
    多核共享存储器控制器(MSMC)配置 00 0BC0 0000 00 0BCF FFFF 00 0BC0 0000 00 0BCF FFFF c_MSMC_base 0x0bc00000ul
    MSMC MPAX c_MPAX 基础 0x0bc00200ul
    DDR3 EMIF 配置 00 2101 0000 00 2101 01FF 00 2101 0000 00 2101 01FF C_DDR3_EMIF_CONFIG_BASE; 0x2101000ul
    DDR3 EMIF 配置 01 2100 0000 01 2101 01FF 01 2100 0000 01 2100 01FF

    在这两种情况下、DDR3 EMIF 配置的别名均为01 2100 0000至00 2101 0000。 66AK2E05不会列出 XMC 的偏移。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    66AK2E05器件中也存在 XMC。 我查看了数据表 SPRS865B - 2013年6月- 2014年1月修订版。 K2E02和 K2E05也是如此。

    如果您能够使用 GEL 初始化 DDR3、则稍后您还会将 GEL 转换为 C 代码并初始化 DDR3、并且 DDR3可访问。 这意味着 C 代码正常工作、并且您应该能够在 CCS 存储器窗口中看到0x2101_0000区域中的 EMIF 配置为非零、或者使用 C 代码从 A15打印这些寄存器。  

    遗憾的是、我们没有用于测试 DDR ECC 的 GEL 文件。

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    我查看的 SPRS865D (2015)将该区域列为保留区域:

    00 0800 0000 00 0801 FFFF 128K 保留保留保留保留

    SPRS865B

    00 0800 0000 00 0801 FFFF 128K 扩展存储器控制器(XMC)配置扩展存储器控制器(XMC)配置扩展存储器控制器(XMC)配置

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    无论数据表的版本如何、0x0800_0000的区域都适用于 XMC 配置。 我刚刚在 ARM 内核上运行了 GEL 文件、==== >Global_Default_Setup_Silent()===== >XMC_setup():

    XMC_setup()

    /* DDR EMIF 寄存器 XMPAX*2 */的映射

    XMPAX2_L = 0x121010FF;/*替换 addr + perm *
    XMPAX2_H = 0x2101000B;/*基址地址+段大小(64KB)*///"1B"->"B"(由 XJ 提供)
    GEL_TextOut ("XMC 设置完成。\n");

    这将设置 EMF 配置。  

    确实、如果我查看了0x0800_0000的 ARM CPU 视图、它为0。 但是、如果我查看0x2101_0000的 AM CPU 视图、它的值是正确的。  

    因此、至少您需要确保能够复制我在这里看到的内容:使用在 ARM 内核0上运行的 GEL 文件、您能够在0x2101_0000处正确地看到 EMIF 配置。 这是 使用66AK2E05在 K2E EVM 上进行的测试、我们没有使用66AK2E02的 EVM、但我认为这应该是相同的行为。

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    我们的板上有五个16位 DDR3芯片。

    我仍然无法在0x0800_0000处读取 XMC 值、但我可以读取 EMIF 值0x2101_0000。 我可以配置 DDR3、并且可以访问0x8000_0000中的地址。

    使用我的 evmk2e_arm.gel 版本、我已调整 DDR3参数值以匹配我们的板、我添加了一些函数来启用 ECC。 此时、有非常基本的配置、只需启用 ECC、写入64位值、然后禁用 ECC、并在重新启用和测试之前修改该值。

    缓存未启用。

    #define EMIF_ECC_FIFO_BUF_SIZE (0x4U)

    #define EMIF_START_ADDR (0x8000000)
    #define EMIF_ECC_START_ADDR (0x90000000)
    #define EMIF_ECC_END_ADDR (0x9003FFFF)

    #define EMIF_ECC_1B_ERR_THRSH_VAL (0x2)

    #define DDR3A_base  (0x21010000)

    #define DDR3A_ECCCTL *(unsigned int *)(DDR3A_base + 0x00000110)
    #define ECC_ADDR_RNG1_EN (0x00000001)
    #define ECC_ADDR_RNG2_EN (0x00000002)
    #define ECC_RMW_EN (0x10000000)
    #define ECC_VERIFICE_EN (0x20000000)
    #define ECC_ADDR_RNG_PROT_EN (0x40000000)
    #define ECC_EN (0x8000000)

    #define DDR3A_ADDR1 *(unsigned int *)(DDR3A_base + 0x00000114)
    #define DDR3A_ADDDR2 *(unsigned int *)(DDR3A_base + 0x00000118)

    #define DDR3A_ECC_1B_CNT *(unsigned int *)(DDR3A_base + 0x00000130)
    菜单项"测试 ECC"

    ECC_InitRange()

    GEL_TextOut ("设置 ECC\n"\n 范围");

    ECCConfig (uint32_t 值)

    GEL_TextOut ("配置 ECC\n");

    DisableECC()

    GEL_TextOut ("禁用 ECC\n");
    DDR3A_ECCCTL &=~ECC_EN;
    GEL_TextOut ("ECCCTL =%x\n"、、、、 DDR3A_ECCCTL);

    EnableECC()

    GEL_TextOut ("启用 ECC\n");
    DDR3A_ECCCTL |= ECC_EN;
    GEL_TextOut ("ECCCTL =%x\n"、、、、 DDR3A_ECCCTL);

    ResetData()

    GEL_TextOut ("重置数据\n");

    Get1BCount()

    unsigned int cnt;
    CNT = DDR3A_ECC_1B_CNT;
    GEL_TextOut ("一个位计数=%d\n"、、、、 CNT);

    热菜单 InitECC()

    GEL_TextOut ("初始化 ECC\n");
    ECC_InitRange();
    ResetData();
    EnableECC();

    热菜单 testECC()


    GEL_TextOut ("测试 ECC\n");
    EnableECC();

    *(unsigned long long int *) EMIF_ECC_START_ADDR = 0xfedcba9876543211;
    Get1BCount();

    DisableECC();

    *(unsigned long long int *) EMIF_ECC_START_ADDR = 0xfedcba9876543210;

    EnableECC();
    GEL_TextOut ("读取%x %x\n"、、、、 EMIF_ECC_START_ADDR、*(unsigned long long int *) EMIF_ECC_START_ADDR);
    Get1BCount();

    谢谢

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dan、

    我想您前面提到了一些代码、例如 pdk_k2g_1_0_15\packages/ti\cSL\examples\ecc\ecc_test_app 下 K2G 的测试代码。 这也适用于 K2E。 您将其转换为 GEL。 如果引入1位错误、您是否会看到它反映在 DDR ECC 中断状态和错误统计寄存器(例如偏移量0xa4、0xac、b4、bb、0x130、 0x138、0x13c)。 如果没有、您需要检查原因? 如果是、则下一步是如何挂钩 A15中断。  

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    是的、当我引入1位错误时、我现在看到错误寄存器发生了变化。

    我现在已经在应用程序中将 GEL 文件传输回 C、并使中断正常工作。 此时、中断正在生成、但在 IRQ 中处理不正确。

    感谢您的耐心等待。

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    我想我终于找到了最后一块拼图。

    在我的测试代码中、我使用以下参数设置 ECC:

    DDR3从0x8000_0000开始

    ECCCTL (0x2101_0110) 0xF000_0001

    ECCADDR1 (0x2101_0114) 0x08010800保护0x9000_0000 - 0x9003_FFFF

    我清除所有 ECC 错误值

    One_bit_ECC_ERR_CNT (0x2101_0130)

    One_bit_ECC_ERR_DST_1 (0x2101_0138)

    One_Bit_ECC_ERR_ADDR_LOG_1 (0x2101_013C)

    Two_bit_ECC_ERR_ADDR_LO_1 (0x2101_0140)

    One_bit_ECC_ERR_DST_2 (0x2101_0144)

    我通过设置启用中断  

    IRQENABLE_SET_SYS (0x2101_00B4) 0x0000_0038

    IRQENABLE_CLR_SYS (0x2101_00BC) 0x0000_0038

    DDR3中的64位字、位于0x9000_0100至0xFFFFFF_FFFFFF_FFF_FFFF 且 ECC 被启用。

    我禁用 ECC (将0x2101_0110设置为0x7000_0001)

    将 0x9000_0100处的值设置为0xFFFL_FFFL_FFFL_FFFE_FFFE

    然后、当我重新启用 ECC 并读取测试值时、会设置以下错误值:

    One_bit_ECC_ERR_CNT (0x2101_0130) 0x0000_0008 (通常情况下、但我希望这应为1)

    One_bit_ECC_ERR_DST_1 (0x2101_0138) 0x0000_0001 (预计会出现此情况)

    One_bit_ECC_ERR_ADDR_LO_1 (0x2101_013C) 0x0800_0080 (我认为这会转换为预期的0x9000_0100)

    One_bit_ECC_ERR_DST_2 (0x2101_0144) 0x0000_0201 (我希望这应该为0)

    Two_bit_ECC_ERR_ADDR_LO_1 (0x2101_0140)通常为0、但有时为0x0800_0080。

    我不明白为什么会出现多个单位错误、以及为什么会出现双位错误。

    双位错误似乎总是会产生数据中止异常。 这是正常的吗? 是否有办法防止这种情况用于测试目的?

    谢谢

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dan、

    您当前的测试是在 A15还是 C66x 中进行的? 两个都看到了相同的问题? 大多数寄存器值都是合理的。 但在高位通道和两位地址日志上进行错误分配是很奇怪的。 我测试了 K2H 的1位错误(在线程的开头)、并且在使用 U-boot 时未发现此类问题。 K2H 和 K2E 是相同的 DDR3控制器、因此期望获得相同的结果。 您是否能够将 U-boot 写入闪存、执行1位 ECC 测试、然后连接 JTAG 以查看这些 EMIF 寄存器。

    如果您进行了几次测试、并且始终获得一致和预期的结果、则可以查看 U-boot 代码以查看 ECCCTL 是否不同以及测试序列是否不同。

    对于数据中止异常、在  IRQENABLE_SET_SYS 中、如果将其设置为0x28 (例如、禁用2位 ECC 错误中断)、这是否有帮助?

    此致、Eric

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    我尝试将 IRQENABLE_SET_SYS 设置为0x28、但这意味着仍会引发数据中止异常、但不会触发2位 ECC 中断。

    我已经做了一些更多的测试、并且启用了 ECC、即使我在受保护区域写入值并立即读回该值、我也会得到两位错误。

    我怀疑 ECC 位没有正确设置。

    我将在明年进行调查、因为我将在1月2日之前休假。

    感谢你的帮助。

    节日快乐

    Dan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Dan、

    快乐的假期!

    此致、Eric