各位大神好:
我们的产品放置一段时间,会出现启动不起来现象。
串口打印信息如下:(产品出厂的时候都是正常的)
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,但事实上是超过了,求指点
Chris Meng:
你好,
一般都是因为nand flash上数据突变导致的问题。调试建议如下:
1. 从CCS下载一个ubl,单步调试看看情况。如果CCS下载的ubl可以正常启动uboot,那就是ubl出问题了。
2. 读取nand flash上的ubl,和uboot discription相关信息,看是否有变化。
溪风:
回复 Chris Meng:
感谢您回答我的问题,由于条件限制(问题板不在我身边,需要过几天才能到我这边),目前没办法读取flash里面数据
您说上文所说是flash数据突变导致的,也就是说flash里面的UBL程序被改变了。
根据您的经验是什么原因导致的了,软件上会不会与ECC有关系。
溪风:
回复 溪风:
比如说flash 发生位反转,ecc没有矫正过来。
Chris Meng:
回复 溪风:
user6135822比如说flash 发生位反转,ecc没有矫正过来。
Chris Meng:
回复 溪风:
user6135822补充:其中count 的值按理说应为8,不应超过endBlock即10,但事实上是超过了,求指点
溪风:
回复 Chris Meng:
/* 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程序段代码损毁造成的。
求指点