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.

ubl 无法启动UBOOT问题

各位大神好:

我们的产品放置一段时间,会出现启动不起来现象。
串口打印信息如下:(产品出厂的时候都是正常的)

DM36x initialization passed!
TI UBL Version: 1.50
Booting Catalog Boot Loader
BootMode = NAND
Starting NAND Copy...
Valid magicnum, 0xA1ACED66, found in block 0x00000008.
No valid boot image found!
NAND Boot failed.
Aborting...


这部分代码如下:
for(count=blockNum; count <= endBlock; count++)
{
if(NAND_readPage(hNandInfo,count,0,rxBuf) != E_PASS)
continue;

magicNum = ((Uint32 *)rxBuf)[0];

/* Valid magic number found */
if((magicNum & 0xFFFFFF00) == MAGIC_NUMBER_VALID)
{
blockNum = count;
DEBUG_printString("Valid magicnum, ");
DEBUG_printHexInt(magicNum);
DEBUG_printString(", found in block ");
DEBUG_printHexInt(blockNum);
DEBUG_printString(".\r\n");
break;
}
}

// Never found valid header in any page 0 of any of searched blocks
if (count > endBlock)
{
DEBUG_printString("No valid boot image found!\r\n");
return E_FAIL;
}

通过分析代码可知,既然magicNum在0x8块找到了,
为啥还会打印No valid boot image found!
其中ubl 搜寻的块在8~10.求大神指点

  • 补充:其中count 的值按理说应为8,不应超过endBlock即10,但事实上是超过了,求指点
  • 你好,

    一般都是因为nand flash上数据突变导致的问题。调试建议如下:
    1. 从CCS下载一个ubl,单步调试看看情况。如果CCS下载的ubl可以正常启动uboot,那就是ubl出问题了。
    2. 读取nand flash上的ubl,和uboot discription相关信息,看是否有变化。
  • 感谢您回答我的问题,由于条件限制(问题板不在我身边,需要过几天才能到我这边),目前没办法读取flash里面数据
    您说上文所说是flash数据突变导致的,也就是说flash里面的UBL程序被改变了。
    根据您的经验是什么原因导致的了,软件上会不会与ECC有关系。
  • 比如说flash 发生位反转,ecc没有矫正过来。
  • user6135822 说:
    比如说flash 发生位反转,ecc没有矫正过来。

    这是有可能的,ECC能校正的位数有限。

    最好还是等板子到了,看看flash上的数据来定位问题。

  • user6135822 说:
    补充:其中count 的值按理说应为8,不应超过endBlock即10,但事实上是超过了,求指点

    你们是如何发现实际上count数超过了10?

  • /* Valid magic number found */
    if((magicNum & 0xFFFFFF00) == MAGIC_NUMBER_VALID)
    {
    blockNum = count;
    DEBUG_printString("Valid magicnum, ");
    DEBUG_printHexInt(magicNum);
    DEBUG_printString(", found in block ");
    DEBUG_printHexInt(blockNum);
    DEBUG_printString(".\r\n");
    break;
    }
    }

    // Never found valid header in any page 0 of any of searched blocks
    if (count > endBlock)
    {
    DEBUG_printString("No valid boot image found!\r\n");
    return E_FAIL;

    之前说的有误,count无法确定。是我根据代码的执行流程推断出的,但是这推断是不全面的。

    从打印信息来看,应改判断出有3种情况:
    1、count值大于10
    2、或者endBlock值小于8
    3、代码“
    ......
    EBUG_printHexInt(blockNum);
    DEBUG_printString(".\r\n");
    break;
    ......}"
    中break指令没有执行。
    我感觉很有可能是break程序段代码损毁造成的。
    求指点