5261|15

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

flash操作的一些疑惑? [复制链接]

一、ecc 和 spare area 格式的疑问:
具体是这样的:
在代码里面我看到这样的操作
在系统启动的时候,调用flash驱动,进行预留块的读操作,此时读的是spare area,  因为,我的flash是大页的,坏块标记是在列地址为2048的位置,就是spare区的第一个byte,所以,读sectorinfo 的时候是下面的顺序:
(前提,写入列地址为2048)
                  //  Read the bad block mark
                    pSectorInfoBuff->bBadBlock = (BYTE) NF_RDDATA();
                 //  Read the SectorInfo data (we only need to read first 8 bytes)
                    pSectorInfoBuff->dwReserved1  = NF_DATA_R4();
                    //  OEM byte
                    pSectorInfoBuff->bOEMReserved = (BYTE) NF_RDDATA();  
                    //  Second reserved field (WORD)
                    pSectorInfoBuff->wReserved2 = ((BYTE) NF_RDDATA() << 8);
                    pSectorInfoBuff->wReserved2 |= ((BYTE) NF_RDDATA());

原来小page的flash是这样的顺序:

        pSectorInfoBuff->dwReserved1  = NF_DATA_R4();

        //  OEM byte
        pSectorInfoBuff->bOEMReserved = (BYTE) NF_DATA_R();
        //  Read the bad block mark
        pSectorInfoBuff->bBadBlock = (BYTE) NF_DATA_R();  //坏块对应的是spare area的6th byte
        //  Second reserved field (WORD)
        pSectorInfoBuff->wReserved2 = ((BYTE) NF_DATA_R() << 8);
        pSectorInfoBuff->wReserved2 |= ((BYTE) NF_DATA_R());


第一个问题来了:
      bBadBlock的位置是flash规定好的, 那么dwReserved1  、bOEMReserved 、wReserved2 的位置是依据什么确定的?
因为,bOEMReserved是用来判断BLOCK的state的,比如:BLOCK_STATUS_READONLY,BLOCK_STATUS_RESERVED,所以这个也很重要的!

---------------
第二个问题:
上面的操作读了spare的前8个bytes的信息,那么这些信息是不是都是固定的?, ECC code 是不是写在这个8bytes后面的,我看到的驱动代码 都是这样操作的?


第二个疑惑:
       ECC校验的原理是不是这样的:ECC CODE 都是由CPU 产生的,具体是放在 NFMECC0/1.寄存器里面的。在写数据的时候,将校验结果写入spare区域的。读的时候将spare 位置的ECC code读出来,再和CPU产生的结果对比,然后,NFESTAT0 寄存器的值来进行,校正操作?    这个我想应该是这样,只为核对?
      

最新回复

支持一下  详情 回复 发表于 2009-10-30 11:41
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
关注。
友情帮顶。
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
位置是软件之间约定的,没有特别规定一定要这样那样
CPU读写数据的时候自动计算ECC,,如果是操作写完数据后可以将ECC值写到指定的spare区域,如果是读,读完数据后再读出ECC,CPU会自动比较并算出一位错误位(SLC)或者4位(MLC)。可以用这个来校正数据
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

4
 
"CPU会自动比较并算出一位错误位(SLC)或者4位(MLC"
             ---------看CPU的相关寄存,应该是这样子的

  那么当读的时候,新的ECC code(放在NFMECC0/1里面的)要与 原来的ECC code 继续对比,这个原来的ECC code  应该是从spare area 里面读出来的。
问题是,在读的时候,cpu怎么知道原来的ecc code里面的指定位置?


 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

5
 
>>      bBadBlock的位置是flash规定好的, 那么dwReserved1  、bOEMReserved 、wReserved2 的位置是依据什么确定的?
因为,bOEMReserved是用来判断BLOCK的state的,比如:BLOCK_STATUS_READONLY,BLOCK_STATUS_RESERVED,所以这个也很重要的!

