U-boot中实现Yaffs2+HwEcc

来源:互联网 发布:淘宝物流功能模块 编辑:程序博客网 时间:2024/05/19 11:19

             经过老手的指点,要实现Yaffs2+HwEcc,重点在于chip->ops.mode由MTD_OOB_RAW到MTD_OOB_AUTO。经过几天的筹备,今天要对其下手了。为了真实展现分析移植过程,就来一个直播吧。这样也会破釜沉舟一定要把其实现。转入正题,chip->ops.mode的赋值是在nand_write这个函数中进行的,直接将其替换为MTD_OOB_AUTO看会出现什么情况。

            替换后,代码编译和运行并没有出现什么异样。烧写后的oob区内容有了变化。对比如下:



        可以看到oob内容布局发生的变化,这是因为MTD_OOB_AUTO会用到nand_ecclayout。而RAW的根本没有用到。下一步要看nand_ecclayout,先把布局搞对了。

        一个插曲:

        BL1/printf.c:29: undefined reference to `__aeabi_idivmod'

        BL1/printf.c:30: undefined reference to `__aeabi_idiv'

        这个错误我ARM9的时候遇到过,当时在是4.4.3不支持浮点数,会出现的错误。如今是4.5.1已经支持浮点数,并且下午还好好的,晚上直接出这个错误。真是不可思议。 

         先不解决上边的插曲了,跳过去继续进行计划。现在确认chip->ecc.mode是否正确:


        我以为烧写Yaffs2就不牵扯到s5pc1xx_nand.c,其实关于基本的NandFlash的初始化,还是在s5pc1xx_nand.c的board_nand_init函数中的。

          nand_base.c水似乎有点深,一时半会儿不能深入理解。要么动用JLink要么就一行一行地看。

20131130更新:

2013都快过完了,还没有一点进度,还好又有一些空闲时间了。


先实现yaffs2的8k+512的烧写方法,而不是更高级的8k+64烧写到8k+512。

多亏上边的那个流程图,真的是站在巨人的肩膀上很能看到更远。RAW是一个开关,如果用RAW则说明是不使用校验的,如果不用RAW则就说明是使用硬件ECC的。现在ECC已经能够产生了。


1.解决校验码中间是00的问题,应该是FF

     其实这个问题不是太重要,因为也不会去读取它。

2.添加第17条yaffs tag的校验码

为了实现8192+512的烧写方法,重新实现了mkyaffs2img-mlc2,且已经做好了,但是因为没有第17条yaffs tag的校验码,所以目前还是没有办法启动的。


/* 17th ecc */
s3c_nand_enable_hwecc_16bit_kangear(mtd, NAND_ECC_WRITE);
chip->write_buf(mtd, p32, 32);
s3c_nand_calculate_ecc_16bit(mtd, p32, &ecc_calc[416]);

是这样获取的,真心不能接受,因为这个时候再write_buf会写到oob区,这样就破坏了。最好的是应该在s3c_nand_write_oob_16bit中,但是目前这个并没有被调用。


要想办法写入oob时候使用hw方式来写。