您的位置:首页 > 其它

WINCE FAL+FMD nand flash驱动

2010-02-08 11:10 696 查看
以下是本人对 FAL+FMD的一点点理解,记录下来防止以后忘掉:)

FAL层会管理nand 地址影射。FAL层以sector为单位写一个sector(不会超过一个,虽然有长度的参数),在擦除sector所在块之前,一般会有下面三步写操作:

1) prepare to write (只写sectorinfo): 这个时候写这个sector的spare区,把这个sector标志为可写sector。

2) write main area + sectorinfo : 这个时候会向这个块中写数据,同时将sectorinfo写入,标志这个块已经有有效数据,同时FMD层也应该将ECC code 存入spare区。

3) 置dirty (只写sectorinfo):把这个sector数据标志为无效,待擦除。

这样对每个sector来说,会有3次的编程操作,因此对NOP=1的MLC nand来说,这样的构架肯定是不行的。因此可以认为FAL+FMD构架只能支持SLC nand.

spare区的layout ,举一个例子, 2K page SLC HW 1bit ECC 每512byte 可以矫正1bit 的错误,使用2K 为一个sector:

1 byte -------------------bad block ------------------------------------------------------------------

1 byte-------------------OEM reserved |-->SECC checked |

4 bytes------------------dwReseverd ----------- |--> Sectorinfo Structure

2 bytes------------------reseverd2 ------------------------------------------------------------------

4 bytes------------------MECC(1st 512)

4 bytes------------------MECC(2st 512)

4 bytes------------------MECC(3st 512)

4 bytes------------------MECC(4st 512)

2 bytes------------------SECC(checked first 6 bytes)

SECC一开始当步骤1)的时候就已经被写入了,因为之后的步骤2) 步骤3)还会改变reseverd2 (prepare dirty bit and etc) 以及 MECC,因此SECC 只能做到check前6个字节。

在第一步的时候spare区还不确定的部分都是写 FF的。 之后需要置0的时候再写0。 因为一旦写成0 就只能通过擦除整个块再重新对sector编程。

MECC由于是每512byte产生一次ECC parity code. 因此写的时候每512保存一次,最后一起写入spare区。读的时候先把spare中读出,然后在读main的时候作ECC check.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: