SAM9X5 NANDFLASH预烧写工程生成

背景 之前公司用ATMEL的SAM9G25,采用NAND FLASH启动,ECC采用CPU自带的PMECC控制器硬件产生和检测,虽然PMECC采用BCH编码,但是由于变种很多,在周立功的SmartPRO 5000U-PLUS编程器中找不到与之对应的ECC算法。后来为了能使用编程器预烧写FLASH,便从Bootstrap、uboot和uImage全部采用linux mtd Ecc校验算法。 做法 首先确定烧写启动文件(包括Bootstrap 、uboot、uImage和Ramdisk)的所有扇区均无坏块。 执行: nanddump -o -s <start_addr> -l <size> -f <filename> /dev/mtdx 其中-o意思是输出oob数据区 这样我们分别dump出启动文件的各个部分。即可在SmartPRO 5000U-PLUS编程器中使用,在编程器选择ECC信息时需要选择文件自带OOB区即可。

NAND Flash普及

目前NAND Flash已经很普及了。我们平时所用的SD、TF、CF、U盘,其实都是一个NAND Flash芯片颗粒加上一个控制器而成。控制器的不同就形成了丰富的接口。 而目前世面上的MP3、MP4、包括速度最快、也是价格最贵的SSD,其实也是一个控制器加上N个NAND Flash颗粒构成。 我们公司在CPU的换代中也渐渐使用了NAND Flash。 下面就介绍了目前的NAND Flash的技术、工艺以及CPU对NAND的控制器。方便以后研发。 背景介绍 NAND Flash相对于NOR Flash来说,容量大,价格低,速度快。但是优点的引入必然会带了缺陷。由于制造工艺的问题,NAND Flash在生产和使用过程中会出现坏块。 坏块指的是擦除后无法变成1的扇区,通常有2钟: 出厂时有厂家标记的坏块 在使用过程中生成的坏块 由于NAND Flash坏块的存在,所以在使用时就需要对读写的数据做校验。通常使用CPU内部的ECC或者Linux MTD的软ECC对Flash做校验。 Linux MTD采用BBT记录坏区,并将这个BBT保存在芯片的最后一个好的扇区中,并且做冗余。并且使用NAND Flash每个Page的apare array,用来存储ECC和其他数据,Linux MTD下称之为OOB。 NAND Flash分类 制造工艺 从制造工艺来说,NAND Flash分为3钟:SLC/MLC/TCL。…

MPC8309 NAND Flash启动

之前我做了MPC8309+K9F5608U0D (16MB)的启动。一直想把移植过程写出来,后来耽搁了也没写。正好这次公司定MPC8309 CPU方案准备采用K9F2G08U0C(256MB)。移植完后就有了下面的文章。 前景提要 之前移植K9F5608U0C的时候可谓复杂。我们最早焊的是64M的K9F1208U0C,但是Freescale的Code Warrior上只有K9F5608U0D的选项。本着Dev的考虑,我认为1208和5608仅仅在与前者比后者多了几个Block,产品ID不一样,于是我试着改了一下Code Warrior的FPDeviceConfig.xml。 结果惊奇的发现在FPDeviceConfig.xml文件中,K9F5608U0D的manufacturerid是35,id是75。这个不合道理啊。如果按照Freescale的CWFLASHPROWP.pdf上所述,SamSung的manufacturerid应该是EC,id应该是75。于是我把manufacturerid和id来回调换,都不成。于是我直接直接换了一片K9F5608U0D,又找FAE要了他机器上面的K9F5608x0D.elf和K9F5608x0D_utility.elf。终于可以用CW烧写NAND Flash了。 移植K9F2G08SU0C 有了上次的经验,我试了一下CW自带的K9F2G08X0A。结果很悲剧,还是无法操作FLASH,我看了看它的manufacturerid和id,分别被设置成23和EC。还是猜不透。 我又翻读了AN3859.pdf文档,AN3859上说:"Samsung uses its own algorithm for flash programming, not compatible with other vendors"。如果本身自带的elf不行的话只有自己编写适合自己所用芯片的algorithem文件了。于是我找到了CW目录下的NAND Flash例程。而他的例程针对的是MPC8360和K9NBG08U5M,NAND Flash和我目前所用差距太大,直接在CPU上仿真发现老是进入取指异常。而查看它的源码有了点新发现。它的getFlashID实现中: [crayon-68014b8492bd2643060151/] 看起来manufacturerid取的是第3个字节,id取的是第二个字节,于是我有来回倒腾manufacturerid和id。最终一无所获。 实在没有办法,我在Freescale的论坛上发了帖子。同时我试图先通过NOR Flash启动,然后在u-boot下将编好的U-boot下载到NAND…