2011.06在基于s3c2440开发板的移植之硬件ECC(2)

对于S3C2440来说,一次硬件ECC可以检验2048个字节,并且生成4个字节的ECC,因此ecc.size应该为2048,ecc.bytes应该为4。而ecc.steps是通过计算得到的,即系统上电后能够获知NandFlash的每页的大小,用这个值除以ecc.size就等于ecc.steps。所以对于这三个参数,只需事先定义好前两个参数即可。而这两个参数是在drivers/mtd/nand/s3c2440_nand.c文件中的board_nand_init函数内被定义赋值的,即:

nand->ecc.size = 2048;

nand->ecc.bytes = 4;

u-boot-2011.06对S3C2440的NandFlash控制器的寄存器定义得不完整,而且有错误,因此我们还需要对此进行修改。删除arch/arm/include/asm/arch-s3c24x0/s3c24x0.h文件内的第167行至第178行内容,添加进下面的内容:

struct s3c2440_nand {

u32  nfconf;

u32  nfcont;

u32  nfcmd;

u32  nfaddr;

u32  nfdata;

u32  nfmeccd0;

u32  nfmeccd1;

u32  nfseccd;

u32  nfstat;

u32  nfestat0;

u32  nfestat1;

u32  nfmecc0;

u32  nfmecc1;

u32  nfsecc;

u32  nfsblk;

u32  nfeblk;

};

最后,我们对s3c2440_nand_enable_hwecc函数、s3c2440_nand_calculate_ecc函数和s3c2440_nand_correct_data函数进行修改。

void s3c2440_nand_enable_hwecc(structmtd_info *mtd, int mode)

{

       struct  s3c2440_nand *nand = s3c2440_get_base_nand();

       debugX(1,"s3c2440_nand_enable_hwecc(%p,%d)\n", mtd, mode);

       writel(readl(&nand->nfcont)| S3C2440_NFCONT_INITECC& ~S3C2440_NFCONT_MECCL,&nand->nfcont);

}

该函数的任务就是初始化ECC(即复位ECC),并解锁main区ECC。

static int s3c2440_nand_calculate_ecc(struct mtd_info *mtd, constu_char *dat,

                                  u_char *ecc_code)

{

       struct  s3c2440_nand *nand = s3c2440_get_base_nand();

       u32  mecc0;

 

       writel(readl(&nand->nfcont)| S3C2440_NFCONT_MECCL,&nand->nfcont);

 

       mecc0= readl(&nand->nfmecc0);

       ecc_code[0]= mecc0 & 0xff;

       ecc_code[1] = (mecc0 >> 8) &0xff;

       ecc_code[2] = (mecc0 >> 16) &0xff;

       ecc_code[3] =(mecc0 >> 24) & 0xff;

      

       debugX(1,"s3c2440_nand_calculate_hwecc(%p,):0x%02x 0x%02x 0x%02x 0x%02x\n",

         mtd , ecc_code[0], ecc_code[1], ecc_code[2], ecc_code[3]);

 

       return 0;

}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwywzf.html