彻底搞定NorFlash和NandFlash 

经过几天的努力,终于把板上的NorFlash和NandFlash全部搞定了,庆祝一下。

在开发阶段,为了集中精力搞系统和应用程序,采用了从DataFlash启动的方法。该方法可以用Atmel提供的开源软件和工具轻松实现。而写NandFlash是用mtd tools做的。现在工作接近尾声,该考虑如何应对现场使用和生产的问题了。

为了适应工业级的温度范围,必须用NorFlash启动,但是Atmel在它的at91-isp工具中不提供针对NorFlash的烧写支持,如果用其它的工具烧写,如FlashPGM、H-Flasher等,还要用J-TAG接口,而成品板上的J-TAG是计划去掉的;再说,让生产线上的人员用J-TAG逐个文件逐个地址地写入,过于繁锁,不利于提高效率。而使用编程器在焊接前烧写芯片,又要另外购买编程器,写一套板子的芯片中间还要换一次芯片,如果成品板需要重写程序就更麻烦。

考虑到以上因素,决定自行扩展at91-isp的功能,为其加入NorFlash支持。整个程序并不大,很快就调好了,烧进bootstrap和u-boot可以正常运行。

at91-isp对NandFlash的支持也是个问题。一开始我用sam-ba 2.4,总是不能正确写板子上的k9f1208。于是就找来了sam-ba 2.8,不成想更糟糕,连下载程序都起不来,报告SDRAM初始化失败。这是因为我使用了16-bit数据总线,和at91sam9261ek上的不一样。没办法,改吧。打开它的TCL脚本一看,和前面的版本大不一样了,竟然所有的操作几乎都移到了applet(以前叫monitor)中去做。要改初始化,就要重新编译applet。好在这个版本的编译器不再是过时的ADS了,而是GCC。Applet很快改好了,重试可以进入窗口,但NandFlash支持依然不行。不想再研究这个版本的程序结构了,想想还要重写NorFlash程序就头疼,干脆退回老版本接着来。

通过对比bootstrap、u-boot和linux的nand flash驱动,发现它们的代码几乎是一样的,可不知为什么,at91-isp的代码一加上ECC就出错,每块只能写入头一个页面,其它页面全是FF。而去掉写OOB的代码立即正常。为了定位错误,把写OOB代码的16位总线分支去掉,改成最简单的硬编码方式,OK,可以写进去了。但是ECC仍然不对,用U-Boot或是Linux读不出来。接着把填充OOB缓冲区的代码也改成硬编码方式,一试即过。真是莫名其妙。

最后总结一下系统中NandFlash的读/写

  NandFlash允许有坏块,允许读出时出错;但是厂家保证芯片上的第一块肯定是好的,每块的第一或第二页的OOB可以写坏块标志
  需要在写入时向OOB中加入ECC才能达到手册上给出的可靠性指标
  9261不支持硬件ECC,使用软件计算得到ECC码,可以纠一位错,查两位错
  程序在写入时遇到坏块会跳过,读时亦然。

  目前bootstrap的nand读出程序没有ECC纠错
  at91-isp,u-boot和linux中的nand操作都是带ECC的

 

 转自:http://blog.21ic.com/user1/1505/archives/2009/54963.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值