就是这样,dwReserved1  、bOEMReserved 、wReserved2 的位置取决与flash驱动中对flash进行管理的算法,简单说就是fal里的算法,如果你自己写一个fal,可以改变他们的位置,bBadBlock取决于flash厂商

>> 上面的操作读了spare的前8个bytes的信息,那么这些信息是不是都是固定的?, ECC code 是不是写在这个8bytes后面的,我看到的驱动代码 都是这样操作的?

是。如果是用ms的驱动的话,是这样的,其它厂家的就未必了

>>       ECC校验的原理是不是这样的:ECC CODE 都是由CPU 产生的,具体是放在 NFMECC0/1.寄存器里面的。在写数据的时候,将校验结果写入spare区域的。读的时候将spare 位置的ECC code读出来,再和CPU产生的结果对比,然后,NFESTAT0 寄存器的值来进行,校正操作?    这个我想应该是这样,只为核对?
就是你理解的这样。
我们正在设计的一款cpu里面的nand controller,不需要你直接操作ecc码,也不需要你直接去做ecc码的判别,你只需要配置是否想Enable ECC就可以了
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

6
 
我们正在设计的一款cpu里面的nand controller,不需要你直接操作ecc码,也不需要你直接去做ecc码的判别,你只需要配置是否想Enable ECC就可以了,,

                 ----这样的cpu,写驱动就容易多 了
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

7
 
mark,学习了!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 3 楼 trueman_onlyme 的回复:
"CPU会自动比较并算出一位错误位(SLC)或者4位(MLC"
? ? ? ? ? ? ---------看CPU的相关寄存,应该是这样子的

? 那么当读的时候,新的ECC code(放在NFMECC0/1里面的)要与 原来的ECC code 继续对比,这个原来的ECC code? 应该是从spare area 里面读出来的。
问题是,在读的时候,cpu怎么知道原来的ecc code里面的指定位置?





读的位置要和之前写的位置一样,如果读写FLASH用到的是同一个BSP,然用这个EBOOT烧进去当然没问题,因为它们使用相同的格式,
但是如果你想通过ADS等其它方式把数据先写到FLASH中去,EBOOT等过程去读,这就要求你在写的时候必须分析你的BSP代码,看它是如何标记spare区,你一定要按照它的格式去做,否则就会出ECC校验出错。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
与坏块标记位置不同,spare区的数据格式没有一个标准的规则,是由相应BSP的开发人员按照自己的意愿,或者是按照某种觉得比较合适的形式来写的。
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

10
 

稍微梳理一下:
1、  Spare area的格式是开发人员自己规定的,可以从代码里面对Sprae area的读写看出
2、
typedef struct _SectorInfo
{
    DWORD dwReserved1;              // Reserved - used by FAL
    BYTE  bOEMReserved;             // For use by OEM
    BYTE  bBadBlock;                    // Indicates if block is BAD
    WORD  wReserved2;               // Reserved - used by FAL

}SectorInfo, *PSectorInfo;
  这个事FMD.h定义的结构,那么是不是dwReserved1  、bOEMReserved 、wReserved2的顺序是不变的,

如果FAL得代码不变的话,只是bBadBlock在变位置,因为flash厂商定义的标记位有所不同
3、
   CPU实现自动检验,并得到校验结果放入rNFESTAT0等寄存器,然后我们可以进行bit校正。

-----------------
    有一点还是不明白:在读的时候,CPU的ECC检验过程是不是:rNFMECC0的值和Spare area 中在写操作中所写的ECC值进行校验

?,如果是.那么CPU怎么自动知道ECC的值是放在spare area 的第9个bytes的?
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

11
 
应该是第9bytes起始的位置的?
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

12
 
mark
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

13
 
那个帮我顶贴

关于系统时钟的,我的问题已经解决,但需要继续讨论一些其他的问题:
[url=http://topic.eeworld.net/u/20091013/11/4090d838-473d-4d64-bbb6-fccc743bbd18.html][/url]
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

14
 
学习下!
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

15
 
再顶
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

16
 
支持一下
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表