//ECC校正函数
//eccrd:读取出来,原来保存的ECC值
//ecccl:读取数据时,硬件计算的ECC只
//返回值:0,错误已修正
// 其他,ECC错误(有大于2个bit的错误,无法恢复)
u8 NAND_ECC_Correction(u8* data_buf,u32 eccrd,u32 ecccl)
{
u16 eccrdo,eccrde,eccclo,ecccle;
u16 eccchk=0;
u16 errorpos=0;
u32 bytepos=0;
eccrdo=NAND_ECC_Get_OE(1,eccrd); //获取eccrd的奇数位
eccrde=NAND_ECC_Get_OE(0,eccrd); //获取eccrd的偶数位
eccclo=NAND_ECC_Get_OE(1,ecccl); //获取ecccl的奇数位
ecccle=NAND_ECC_Get_OE(0,ecccl); //获取ecccl的偶数位
eccchk=eccrdo^eccrde^eccclo^ecccle;
if(eccchk==0XFFF) //全1,说明只有1bit ECC错误
{
errorpos=eccrdo^eccclo;
printf("errorpos:%d\r\n",errorpos);
bytepos=errorpos/8;
data_buf[bytepos]^=1<<(errorpos%8);
}else //不是全1,说明至少有2bit ECC错误,无法修复
{
printf("2bit ecc error or more\r\n");
return 1;
}
return 0;
}
|