OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5854|回复: 4

关于nand flash 驱动中lut表的疑惑

[复制链接]

4

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2021-3-12
在线时间
8 小时
发表于 2021-8-3 22:27:52 | 显示全部楼层 |阅读模式
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.这样不就存在问题了吗?
请教下是不是我那里弄错了。?????




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
773
金钱
773
注册时间
2021-4-15
在线时间
304 小时
发表于 2021-8-4 10:22:22 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2021-8-5 02:48:12 | 显示全部楼层
这颜色调的看起来贼蛋疼
回复

使用道具 举报

6

主题

211

帖子

0

精华

高级会员

Rank: 4

积分
833
金钱
833
注册时间
2019-12-17
在线时间
157 小时
发表于 2021-10-9 16:41:21 | 显示全部楼层
正点原子 发表于 2021-8-5 02:48
这颜色调的看起来贼蛋疼

看上去是从vscode直接复制过来,vscode里面背景全黑的话看着就好多了,我之前复制过来也是这样
回复

使用道具 举报

13

主题

643

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2432
金钱
2432
注册时间
2019-12-28
在线时间
527 小时
发表于 2021-10-10 10:37:04 | 显示全部楼层
帮顶  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 20:09

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表