AM3352 +nand型号为MT29F2G16ABAEAWP
硬件如下:
Sysboot[9] = 0; sysboot[8] = 0;
软件是调用了AM335X_StarterWare_02_00_01_01 里nandlib里构建了我们的nand读写函数。其中因为我们使用的是16位宽的nand,修正了nandlib里的一个bug为:
NANDPageRead函数里如下,去掉-1,
/* Read the ECC Data from spare area */
NANDDataRead(nandInfo, eccData, (nandEccInfo->eccByteCnt-1));
因为nandEccInfo->eccByteCn = 14, NANDDataRead函数里16位的是在-2做地址指针偏移,入参-1后传入的是13,在-2操作时候指针将异常。
附件为我们的nand read write 驱动。
升级的过程我们是控制如下:
for(j= 0; j<3;j++)
{
ret = BSP_NandWrite(NandAddr,g_USBBuf,offset); //写入nand 存放程序
if(ret != E_PASS)
{
DBG_ERR("Write Nand Err is %03d", ret);
if(j<2)
continue;
else
return FALSE;
}
else//成功
{
break;
}
}
//清除一次buff
memset(g_USBBuf,0,sizeof(g_USBBuf));
for(j=0;j<3;j++)
{
ret = BSP_NandRead(NandAddr,g_USBBuf,offset);
if(ret != E_PASS)
{
DBG_ERR("Read Nand Err is %03d", ret);
if(j<2)
continue;
else
return FALSE;
}
USB_ReadFile_CSControl.CS_A = 0;
//计算读nand出来的校验和
for(i=0;i<offset;i++)
{
USB_ReadFile_CSControl.CS_A += g_USBBuf[i];
}
//判断校验和是否跟读文件读时候校验和一致。
if(USB_ReadFile_CSControl.CS_A != USB_ReadFile_CSControl.CS_B)
{
if(j<2)
continue;
else
return FALSE;
}
else
{
break;
}
}
目前的问题是:
测试方法:APP1 , APP2两个文件,文件内容不同, 一个放U盘一个放SD卡来回不停升级,即NAND写完APP1后,写APP2,再写APP1,不停循环。
(1)sysboot[9] = 0, sysboot[8] = 0;在write完nand后,read的时候就会出现两种情况,返回
NAND_STATUS_READ_ECC_ERROR_CORRECTED
NAND_STATUS_READ_ECC_UNCORRECTABLE_ERROR
该问题还不是每次都出现,是偶尔频发。
(2)另外一个实验结果,sysboot[9] = 1; sysboot[0] = 0;使用同一个升级文件,也会返回ECC erro。有些核心板一直2 3小时,不停升级,也不会重新, 有些板子测试几分钟即可出现。
