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.

[参考译文] TMS320C6657:RBL 或 IBL 的 DDR3配置、用于引导定制硬件

Guru**** 2539500 points
Other Parts Discussed in Thread: TMS320C6657, SN74AVC4T774

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1134430/tms320c6657-ddr3-configuration-of-the-rbl-or-ibl-for-booting-custom-hardware

器件型号:TMS320C6657
主题中讨论的其他器件: SN74AVC4T774

我们按照说明编译、加载和使用 C6657 EVM 的 IBL、并能够将应用程序加载到电路板上并启动应用程序。  

[ https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1057566/faq-tms320c6657-how-to-flash-the-ibl-intermediate-boot-loader-into-eeprom-and-how-to-flash-the-application-binary-into-nor-how-to-boot-the-ibl-application-binary]

我们现在正在逐步升级到我们自己的定制硬件。  我们的初始硬件具有与 EVM 相似的存储器映射(即 I2C EEPROM、SPI 闪存、DDR3)。  主要区别在于、DDR3存储器需要不同的 DDR3配置设置才能正常运行。  

第一步是 修改 EVM GEL 文件以正确配置我们的硬件。  通过这些更改、我们正确配置了 DDR3存储器、并验证了处理器正在运行、并且能够调试应用。

下一步是修改 IBL/RBL 配置以使用这些更改。  我们正在尝试仿真 EVM 的启动特性。 (即从 I2C EERPOM 加载 IBL、并从 SPI 闪存加载应用。)  但是、我们正在努力确定在何处/如何完成此任务。

  • 是否有任何文档/应用手册/说明/示例显示了在加载应用之前修改/配置 IBL 以正确配置 DDR3接口的位置/方法?
  • 是否可以直接从 SPI 闪存加载 RBL? (即直接从 SPI 闪存引导处理器。)  如果可能、是否有任何文档/应用手册/说明/示例显示在加载应用之前修改/配置 RBL 以正确配置 DDR3接口的位置/方法?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Brad、

    非常感谢。

    这是我预期/需要的结果。

    我想、我们更接近这个问题。  

    --

    将讨论通话中的其余部分。

    此致

    Shankari G

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

    Brad、

    一个简短的问题…

    在我们的会议中、在定制硬件中使用 SPI_BOOT 之后、devstat 寄存器显示50D? 这意味着 CS0未激活?  

    但是、在您之前的帖子中、devstat 寄存器值是40D??  

    ----

    ANS C6557EVM 原理图中的 CS0线路也不通过 FPGA 进行连接。

    所以... C6657 EVM 的片选0中没有 FPGA 的作用。

    此致

    Shankari G

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

    您好、Shankari、

    您是否需要我移动我当前计划 的上午8:30的呼叫、 或者您是否已经安排了新的时间、我应该取消我的呼叫?

    谢谢、

    Cameron

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

    Cameron Perl、

    Brad 和我在 IST 的下午2点会面并结束了我们的课程。

    此致

    Shankari G

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

    好的。  感谢会议的反馈。  我尝试了很多东西、但我一定错过了更改某些设置。

    此后、我更改了设置以匹配 EVM 的设置(即 DEVSTAT = 0x40D)。  然后、我加载了重新编译的简单 SPI 引导应用(通过您的修改(即配置和对执行空闲的函数的调用)来定位内部存储器。  我使用 EVM 写入器将其加载到 EVM 和定制硬件上。  注意:我添加了用于监控 EVM 和定制硬件上 SPI 线路的线路。  然后、我启动了这两个系统、并解码了与 SPI 存储器的首次通信。

    根据这些信息、定制硬件的 SPI 存储器似乎未正确编程或未正确读取。

    在呼叫过程中、您提到您想查看在定制硬件上运行的平台测试应用程序的结果。  我在开发过程中对其进行了修改、但未能实现这一目标。  呼叫后、我重新安装了 PDK。  我在编译 platform_test_evmc6657l 时遇到了一些问题。  编译此应用程序所需的更改是将已定义的 SOC_C6657符号添加到"platform_test_evmc6657l"和"platform_lib_evmc6657l"项目中。  同时在 platform_internal.h 中注释掉第200行(CSL_MDIO_0_regs 的重新声明)。

    在获取这些文件进行编译后、我在 EVM 上运行了 platform_test。  (一切都成功了)。  然后、我对其进行了修改、以通过编辑 platform_test_input 文件(即将这些值设置为0)来排除 test_nand 和 test_led 段的运行、因为我的自定义硬件没有这些功能。  

    运行测试的结果。

    [C66xx_0] p_info->version	= 2.00.00.02
    p_info->cpu.core_count	= 2
    p_info->cpu.name	= TMS320C6657
    p_info->cpu.id	= 21
    p_info->cpu.revision_id	= 0
    p_info->cpu.silicon_revision_major	= 0
    p_info->cpu.silicon_revision_minor	= 0
    p_info->cpu.megamodule_revision_major	= 8
    p_info->cpu.megamodule_revision_minor	= 1
    p_info->cpu.endian	= 1
    p_info->board_name	= TMDXEVM6657L
    p_info->frequency	= 1000
    p_info->board_rev	= 16
    p_info->led[PLATFORM_USER_LED_CLASS].count	= 4
    p_info->led[PLATFORM_SYSTEM_LED_CLASS].count	= 0
    p_info->emac.port_count	= 2
    EMAC port 0 connected to the PHY.
    MAC Address = 00:18:30:09:ec:02
    
    NOR Device: 
    p_device->device_id	= 9526
    p_device->manufacturer_id	= 194
    p_device->width	= 8
    p_device->block_count	= 64
    p_device->page_count	= 256
    p_device->page_size	= 256
    p_device->spare_size	= 0
    p_device->handle	= 47894
    p_device->flags	= 0
    p_device->bboffset	= 0
    
    EEPROM Device (@ 0x50): 
    p_device->device_id	= 80
    p_device->manufacturer_id	= 1
    p_device->width	= 8
    p_device->block_count	= 1
    p_device->page_count	= 1
    p_device->page_size	= 65536
    p_device->spare_size	= 0
    p_device->handle	= 80
    p_device->flags	= 0
    p_device->bboffset	= 0
    
    EEPROM Device (@ 0x51): 
    p_device->device_id	= 81
    p_device->manufacturer_id	= 1
    p_device->width	= 8
    p_device->block_count	= 1
    p_device->page_count	= 1
    p_device->page_size	= 65536
    p_device->spare_size	= 0
    p_device->handle	= 81
    p_device->flags	= 0
    p_device->bboffset	= 0
    Current core id is 0
    User switch 1 state is ON
    UART test start
    Open a serial port console in a PC connected to
    the board using UART and set its baudrate to 115200
    You should see following message --- 
    This is a Platform UART API unit test ...
    Type 10 characters in serial console
    Char 0 = 9
    Char 1 = 8
    Char 2 = 7
    Char 3 = 6
    Char 4 = 5
    Char 5 = 4
    Char 6 = 3
    Char 7 = 2
    Char 8 = 1
    Char 9 = 0
    UART test complete
    EEPROM test start
    test_eeprom: passed
    EEPROM test complete
    NOR test start
    test_nor: passed
    NOR test complete
    Internal memory test start
    Internal memory test (for core 1) passed
    Internal memory test complete
    External memory test start
    External memory test passed
    External memory test complete
    Test completed

    在我的自定义硬件上运行此操作会产生以下结果。

    [C66xx_0] Platform failed to initialize, errno = 0x1 
    p_info->version	= 2.00.00.02
    p_info->cpu.core_count	= 2
    p_info->cpu.name	= TMS320C6657
    p_info->cpu.id	= 21
    p_info->cpu.revision_id	= 0
    p_info->cpu.silicon_revision_major	= 0
    p_info->cpu.silicon_revision_minor	= 0
    p_info->cpu.megamodule_revision_major	= 8
    p_info->cpu.megamodule_revision_minor	= 1
    p_info->cpu.endian	= 1
    p_info->board_name	= TMDXEVM6657L
    p_info->frequency	= 1000
    p_info->board_rev	= 0
    p_info->led[PLATFORM_USER_LED_CLASS].count	= 4
    p_info->led[PLATFORM_SYSTEM_LED_CLASS].count	= 0
    p_info->emac.port_count	= 2
    EMAC port 0 connected to the PHY.
    MAC Address = 00:35:ff:a9:ac:dc
    
    NOR Device: 
    p_device->device_id	= 47895
    p_device->manufacturer_id	= 32
    p_device->width	= 8
    p_device->block_count	= 64
    p_device->page_count	= 256
    p_device->page_size	= 256
    p_device->spare_size	= 0
    p_device->handle	= 47894
    p_device->flags	= 0
    p_device->bboffset	= 0
    
    EEPROM Device (@ 0x50): 
    p_device->device_id	= 80
    p_device->manufacturer_id	= 1
    p_device->width	= 8
    p_device->block_count	= 1
    p_device->page_count	= 1
    p_device->page_size	= 65536
    p_device->spare_size	= 0
    p_device->handle	= 80
    p_device->flags	= 0
    p_device->bboffset	= 0
    
    EEPROM Device (@ 0x51): 
    p_device->device_id	= 81
    p_device->manufacturer_id	= 1
    p_device->width	= 8
    p_device->block_count	= 1
    p_device->page_count	= 1
    p_device->page_size	= 65536
    p_device->spare_size	= 0
    p_device->handle	= 81
    p_device->flags	= 0
    p_device->bboffset	= 0
    Current core id is 0
    User switch 1 state is ON
    UART test start
    Open a serial port console in a PC connected to
    the board using UART and set its baudrate to 115200
    You should see following message --- 
    This is a Platform UART API unit test ...
    Type 10 characters in serial console
    Char 0 = 1
    Char 1 = 2
    Char 2 = 3
    Char 3 = 4
    Char 4 = 5
    Char 5 = 6
    Char 6 = 7
    Char 7 = 8
    Char 8 = 9
    Char 9 = 0
    UART test complete
    EEPROM test start
    test_eeprom: passed
    EEPROM test complete
    NOR test start
    test_nor: passed
    NOR test complete
    Internal memory test start
    Internal memory test (for core 1) passed
    Internal memory test complete
    External memory test start
    External memory test failed at address = 0x80000000 
    External memory test complete
    Test completed
    

    我仍然不明白导致读取错误的原因。

    有什么建议吗?

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

    Bras、

    这很好!

    从您的日志中、我可以看到您的自定义硬件日志中、  

    外部存储器测试失败,地址= 0x80000000 -->首先尝试纠正此问题...(重要)

    ===

    其次、  

    SPI 引导后、定制硬件中的 DEVstat 值是多少?、现在?  (即、在使用 NOR 写入器并刷写 app.dat 之后、在 SPI 引导模式设置中)

    ===========

    1. 当我们执行一个将 SPI-Boot 样本刷写到中或在定制硬件上使用 NOR 写入器的实时会话时、devstat 值为0x50D。
    2. 当寄存器值被比较时、 DevSTAT 寄存器的值在 它们的定制硬件中为0x0000050D、应该为 0x0000040D
        1.   DevSTAT -->0x0000050D  -->10100001101  
        2. [5 - 0101]、[0-0000]、[D - 1101]
          • [D - 1101 ]-110  1-小端字节序
          •             110 - SPI 引导
    • [5 - 0101]- 0101 - CS0 -未激活-在定制硬件中。  (  SPI 引导器件配置位字段的第8位至第7位)

    4.     C6657 EVM 中的 DevSTAT 寄存器值为0x0000040D
      1. DevSTAT --> 0x0000040D --> 10000001101  
      2. [ 4 - 0100 ]、[0-0000]、[D - 1101]
        • [D - 1101 ]-110  1-小端字节序

                                              110 - SPI 引导
    • [4 - 0100]- 0100 - CS0和 CS1处于活动状态 -在 TI-C6657 EVM 中。  (  SPI 引导器件配置位字段的第8位至第7位)

    结论/后续步骤 
    1. 当为 SPI 引导设置了启动模式引脚时、客户必须了解为何无法在其定制硬件中将 CS0线路驱动为低电平有效。
    2. 当相同的 CS0线路的引导模式引脚被设置为非引导模式(使用 CCS + GEL)时,可以将其驱动为低电平有效。
    3. 其中、
    4. 在 SPI 引导模式和非引导模式下、在 TI-C6657 EVM 中将 CS0线路成功驱动为低电平有效。
    5. 在 TI-C6657 EVM 中、 CS0线路未通过 FPGA 连接。   因此、FPGA 在这方面没有作用。
    6. 因此,在定制板中最有可能出现硬件问题-(特别是在引导模式引脚+ CS0线路上) 。

    重要说明: 在会议中,您询问了有关引导模式设置的文档。

    您可以访问:  https://www.einfochips.com/wp-content/uploads/2016/04/C6657-Lite-EVM_TechnicalReferenceManual.pdf

    此文档可帮助您进行硬件调试:尤其是有关"引导模式开关和 SPI 协议操作"的部分。

    其他内容:   
    1. Brad 说,他将尝试替代的引导 方法:   I2C boot - IBL +App
    2. 对于 I2C 引导 方法, 我提供了以下链接: https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1057566/faq-tms320c6657-how-to-flash-the-ibl-intermediate-boot-loader-into-eeprom-and-how-to-flash-the-application-binary-into-nor-how-to-boot-the-ibl-application-binary
    3. Brad 说、他将按照链接中给出的步骤操作、并在需要时寻求有关"IBL + APP"- I2C 引导的帮助

    此致

    Shankari G

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

    我已经着手让 DDR 存储器进行初始化和测试。  在阅读 C6657存储器控制器的文档时、我不确定是否已正确配置它。  我们的定制硬件具有两 个 IS43TR16256B-125和两个 SDRAM 存储器、它们的连接方式与 EVM 的两个非 ECC 存储器类似。  我们已尝试按照说明填写两个 DDR3配置电子表格、以使用以下尝试配置 DDR3接口的方法已针对 C6657控制器的配置获得以下设置。

    e2e.ti.com/.../DDR3-Register-Calc-v4-_2800_Saratoga-1333_2900_.xlsxe2e.ti.com/.../DDR3-PHY-Calc-v11-_2800_Saratoga_2900_.xlsx

    DDR3内存接口配置不正确吗?

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

    Bras、

    好极了。

    让我看一下 DDR3寄存器的计算结果、然后返回。

    同时、请使用修改后的 DDR3寄存器配置发布更新后的 GEL 文件。

    以及 GEL 在定制硬件上运行更新/修改的 GEL 的输出...

    --

    在自定义平台上完成 DDR3测试后,让我们继续执行 I2C 引导-( IBL + App )。

    此致

    Shankari G

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

    好的。  我想您询问有关 platform_test 的修改及其结果。

    修改如下所示在 evmc6657.c 文件中。DDR3Init 函数的修改如下所示:

    /* Set the desired DDR3 configuration -- assumes 66.67 MHz DDR3 clock input */
    //#define BHS_EVM
    CSL_Status DDR3Init() 
    {
    
        CSL_Status status = CSL_SOK;    
        volatile unsigned int loopCount;
        uint32_t ddr3config, ddrPhyCtrl;
        uint8_t ddrPHYReadLatency;
        EMIF4F_TIMING1_CONFIG sdram_tim1;
        EMIF4F_TIMING2_CONFIG sdram_tim2;
        EMIF4F_TIMING3_CONFIG sdram_tim3;
        EMIF4F_OUTPUT_IMP_CONFIG    zqcfg;
        EMIF4F_PWR_MGMT_CONFIG      pwrmgmtcfg;
        EMIF4F_SDRAM_CONFIG         sdramcfg;
    
        CSL_BootCfgUnlockKicker();        
    
        /* Wait for PLL to lock = min 500 ref clock cycles. 
           With refclk = 100MHz, = 5000 ns = 5us */
        platform_delaycycles(50000);
    
        /**************** 3.3 Leveling Register Configuration ********************/
        CSL_BootCfgGetDDRConfig(0, &ddr3config);
        ddr3config &= ~(0x007FE000);  // clear ctrl_slave_ratio field
        CSL_BootCfgSetDDRConfig(0, ddr3config);
    
        CSL_BootCfgGetDDRConfig(0, &ddr3config);
        ddr3config |= 0x00200000;     // set ctrl_slave_ratio to 0x100
        CSL_BootCfgSetDDRConfig(0, ddr3config);
    
        CSL_BootCfgGetDDRConfig(12, &ddr3config);
        ddr3config |= 0x08000000;    // Set invert_clkout = 1
        CSL_BootCfgSetDDRConfig(12, ddr3config);
    
        CSL_BootCfgGetDDRConfig(0, &ddr3config);
        ddr3config |= 0xF;            // set dll_lock_diff to 15
        CSL_BootCfgSetDDRConfig(0, ddr3config);
    
    #ifdef BHS_EVM
        CSL_BootCfgGetDDRConfig(23, &ddr3config);
        ddr3config |= 0x00000200;    // See section 4.2.1, set for partial automatic leveling
        CSL_BootCfgSetDDRConfig(23, ddr3config);
    #else
        CSL_BootCfgGetDDRConfig(52, &ddr3config);
        ddr3config |= 0x00000200;    // See section 4.2.1, set for partial automatic leveling
        CSL_BootCfgSetDDRConfig(52, ddr3config);
        CSL_BootCfgGetDDRConfig(53, &ddr3config);
        ddr3config |= 0x00000200;    // See section 4.2.1, set for partial automatic leveling
        CSL_BootCfgSetDDRConfig(53, ddr3config);
        CSL_BootCfgGetDDRConfig(54, &ddr3config);
        ddr3config |= 0x00000200;    // See section 4.2.1, set for partial automatic leveling
        CSL_BootCfgSetDDRConfig(54, ddr3config);
        CSL_BootCfgGetDDRConfig(55, &ddr3config);
        ddr3config |= 0x00000200;    // See section 4.2.1, set for partial automatic leveling
        CSL_BootCfgSetDDRConfig(55, ddr3config);
    #endif
        /**************** 3.3 Partial Automatic Leveling ********************/
    #ifdef BHS_EVM
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(2,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(3,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(4,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(5,  ddr3config);
        ddr3config = 0x00000033;  CSL_BootCfgSetDDRConfig(6,  ddr3config);
        ddr3config = 0x0000003A;  CSL_BootCfgSetDDRConfig(7,  ddr3config);
        ddr3config = 0x0000002C;  CSL_BootCfgSetDDRConfig(8,  ddr3config);
        ddr3config = 0x0000002C;  CSL_BootCfgSetDDRConfig(9,  ddr3config);
        ddr3config = 0x0000001C;  CSL_BootCfgSetDDRConfig(10, ddr3config);
    
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(14,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(15,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(16,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(17,  ddr3config);
        ddr3config = 0x000000B7;  CSL_BootCfgSetDDRConfig(18,  ddr3config);
        ddr3config = 0x000000B1;  CSL_BootCfgSetDDRConfig(19,  ddr3config);
        ddr3config = 0x000000A4;  CSL_BootCfgSetDDRConfig(20,  ddr3config);
        ddr3config = 0x000000A4;  CSL_BootCfgSetDDRConfig(21,  ddr3config);
        ddr3config = 0x00000098;  CSL_BootCfgSetDDRConfig(22,  ddr3config);
    #else
        ddr3config = 0x0000005A;  CSL_BootCfgSetDDRConfig(2,  ddr3config);
        ddr3config = 0x0000005B;  CSL_BootCfgSetDDRConfig(3,  ddr3config);
        ddr3config = 0x00000044;  CSL_BootCfgSetDDRConfig(4,  ddr3config);
        ddr3config = 0x00000044;  CSL_BootCfgSetDDRConfig(5,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(6,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(7,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(8,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(9,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(10, ddr3config);
    
        ddr3config = 0x00000081;  CSL_BootCfgSetDDRConfig(14,  ddr3config);
        ddr3config = 0x00000080;  CSL_BootCfgSetDDRConfig(15,  ddr3config);
        ddr3config = 0x00000079;  CSL_BootCfgSetDDRConfig(16,  ddr3config);
        ddr3config = 0x00000079;  CSL_BootCfgSetDDRConfig(17,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(18,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(19,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(20,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(21,  ddr3config);
        ddr3config = 0x00;        CSL_BootCfgSetDDRConfig(22,  ddr3config);
    #endif
    #ifdef BHS_EVM
    #else
        /*Correct DQS-DQ write timing offset                   */
        ddr3config = 0x01000000;  CSL_BootCfgSetDDRConfig(1,  ddr3config);
    #endif
        /*Do a PHY reset. Toggle DDR_PHY_CTRL_1 bit 15 0->1->0 */
        CSL_EMIF4F_GetPhyControl(&ddrPhyCtrl, &ddrPHYReadLatency);
        ddrPhyCtrl &= ~(0x00008000);
        CSL_EMIF4F_SetPhyControl(ddrPhyCtrl,  ddrPHYReadLatency);
    
        CSL_EMIF4F_GetPhyControl(&ddrPhyCtrl, &ddrPHYReadLatency);
        ddrPhyCtrl |= (0x00008000);
        CSL_EMIF4F_SetPhyControl(ddrPhyCtrl,  ddrPHYReadLatency);
    
        CSL_EMIF4F_GetPhyControl(&ddrPhyCtrl, &ddrPHYReadLatency);
        ddrPhyCtrl &= ~(0x00008000);
        CSL_EMIF4F_SetPhyControl(ddrPhyCtrl,  ddrPHYReadLatency);
    
        /***************** 3.4 Basic Controller and DRAM configuration ************/
        /* enable configuration */
        /*    hEmif->SDRAM_REF_CTRL    = 0x00006180; */
        CSL_EMIF4F_EnableInitRefresh();
    #ifdef BHS_EVM
        CSL_EMIF4F_SetRefreshRate(0x515C);
    #else
        CSL_EMIF4F_SetRefreshRate(0x5161);
    #endif
    #ifdef BHS_EVM
        sdram_tim1.t_wtr    = 4;
        sdram_tim1.t_rrd    = 1;
        sdram_tim1.t_rc     = 0x20;
        sdram_tim1.t_ras    = 0x17;
        sdram_tim1.t_wr     = 0x09;
        sdram_tim1.t_rcd    = 0x09;
        sdram_tim1.t_rp     = 0x09;
    #else
        sdram_tim1.t_wtr    = 4;
        sdram_tim1.t_rrd    = 7;
        sdram_tim1.t_rc     = 0x20;
        sdram_tim1.t_ras    = 0x17;
        sdram_tim1.t_wr     = 0x09;
        sdram_tim1.t_rcd    = 0x08;
        sdram_tim1.t_rp     = 0x08;
    #endif
        CSL_EMIF4F_SetTiming1Config(&sdram_tim1);
    
        /*    hEmif->SDRAM_TIM_2   = 0x40877FEC; */
    #ifdef BHS_EVM
        sdram_tim2.t_cke    = 3;
        sdram_tim2.t_rtp    = 4;
        sdram_tim2.t_xsrd   = 0x1FF;
        sdram_tim2.t_xsnr   = 0x071;
        sdram_tim2.t_xp     = 3;
        sdram_tim2.t_odt    = 0;
    #else
        sdram_tim2.t_cke    = 3;
        sdram_tim2.t_rtp    = 4;
        sdram_tim2.t_xsrd   = 0x1FF;
        sdram_tim2.t_xsnr   = 0x0B3;
        sdram_tim2.t_xp     = 3;
        sdram_tim2.t_odt    = 0;
    #endif
        CSL_EMIF4F_SetTiming2Config (&sdram_tim2);
    
        /*    hEmif->SDRAM_TIM_3   = 0x55BF87FF; */
    #ifdef BHS_EVM
        sdram_tim3.t_rasMax     = 0xF;
        sdram_tim3.t_rfc        = 0x06A;
        sdram_tim3.t_tdqsckmax  = 0;
        sdram_tim3.zq_zqcs      = 0x3F;
        sdram_tim3.t_ckesr      = 4;
        sdram_tim3.t_csta       = 0x5;
        sdram_tim3.t_pdll_ul    = 0x5;
    #else
        sdram_tim3.t_rasMax     = 0xF;
        sdram_tim3.t_rfc        = 0x0AD;
        sdram_tim3.t_tdqsckmax  = 0;
        sdram_tim3.zq_zqcs      = 0x3F;
        sdram_tim3.t_ckesr      = 4;
        sdram_tim3.t_csta       = 0x5;
        sdram_tim3.t_pdll_ul    = 0x5;
    #endif
        CSL_EMIF4F_SetTiming3Config (&sdram_tim3);
    
        /*    hEmif->DDR_PHY_CTRL_1   = 0x0010010F; */
        ddrPHYReadLatency   = 0x0F;
        ddrPhyCtrl          = (0x0010010F);
        CSL_EMIF4F_SetPhyControl(ddrPhyCtrl,  ddrPHYReadLatency); /* BHS???  Why???*/
    
        /*    hEmif->ZQ_CONFIG        = 0x70074C1F; */
    #ifdef BHS_EVM
        zqcfg.zqRefInterval     = 0x4C1F;
        zqcfg.zqZQCLMult        = 3;
        zqcfg.zqZQCLInterval    = 1;
        zqcfg.zqSFEXITEn        = 1;
        zqcfg.zqDualCSEn        = 1;
        zqcfg.zqCS0En           = 1;
        zqcfg.zqCS1En           = 0;
    #else
        zqcfg.zqRefInterval     = 0x3214;
        zqcfg.zqZQCLMult        = 3;
        zqcfg.zqZQCLInterval    = 1;
        zqcfg.zqSFEXITEn        = 1;
        zqcfg.zqDualCSEn        = 1;
        zqcfg.zqCS0En           = 1;
        zqcfg.zqCS1En           = 0;
    #endif
        CSL_EMIF4F_SetOutputImpedanceConfig(&zqcfg);
    
        /*    hEmif->PWR_MGMT_CTRL    = 0x0; */
        pwrmgmtcfg.csTime           = 0;
        pwrmgmtcfg.srTime           = 0;
        pwrmgmtcfg.lpMode           = 0;
        pwrmgmtcfg.dpdEnable        = 0;
        pwrmgmtcfg.pdTime           = 0;
        CSL_EMIF4F_SetPowerMgmtConfig  (&pwrmgmtcfg);
    
    #ifdef BHS_EVM
    #else
        CSL_EMIF4F_SetRefreshRate(0x5161);
    #endif
    
        /* New value with DYN_ODT disabled and SDRAM_DRIVE = RZQ/7 */
        /*    hEmif->SDRAM_CONFIG     = 0x63077AB3; */
        CSL_EMIF4F_GetSDRAMConfig (&sdramcfg);
    #ifndef BHS_EVM
        sdramcfg.pageSize           = 2;
        sdramcfg.eBank              = 0;
        sdramcfg.iBank              = 3;
        sdramcfg.rowSize            = 5;
        sdramcfg.CASLatency         = 14;
        sdramcfg.narrowMode         = 1;
        sdramcfg.CASWriteLat        = 3;
        sdramcfg.SDRAMDrive         = 1;
        sdramcfg.disableDLL         = 0;
        sdramcfg.dynODT             = 2;
        sdramcfg.ddrDDQS            = 0;
        sdramcfg.ddrTerm            = 2;
        sdramcfg.iBankPos           = 0;
        sdramcfg.type               = 3;
    #else
        sdramcfg.pageSize           = 3;
        sdramcfg.eBank              = 0;
        sdramcfg.iBank              = 3;
        sdramcfg.rowSize            = 6;
        sdramcfg.CASLatency         = 10;
        sdramcfg.narrowMode         = 1;
        sdramcfg.CASWriteLat        = 2;
        sdramcfg.SDRAMDrive         = 0;
        sdramcfg.disableDLL         = 0;
        sdramcfg.dynODT             = 0;
        sdramcfg.ddrDDQS            = 0;
        sdramcfg.ddrTerm            = 3;
        sdramcfg.iBankPos           = 0;
        sdramcfg.type               = 3;
    #endif
        CSL_EMIF4F_SetSDRAMConfig (&sdramcfg);
    
        pll_delay(840336); /*Wait 600us for HW init to complete*/
    
        /* Refresh rate = (7.8*666MHz] */
        /*    hEmif->SDRAM_REF_CTRL   = 0x00001450;     */
    #ifdef BHS_EVM
        CSL_EMIF4F_SetRefreshRate(0x0000144F);
    #else
        CSL_EMIF4F_SetRefreshRate(0x00001458);
    #endif
    
        /***************** 4.2.1 Partial automatic leveling ************/
        /*    hEmif->RDWR_LVL_RMP_CTRL      =  0x80000000; */
        CSL_EMIF4F_SetLevelingRampControlInfo(1, 0, 0, 0, 0);
    
        /* Trigger full leveling - This ignores read DQS leveling result and uses ratio forced value */
        /*    hEmif->RDWR_LVL_CTRL          =  0x80000000; */
        CSL_EMIF4F_SetLevelingControlInfo(1, 0, 0, 0, 0);
    
        /************************************************************
          Wait for min 1048576 DDR clock cycles for leveling to complete
          = 1048576 * 1.5ns = 1572864ns = 1.57ms.
          Actual time = ~10-15 ms
         **************************************************************/
        pll_delay(4201680); //Wait 3ms for leveling to complete
    
        return (status);
    
    }
    

    platform_test_input.txt 被修改为不初始化 phy 和 ECC、也不运行 LED 和 UART 测试。

    init_pll   = 1
    init_ddr   = 1
    init_uart   = 1
    init_tcsl   = 1
    init_phy    = 0
    init_ecc  = 0
    
    print_info            = 1
    print_current_core_id = 1
    print_switch_state    = 1
    test_eeprom           = 1
    test_nand             = 0
    test_nor              = 1
    test_led              = 0
    test_uart             = 0
    run_external_memory_test = 1
    run_internal_memory_test = 1
    
    init_config_pll1_pllm     = 20
    init_config_uart_baudrate = 115200
    
    nand_test_block_number = 510
    nor_test_sector_number = 10
    led_test_loop_count = 1 
    led_test_loop_delay = 2000000
    ext_mem_test_base_addr = 0x80000000
    ext_mem_test_length    = 0x1fffffff
    int_mem_test_core_id   = 1
    

    在调试过程中、我还添加了一些打印语句、以显示程序在执行过程中的位置(即显示在结果中)。

    运行此代码会产生以下结果。

    [C66xx_0] Platform Test: Start
    Platform Test: Parse Input
    Platform Test: Init
    PlatformInit: PLL
    PlatformInit: DDR3
    PlatformInit: DDR3 MEM TEST
    p_info->version	= 2.00.00.02
    p_info->cpu.core_count	= 2
    p_info->cpu.name	= TMS320C6657
    p_info->cpu.id	= 21
    p_info->cpu.revision_id	= 0
    p_info->cpu.silicon_revision_major	= 0
    p_info->cpu.silicon_revision_minor	= 0
    p_info->cpu.megamodule_revision_major	= 8
    p_info->cpu.megamodule_revision_minor	= 1
    p_info->cpu.endian	= 1
    p_info->board_name	= TMDXEVM6657L
    p_info->frequency	= 1000
    p_info->board_rev	= 0
    p_info->led[PLATFORM_USER_LED_CLASS].count	= 4
    p_info->led[PLATFORM_SYSTEM_LED_CLASS].count	= 0
    p_info->emac.port_count	= 2
    EMAC port 0 connected to the PHY.
    MAC Address = 00:35:ff:a9:a3:64
    
    NOR Device: 
    p_device->device_id	= 47895
    p_device->manufacturer_id	= 32
    p_device->width	= 8
    p_device->block_count	= 64
    p_device->page_count	= 256
    p_device->page_size	= 256
    p_device->spare_size	= 0
    p_device->handle	= 47894
    p_device->flags	= 0
    p_device->bboffset	= 0
    
    EEPROM Device (@ 0x50): 
    p_device->device_id	= 80
    p_device->manufacturer_id	= 1
    p_device->width	= 8
    p_device->block_count	= 1
    p_device->page_count	= 1
    p_device->page_size	= 65536
    p_device->spare_size	= 0
    p_device->handle	= 80
    p_device->flags	= 0
    p_device->bboffset	= 0
    
    EEPROM Device (@ 0x51): 
    p_device->device_id	= 81
    p_device->manufacturer_id	= 1
    p_device->width	= 8
    p_device->block_count	= 1
    p_device->page_count	= 1
    p_device->page_size	= 65536
    p_device->spare_size	= 0
    p_device->handle	= 81
    p_device->flags	= 0
    p_device->bboffset	= 0
    Current core id is 0
    User switch 1 state is ON
    EEPROM test start
    test_eeprom: passed
    EEPROM test complete
    NOR test start
    test_nor: passed
    NOR test complete
    Internal memory test start
    Internal memory test (for core 1) passed
    Internal memory test complete
    External memory test start
    External memory test passed
    External memory test complete
    Test completed
    

    运行测试的视频。

    e2e.ti.com/.../Platform_5F00_test-run_5F00_Passing.mp4

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

    Brad、

    之前、在平台测试中、DDR3测试失败。  

    地址= 0x80000000时、外部存储器测试失败

    现在它已通过。

    --

    请告诉我,在自定义硬件中导致“外部内存测试通过”的变化是什么?

    此致

    Shankari G

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

    Brad、

    观看视频。 感谢您发布视频。

    --

    实际上,在定制硬件中进行外部存储器测试需要更多的时间。(比 EVM 长5倍)  

    首先、我们必须找到原因...

    我们也可以使用

    带调试测试选项的 GEL 文件。

    2.单独的 DDR3调试测试代码(适用于 Keyston - II - DDR3常见问题解答)  

    3.在平台测试中,使用断点,并检查为何与 TI-EVM 相比需要更长的时间。

    --

    实际上,此延迟可能会导致所有引导方法(SPI-NOR、EEPROM-I2C 引导等)出现问题

    此致

    Shankari G

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

    以前、我没有对 platform_test 应用中的 DDR 配置进行任何更改。  在您建议让此应用程序正常工作可能有助于解决引导问题后、我修改了此应用程序的 DDR 配置。   

    上一个帖子中显示的代码更改就是更改的内容。

    [引用 userid="476937" URL"~/support/processors-group/processors/f/processors-forum/1134430/tms320c6657-ddr3-configuration-of-the-rbl-or-ibl-for-booting-custom-hardware/4389706 #4389706"]修改如下所示在 evmc6657.c 文件中 DDR3Init 函数[/quot]

    但是、我最初的更改没有配置 DDR。  因此、在真正的"我不知道发生了什么"调试中。  我开始恢复对原始配置所做的一些更改。  我发现、如果我将对 sdramcfg 寄存器所做的更改恢复为 EVM 的更改、DDR 将会初始化并正常工作。  但是、我不理解为什么...  我假设我对数据表的解释和 DDR EMIF 的配置存在问题。  这就是为什么我在我们的定制硬件上传输了配置工作表以及有关连接到处理器的内存的更多信息。  我现在所知道的是、配置可能有问题(可能是该寄存器)。

    #ifndef BHS_EVM
        // origninal EVM definition of this register
        sdramcfg.pageSize           = 2;
        sdramcfg.eBank              = 0;
        sdramcfg.iBank              = 3;
        sdramcfg.rowSize            = 5;
        sdramcfg.CASLatency         = 14;
        sdramcfg.narrowMode         = 1;
        sdramcfg.CASWriteLat        = 3;
        sdramcfg.SDRAMDrive         = 1;
        sdramcfg.disableDLL         = 0;
        sdramcfg.dynODT             = 2;
        sdramcfg.ddrDDQS            = 0;
        sdramcfg.ddrTerm            = 2;
        sdramcfg.iBankPos           = 0;
        sdramcfg.type               = 3;
    #else
        // Calculated from the datasheet for the new memory
        sdramcfg.pageSize           = 3;
        sdramcfg.eBank              = 0;
        sdramcfg.iBank              = 3;
        sdramcfg.rowSize            = 6;
        sdramcfg.CASLatency         = 10;
        sdramcfg.narrowMode         = 1;
        sdramcfg.CASWriteLat        = 2;
        sdramcfg.SDRAMDrive         = 0;
        sdramcfg.disableDLL         = 0;
        sdramcfg.dynODT             = 0;
        sdramcfg.ddrDDQS            = 0;
        sdramcfg.ddrTerm            = 3;
        sdramcfg.iBankPos           = 0;
        sdramcfg.type               = 3;
    #endif

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

    Brad、

    好的。

    我需要一些时间来查看您使用的 DRAM 芯片的 DDR3计算展板。

    --

    同时、您可以执行以下操作:

    DDR3调试源代码可从这里获得--->https://www.ti.com/lit/an/sprac04/sprac04.pdf ( 在第 n:1页,第三行)  

    (下载“sprac04.zip” http://www.ti.com/lit/zip/sprac04后,解压缩并找到 GEL,“Keystone2_DDR_Debug_v1_4.gel ”)  

    1.下载并修改 Keystone-I 的源代码

    2.  通过与  Keystone2_DDR_Debug_v1_4.gel 进行比较来修改您的定制硬件 GEL 文件  

    --

    这将在您的定制硬件中调试您的 DDR3。

    此致

    Shankari G  

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

    我一直致力于将 Keystone2_DDR_Debug 转换为以 Keystone1_DDR 处理器为目标。  我让它打印出 PLL 配置和 EMIF 配置。  仍在处理其他部件。  但是、"好东西"(即 、来自 PGSR0和 DX0GSR 寄存器的错误指示在 Keystone 1 DDR 寄存器集中似乎不存在。  是否正确,Keystone1 DDR 接口不支持与 Keystone2接口相同的错误报告?

    此外、我运行了一些测试来比较我的定制硬件与 EVM 的运行情况。

    1.  定制硬件上运行 platform_test 应用程序大约需要45-47秒的时间。
    2. 在 EVM 上运行完全相同的应用程序需要大约45-47秒的时间。  (使用 evmc6657l.gel 时、代码没有变化)
    3. 重新编译应用程序删除我对 DDR3配置的所有更改并在 EVM 上运行(相同的连接设置)、该测试大约需要45-47秒才能运行。

    虽然 DDR3存储器接口看起来工作正常、但我仍对它是否正确配置感兴趣。

    测试完成后、我相信 DDR3存储器可以/正在被配置为运行状态。

    我们能否今晚(我的时间)一起继续解决启动自定义硬件的问题?

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

    Brad、

    我查看 了您使用的 DRAM 芯片"IS43TR16256B-125"的 DDR3计算展板  

    扩展表中的寄存器值计算似乎正确、但在 Saratoga_133.gel 文件的 GEL 文件中、寄存器值不匹配。

    例如:DDR_SDTIM1值为0x1113783C,但在 GEL 文件中,它似乎是不同的???

    所有 PHY 寄存器值和 DDR 时序寄存器值应在 GEL 文件中匹配。

    请逐个验证所有值。

     

    此致

    Shankari G