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小时,不停升级,也不会重新, 有些板子测试几分钟即可出现。
Mark Liao:
你好,我们也是用的镁光的NAND FLASH(MT29F32G08CBADAWP),内核启动读取ubi文件系统时ecc错误。你们内核是什么版本的呢?没找到你说的函数。我们使用3.14.43的内核版本。
yao wang2:
回复 Mark Liao:
上面的是裸机系统, TI的Starware库关于nand page的read存在一个没必要的读动作,ECC读取会整体读取一次然后512字节做ECC时候再分别读取一次。可去掉整体读取一次的操作。 linux 下应该不存在这个问题。 你这个问题可以用SD卡启动方式下,通过调试U-BOOT去见nand bad检测下,难度本身是否存在坏块。
Mark Liao:
回复 yao wang2:
在u-boot下检测只有三个坏块,在Kernel下测试只有一个好块,其它的都是坏块。
Jian Zhou:
回复 Mark Liao:
把处理器主频和DDR频率降下来试试
Mark Liao:
回复 Jian Zhou:
处理器频率300MHZ,确认是ECC校验位数的问题。我们的NAND FLASH是MT29F32G08CBADAWP,每page为8K,40bit的ECC,内核只支持最大16bit。TI有支持40bit的ECC驱动么?
另外u-boot下是用的bch8,但是可以正常读写,这个是什么原因呢?
NAND FLASH DATA SHEET:
Description Requirement
Minimum number of valid blocks (NVB) per LUN 2054Total available blocks per LUN 2128First spare area location Byte 8192Bad-block mark 00hMinimum required ECC 40-bit ECC per 1117 bytes of data