初级会员

- 积分
- 163
- 金钱
- 163
- 注册时间
- 2015-5-14
- 在线时间
- 46 小时
|

楼主 |
发表于 2016-7-10 15:22:07
|
显示全部楼层
本帖最后由 jinghong21 于 2016-7-10 15:25 编辑
u8 FTL_Format(void)
{
u8 temp;
u32 i,n,p;
u8* buf;
u32 goodblock=0;
nand_dev.good_blocknum=0;
#if FTL_USE_BAD_BLOCK_SEARCH==1 //使用擦-写-读的方式,检测坏块
nand_dev.good_blocknum=FTL_SearchBadBlock();//搜寻坏块.耗时很久
#else //直接使用NAND FLASH的出厂坏块标志(其他块,默认是好块)
for(i=0;i<nand_dev.block_totalnum;i++)
{
temp=FTL_CheckBadBlock(i); //检查一个块是否为坏块
if(temp==0) //好块
{
temp=NAND_EraseBlock(i);
if(temp) //擦除失败,认为坏块
{
printf("Bad block:%d\r\n",i);
FTL_BadBlockMark(i); //标记是坏块
}else nand_dev.good_blocknum++; //好块数量加一
}
}
#endif
for(i=0;i<NAND_ECC_SECTOR_SIZE;i++)
buf=i; //填充数据(随机的,根据t的值来确定)
NAND_WritePage(0,0,buf,1); //格式化以后不能有这一步,不然下面的写逻辑块数据就会不正确。这个是我自己添加测试的,
printf("good_blocknum:%d\r\n",nand_dev.good_blocknum);
if(nand_dev.good_blocknum<100) return 1; //如果好块的数量少于100,则NAND Flash报废
goodblock=(nand_dev.good_blocknum*93)/100; //%93的好块用于存储数据
n=0;
for(i=0;i<nand_dev.block_totalnum;i++) //在好块中标记上逻辑块信息
{
temp=FTL_CheckBadBlock(i); //检查一个块是否为坏块
if(temp==0) //好块
{
NAND_WriteSpare(i*nand_dev.block_pagenum,14,(u8*)&n,2);//写入逻辑块编号 这个写块0 的spare应该是 00 00 ,
NAND_ReadSpare(i*nand_dev.block_pagenum,12,(u8*)&p,4);// 如果前面写了 main区域任何数据,读出来的数据确是 00 FF。不写main区域直接读就是正确的 00 00
n++; //逻辑块编号加1
if(n==goodblock) break; //全部标记完了
}
}
if(FTL_CreateLUT(1))return 2; //重建LUT表失败
return 0;
|
|