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.

am335x 上电无法开机

hi:

    我们有一块板子,上电后无法开机,查看串口信息发现卡死在MLO。下面的打印信息的任意位置都有可能卡住不动了。

[huzz]U-Boot SPL 2014.07 (Jun 13 2017 - 09:09:08)
Incorrect magic number (0xffffffff) in EEPROM
Could not get board ID.
Incorrect magic number (0xffffffff) in EEPROM
Could not get board ID.
Incorrect magic number (0xffffffff) in EEPROM
Could not get board ID.
[huzz]config_ddr=266
[huzz]ddr_pll_config=266
[huzz]arch/arm/cpu/armv7/am33xx/board.c:s_init end
[huzz]spl_board_init+++++++
[huzz]spl_board_init1,call gpmc_init
[huzz]gpmc_init
[huzz]CS_CONFIG1=0x800,0x800
[huzz]CS_CONFIG2=0x1e1e00,0x1e1e00
[huzz]CS_CONFIG3=0x1e1e00,0x1e1e00
[huzz]CS_CONFIG4=0x16051807,0x16051807
[huzz]CS_CONFIG5=0x151e1e,0x151e1e
[huzz]CS_CONFIG6=0x16000f80,0x16000f80
[huzz]arch_misc_init+++++++
[huzz]arch_misc_init-------
[huzz]hw_watchdog_init+++++++
[huzz]hw_watchdog_init-------
[huzz]am33xx_spl_board_init+++++++
Incorrect magic number (0xffffffff) in EEPROM
Could not get board ID.
[huzz]spl_board_init-------

我在DDR初始化前后,FLASH初始化前后以及红色字体初始化前后添加了打印信息,计数打印1000次。发现在DDR初始化前后打印999-0,可以正常打印,但是在flash初始化前后打印,则发现一开始打印是999,998,997,996,然后发现打印的数字变成了其他数字,比如32232这样或则直接卡死不动了。
我添加调试信息,最后发现在uboot/arch/arm/lib/crt0.S的_main中存在问题。当sp=CONFIG_SPL_STACK(0x82000000)的时候,开机就会卡死,但是当sp=CONFIG_SYS_INIT_SP_ADDR的时候则没有问题,可以正常进入uboot。请问为什么MLO的栈地址会设置在ddr中?而uboot的栈地址是在cpu的sdram中?
 
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
    ldr sp, =(CONFIG_SPL_STACK)
#else
    ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
#endif
    bic sp, sp, #7    /* 8-byte alignment for ABI compliance */
    sub sp, sp, #GD_SIZE  /* allocate one GD above SP */
    bic sp, sp, #7    /* 8-byte alignment for ABI compliance */
    mov r9, sp     /* GD is above SP */
    mov r0, #0
    bl  board_init_f
 
#if ! defined(CONFIG_SPL_BUILD)
 确认到这一步,我怀疑DDR有问题,但是下面的测试结果,让我觉得好像DDR也没有问题,请教大家这个是怎么回事?
如下图的操作是在0x82000000和0x8100000写入MLO文件,然后比较内存的内容,发现比较失败,但是通过mw往0x82000000写入MLO大小的数据后,重新
写入MLO文件,则比较内存的内容的时候,发现内存内容一样了,这个是怎么回事?
  • 以上种种迹象,建议你先确认一下当前对于DDR的配置是否正确。

    如果DDR的配置流程中有问题,带来了DDR的不稳定情况,是有可能出现以上你说的问题的。

    目前用的是DDR2还是DDR3,走过DDR相关的配置流程没呢?

    建议参考这个帖子的2楼:2. DDR2/3的配置详解(带视频)

    http://www.deyisupport.com/question_answer/dsp_arm/sitara_arm/f/25/t/113233.aspx

  • E2E上有个帖子跟你的问题类似,可以参考一下。
    https://e2e.ti.com/support/embedded/linux/f/354/p/443087/1593904

  • 刘工你好:

         我就是根据上述帖子的方式来配置DDR的。

        另外,DDR不稳定会出现在MLO中,但是当进入到uboot之后,DDR就会稳定了?会有这种现象吗?

        咱们抛开开头我无法进入uboot的情况,单说我最后测试的那种截图,到底什么原因导致了测试DDR会出现那种现象?

        进入系统后,我用memtester -p 0x82000000 10 1 这个命令测试0x82000000这个地址附近的ddr,但是测试结果显示全部OK。

  • 张工您好:

        帖子上碰到的问题是无法在DDR内存上操作,和我的现象好像不一样,我的现象感觉好像是MLO的时候,栈指针指向的DDR地址内的数据好像会变化,而不是写入什么,读出来就是什么。从我在uboot的测试来看,好像必须用mw重新写一遍该地址,然后该地址上才能存储数据。

  • DDR如果有问题,所有和DDR相关的存储操作都可能受到影响。uboot是运行在DDR上的,当然也会受到其影响。

    比较简单的测试方法就是,你可以load MLO在两个地址上,比0x81000000, 0x82000000,然后通过md 命令直接打印对应地址的值,比对MLO在这两个地址上是否有差异,正常的话应该是不会有差异的。

    你说的上电无法开机的情况,是只在WARM reset的情况下出现?还是说,每次硬件下电上电的情况下也会有?

    关系到一个DDR_RESETn时序的问题。

  • 刘工:

    地址0x81000000-0x81ffffff这个地址的DDR上,通过load mmc 0 0x81000000 MLO这种方法,load到DDR0x81000000-0x81ffffff范围内的地址上,通过cmp比较2个地址的内容,可以发现DDR的内容是一样的。而load mmc 0 0x82000000 MLO,load到DDR 的0x82000000以上的任意地址,通过cmp比较,会发现DDR内的内容不一样。

    如果是时序啥的有问题,不应该是0x81000000-0x81ffffff范围的DDR能正常访问,但是0x82000000以上的DDR不能正常访问吧?

    感觉好像有些类似flash的错块一样。

  • AM335X 的bootloader启动阶段分成3段,MLO在第二个阶段,这里面好像都是一些硬件初始化的东西,所以感觉硬件坏了。

  • 不是的,硬件初始化应该没问题(ddr不知道有没有问题),因为我在_main函数中修改栈指针sp指向cpu的sdram的地址的话,MLO启动没问题,但是如果sp指针指向0x82000000的话,则开机无法启动。但是如果ddr有问题的话,我在文件系统里用memtester 测试,又没出现问题。