新手上路
- 积分
- 31
- 金钱
- 31
- 注册时间
- 2021-3-12
- 在线时间
- 8 小时
|
1金钱
u8 FTL_CreateLUT(u8 mode)
{
u32 i;
u8 buf[4];
u32 LBNnum=0; //逻辑块号
for(i=0;i<nand_dev.block_totalnum;i++) //复位LUT表,初始化为无效值,也就是0XFFFF
{
nand_dev.lut[i]=0XFFFF;
}
nand_dev.good_blocknum=0;
for(i=0;i<nand_dev.block_totalnum;i++)
{
NAND_ReadSpare(i*nand_dev.block_pagenum,0,buf,4); //读取4个字节
if(buf[0]==0XFF&&mode)NAND_ReadSpare(i*nand_dev.block_pagenum+1,0,buf,1);//好块,且需要检查2次坏块标记
if(buf[0]==0XFF)//是好块
{
LBNnum=((u16)buf[3]<<8)+buf[2]; //得到逻辑块编号
if(LBNnum<nand_dev.block_totalnum) //逻辑块号肯定小于总的块数量
{
nand_dev.lut[LBNnum]=i; //更新LUT表,写LBNnum对应的物理块编号
}
nand_dev.good_blocknum++;
}else printf("bad block index:%d\r\n",i);
}
//LUT表建立完成以后检查有效块个数
for(i=0;i<nand_dev.block_totalnum;i++)
{
if(nand_dev.lut[i]>=nand_dev.block_totalnum)
{
nand_dev.valid_blocknum=i;
break;
}
}
if(nand_dev.valid_blocknum<100)return 2; //有效块数小于100,有问题.需要重新格式化
return 0; //LUT表创建完成
}
后边的边代码。
for(i=0;i<nand_dev.block_totalnum;i++)
{
if(nand_dev.lut[i]>=nand_dev.block_totalnum)
{
nand_dev.valid_blocknum=i;
break;
}
}
nand_dev.valid_blocknum 只会等于0. nand_dev.lut[]初始化全部为0xffff。
若是首次使用的nandflash。
调用NAND_ReadSpare(i*nand_dev.block_pagenum,0,buf,4); //读取4个字节
此时buf的4个字节应该全部是0xff 0xff 0xff 0xff.
此时该判断一次不会进入
if(LBNnum<nand_dev.block_totalnum) //逻辑块号肯定小于总的块数量
{
nand_dev.lut[LBNnum]=i; //更新LUT表,写LBNnum对应的物理块编号
}
那么后边的
if(nand_dev.lut[i]>=nand_dev.block_totalnum)
{
nand_dev.valid_blocknum=i;
break;
}
nand_dev.valid_blocknum 只会等于0. 因为nand_dev.lut[]初始化为了0xffff。
if(nand_dev.valid_blocknum<100)return 2; //有效块数小于100,有问题.需要重新格式化
此时会返回2.这样不就存在问题了吗?
请教下是不是我那里弄错了。?????
|
|