从各种资料上看,不管是硬件ECC还是软件ECC,他们都或者是通过flash controler上的ecc模块或程序中的软件ecc模块来对每一页中data area中的数据进行ecc校验,校验值都来自于或存放到spare area中去。
不管是硬件还是软件,ecc的校验都是伴随着pgae read或page wirte来的,也就是在读写一页的过程中必须要实现的一个动作。在读写一页时,对于ecc的能力我们一般可以这样描述:该ecc模块一次可以校验aaa个字节,一个大小为bbb字节的页,则一共需要校验ccc=bbb/aaa次,每次产生的ecc校验字节数为ddd,则每页校验后在spare area区的第xxx字节位置开始,共存放ccc*ddd个字节的ecc校验值。
现在列一下我所看到的soc上nandflash控制器中所支持的硬件ecc特性:
1、hisi3518a:
(1)支持ecc校验使能和关闭,支持ecc纠错使能和关闭;
(2)支持1bit/512bytes,4bit/512bytes,24bit/1024bytes的校验能力;
(3)支持ecc校验错误完成等中断上报;
举例:1bit/512bytes
上面比如所说的预留区,我想应该是文件系统比如jffs2,ubifs等在文件系统管理上所要用到的地方。
2、dm365:
再列一下我所看到的软件ecc所支持的特性:
1、uboot-2010.6:
2、
==============================
(底下部分为转载)
在上一篇关于“支持NandFlash读写”的文章中,我们很好地完成了u-boot对NandFlash的读写,但这个读写进行的是软件ECC,即用软件编程的方法实现ECC。我们知道S3C2440的NandFlash控制器是支持硬件ECC的,因此在这里我们就来讲解如何实现硬件ECC。
NandFlash的每一页分为main区和spare区,S3C2440的NandFlash控制器支持这两个区的硬件ECC,但为了兼容u-boot-2011.06,我们只实现main区的硬件ECC。
为了实现硬件ECC,首先需要在include/configs/zhaocj2440.h文件内定义宏CONFIG_S3C2440_NAND_HWECC,这样在drivers/mtd/nand/s3c2440_nand.c文件内就定义了硬件ECC所需要的三个函数:s3c2440_nand_enable_hwecc函数、s3c2440_nand_calculate_ecc函数和s3c2440_nand_correct_data函数,而且在board_nand_init函数内,又把这三个函数分别赋给了相对应的结构体的三个成员,这样在进行NandFlash读写时,就会调用这三个函数,从而实现了硬件ECC。s3c2440_nand_enable_hwecc函数负责使能硬件ECC,s3c2440_nand_calculate_ecc函数负责计算ECC(当然这种计算是由硬件来完成的),s3c2440_nand_correct_data函数负责进行ECC的校验(同样地,这种校验也是由硬件自动完成的)。
为了理解u-boot是如何进行硬件ECC的,我们先来简要地分析一下相关的函数。NandFlash是以页为最小单位进行读写操作的,支持硬件ECC的读操作最终是由nand_read_page_hwecc函数(在drivers/mtd/nand目录下)来完成的,支持硬件ECC的写操作最终是由nand_write_page_hwecc函数(在drivers/mtd/nand目录下)来完成的。nand_read_page_hwecc函数的流程为先读取main区数据&