原创
SAMSUNG Nand Flash应用
2009-7-13 09:14
3493
12
12
分类:
通信
转自:http://www.wangchao.net.cn/bbsdetail_610947.html
K9K8G08U1M
512Mx8Bits
Package Type: 48-Pin TSOP1
这是典型的NAND flash,由block组成,每一个block包含64个Pages,而一个page是2k+64=2048+64=2112字节。对于一个page,0~2047个字节用来存储数据,2048~2111,共64个字节,Spare Area,用来存储page中每个sector的信息,其中第一个16字节用于描述第一个512个字节,第二个16字节用于描述第二个512个字节,以此类推,共64个字节,用于描述前面的2048个字节。这每一个16字节,在little-endian的CPU上可以用下面的结构体表示。
typedef struct {
BYTE badBlock; //1字节, 坏块标记
BYTE oemReserved; //1字节, OEM自定义的字段
WORD reserved2; //1字, 保留
DWORD reserved1; //1字, 保留
BYTE ecc[3]; //ECC, 共3字节
BYTE unused[5]; //未用, 共5字节
} LB_SPARE_AREA;
oemReserved是OEM自定义的字段
ecc用于验证512个字节
badBlock是用来描述block的,在下面有详细的说明
Invalid Block的判别标准
Invalid Block,就是我们常说的坏块。SAMSUNG规定在block的第一和第二个page的Spare Area的第一个字节,对于非0xFF的,就判定该block为Invalid Block。也就是上面结构体中的badBlock,如果不等于0xFF,就说明是坏块。反之,对于一般的block,badBlock==0xFF。
下面的摘自论坛:
对于nand最大的问题就是会有bad block,由于bad block的不确定性,所以进一步加大了对nand编程访问的难度。所以只有解决了bad block的问题才可能使用nand,将bad block处理的好才会最大的提升nand的access效率。
什么是bad block呢?就是在这一个block里有1个或多个bit的状态不能稳定的编程,所以就没法使用它,但是如果一个block(128KByte)有一个Bit是坏的,那么整个block放弃使用。听起来有点浪费,可能是根据物理原理使整个block的稳定性不能保证吧,或者是其他考虑。不过既然三星要求我们这么做,那么为了系统的稳定,也不要计较那几百KB的容量了。
bad block有2种,一种是initial bad block,另一种是runtime bad block。所谓initial bad block就是在三星出厂时就是坏块的。为什么出厂会有坏块?这个很正常,因为nand就是会有坏块,比LCD有坏点的几率大的多。但是可以放心的是三星在出厂前都对nand进行了测试,erase了所有的block,所以内容会都是0xFF,同时标记了bad block,这些即是initial bad block。每一种容量的nand允许的最多坏块数都是有规定的,低于某个值是不会出厂的,同时低于98%的可用块,基本就会认为这块nand很不稳定了。
initial bad block的标记是保证坏块的前2个page里的spare area里的第一个字节的内容不会是0xFF。即如果前2个page其中一个的2048地址(从0开始计数,以后都是这种计数方式)上的数据(就是spare area的第一个字节)是0xFF,那么这个块不是initial bad block。值得注意的一点是bad block的标记会被erase掉成0xFF,所以有可能会误被认为是good block。所以在对每一个block earse之前一定要判断是不是bad block,否则将bad block的标志erase了,以后使用的时候会误被当作good block,从而有可能带来数据损失。
对于runtime的bad block,就是使用中出现的bad block,可以从erase或program后对成功与否的判断来决定这个block是否变成bad block,如果是的话则标记。一般标记的法则和initial bad block一样,在前两个page的spare area的第一个byte上写非0xFF值,一般写0。
对于bad block的处理办法就是驱动层的问题了,做的好的话会很复杂,这个以后再介绍诸如三星的pocketstoreII这样的专门的nand driver来提供高可靠性和高peRFermance。最简单的就是遇到坏块向后跳,但也是效率最差的,因为访问第n块时,你要知道0--(n-1)块一共有多少个bad block才能决定操作的偏移量,而扫描n-1块对于n比较大的情况无疑会很慢。
文章评论(0条评论)
登录后参与讨论