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.

[参考译文] MCU-PLUS-SDK-AM243X:LPDDR4初始化死循环

Guru**** 2578945 points
Other Parts Discussed in Thread: AM2434, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1103182/mcu-plus-sdk-am243x-lpddr4-initialisation-dead-loop

部件号:MCU-PLUS-SDK-AM243X
主题:AM2434, sysconfig中讨论的其它部件

您好,

我们正在使用组装了AM2434和LPDDR4的定制板。

在LPDDR4的初始化过程中,我在DDR_changeFreqAck()中的第123行遇到死循环 请参阅下图。

循环一直等待,直到CTRLMMR_DDR4_FSP_CLKCHNG_REQ寄存器的位7不为零。 它仅通过DDR4_FSP_CLKCHNG_ACK寄存器获得Cleard

CTRLMMR_DDR4_FSP_CLKCHNG_REQ的第7位在初始化过程中设置在哪里?

从DDR_setFreq()我没有收到错误消息。

祝你好

Tom

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

    Tom,您好!

    我正在咨询内部专家。

    您是否通读了此处的文档? https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/08_02_00_31/exports/docs/api_guide_am243x/DRIVERS_DDR_PAGE.html

    此致,
    弗兰克

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

    Tom,您是否使用dev.ti.com/sysconfig上的sysconfig工具为您的特定主板和DDR设备生成DDR寄存器配置?  初始化期间,控制器从不请求频率更改,如果您拥有DDR4的DDR寄存器配置(而非LPDDR4),则可能会发生这种情况。

    此致,

    詹姆斯

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

    您好,Frank和James:

    感谢您的快速响应。

    是的,我已阅读了文档并仔细遵循了这些步骤。

    目前,我正在研究一个稍微修改的“hello_world_am243x-evm_r5fs0-0_nortos”示例,以测试DDR。 因此API应该被正确地称为API。 在系统/主板初始化后找到修改。 我使用了sysconfig工具James,提到并编写了所有LPDDR4设备特定参数。 然而,我不能保证在这份文件中没有犯过一个错误。 然后,我生成了头文件并将其包含到特定于prject的syscfg中。

    什么功能/寄存器调用触发了CTRLMMR_DDR4_FSP_CLKCHNG_REQ的第7位?

    从Frank的链接:"理想情况下,应在bootloader应用程序中启用DDR,默认情况下,SDK bootloader会启用DDR。"

    引导加载程序是否区分DDR4和LPDDR4?

    此致,

    Tom

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

    Tom,是否可以从DDR配置工具发送生成的文件以及生成的.syscfg文件?

    更改请求来自控制器本身,因此while循环正在等待硬件请求更改。

    由于初始化过程不同,bootloader将区分这两种DDR类型。  配置工具输出包含初始化驱动程序的此信息。

    此致,

    詹姆斯

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

    谢谢你,James,我很乐意将文件发送给你。

    我在引导加载程序中没有任何更改,因此我使用的是SDK中的原始加载程序。

    由于我仍然没有从市场上收到Flash,因此我只在RAM中工作。 引导加载程序和应用程序由UART0传输。 传输后,最类似的bootloader不知道LPDDR4。

    我将如何告诉他/我是否需要重建bootloader?

    此致,

    Tom

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

    Tom,您好!

    UART SBL从System_init()调用DDR_init()。

    这是一个调用图:

                main()
                    System_init()
                        DDR_init()
                            DDR_setClock()
                                DDR_changeFreqAck() // this is the hang location
    

    请参阅<SDK>\SOURCE \DRIVERS\DDR\V0\DDR.c:DDR_setclock(),它似乎是DDR和LPDDR4之间的函数区别:

                static int32_t DDR_setClock(DDR_Params *prms)
                {
                    int32_t status = SystemP_SUCCESS;
                    
                    if((HW_RD_REG32(DDR_CTL_REG_BASE) & DDR_TYPE_MASK) == DDR4_MEMORY)
                    {
                        /* Type is DDR4*/
                        DDR_setFreq(prms->clk1Freq);       
                    }
                    else
                    {
                        /* Type is LPDDR4. Start Frequency handshake.*/
                        DDR_setFreq(25000000);
                        
                        ClockP_usleep(5000);
                    
                        /*trigger the start bit (from PI)*/
                        HW_WR_REG32(DDR_CTL_REG_BASE + DDR_PI_REG_BLOCK_OFFS + DDR_PI_0_SFR_OFFS,   TRIGGER_START_BIT);
    
                        ClockP_usleep(500);
    
                        /*trigger the start bit (from CTL)*/
                        HW_WR_REG32(DDR_CTL_REG_BASE + DDR_CTL_0_SFR_OFFS,   TRIGGER_START_BIT);
    
                        ClockP_usleep(1000);
    
                        DDR_changeFreqAck(prms);
                        
                        ClockP_usleep(500);
    
                        /*PI INT STATUS*/        
                        while(((HW_RD_REG32(DDR_CTL_REG_BASE + DDR_PI_REG_BLOCK_OFFS + DDR_PI_83_SFR_OFFS)) & 0x1) != 0x1);
                        /*CTL_342[25] = int status init[1] = 1 - The MC initialization has been completed.*/
                        while((HW_RD_REG32(DDR_CTL_REG_BASE + DDR_CTL_342_SFR_OFFS)&0x02000000)!= 0x02000000);
                    }
    
                    return status;
                }
    

    如果出于某种原因需要重建UART SBL,请参阅:

    生成帮助(gmake -s help)将显示重建UART SBL所需的命令:

    gmake -s -C examples/drivers/boot/SBL_UART/am243x/r5fss0-0_nortos/ti-arm-clang all

    此致,
    弗兰克

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

    所以我找到了解决我的问题的办法。

    必须修改LPDDR4的SBL_null DDR配置。

    默认情况下,已为DDR配置SBL_null。

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

    Tom,

    非常感谢您的反馈。

    我不清楚您为什么使用SBL NULL。 我想您已更新SBL NULL SYSCFG以使用

    <SDK>\SOURCE \DRIVERS\DDR\V0\SOA\am64x_am243x\board_lpddrReginit.h

    而不是  

    <SDK>\SOURCE \DRIVERS\DDR\V0\SOA\am64x_am243x\board_ddrReginit.h

    然后重建SBL NULL。

    此致,
    弗兰克

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

    您好,Frank

    是的,我确实已将DDR头文件更改为适合我的LPDDR4的文件。

    由于市场短缺,我还没有组装闪光灯。 因此,我必须在RAM中工作。 为此,我通过ROM BL (UART0)加载SBL NULL和应用程序。 我用于初始化SOC的SBL空。 这至少为我推荐了我在SDK文档中阅读过的许多参考资料。

    当然,我可以通过JTAG加载我的应用程序,但我必须处理CCS的异常进程。

    此致,

    Tom

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

    Tom,

    好的,感谢您的反馈。

    此致,
    弗兰克

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

    Frank,很抱歉,我当然指的是SBL UART!

    此致,

    Tom

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

    Tom,

    非常感谢,这对我来说更有意义! 我想也许你把SBL NULL和APP图像合并成了一个图像,并且修改了SBL NULL以跳到应用程序入口点。

    此致,
    弗兰克