新手入门
- 积分
- 19
- 金钱
- 19
- 注册时间
- 2018-9-28
- 在线时间
- 5 小时
|

楼主 |
发表于 2020-12-9 18:27:48
|
显示全部楼层
本帖最后由 shxsxlh 于 2020-12-9 18:30 编辑
// 重新创建LUT表
// mode:0,仅检查第一个坏块标记
// 1,两个坏块标记都要检查(备份区也要检查)
// 返回值:0,成功
// 其他,失败
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=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>=nand_dev.block_totalnum)
{
nand_dev.valid_blocknum=i;
break;
}
} // 有效块数始终为0,不知道为什么,这个函数的代码都没有改
if(nand_dev.valid_blocknum<100)return 2; // 有效块数小于100,有问题.需要重新格式化
return 0; // LUT表创建完成
}
贴一下创建LUT表的函数,函数执行到末尾时,nand_dev.valid_blocknum始终为0,导致无法创建LUT表 |
|