在移植U-BOOT的时分,大部分时刻都是卡在nand flash里,由于我的nand flash容量比较大,512M的,网上的一般都是256M的吧,然后我就蛋疼蛋疼的搞了良久良久。。。
遇到的问题是这样:u-boot无法对nand flash正常读写,总是辨认出各种坏块,简直把整块nand都当作坏块了,最显着的便是保存环境变量时,运用saveenv指令,提示擦除时遇到坏块。
各种找原因,刚开端认为是底层驱动函数没有写好,然后就研讨底层驱动开端,一点一点的了解。。。
在这儿遍及一下NAND的基本知识吧,刚开端我也稀里糊涂的。
NAND flash以页为单位读写数据,而以块为单位擦除数据。依照这样的安排方法能够构成所谓的三类地址:
Column Address:Starting Address of the Register. 翻成中文为列地址,地址的低8位
Page Address :页地址
Block Address :块地址
关于NAND Flash来讲,地址和指令只能在I/O[7:0]上传递,数据宽度是8位。
我的用吧,一页有2112Bytes(2048byte(Main Area)+64byte(Spare Area)),每64个page构成一个Block,然后详细有多少个块,就视你的nand容量巨细喽。。。(留意NAND FLASH在出厂时就别答应具有少数坏块)
基本知识搞定,然后是写代码。。。依据电路原理图,写吖写,这儿就不写出来了。
可悲的是发现没有任何问题。。。
裸奔程序能完美的操作NAND FLASH读写擦除各种HIGH。。。
终究,只能回归研讨u-boot代码了。。。
再然后的然后,我知道了。。。
在drivers/nand目录下的nand_ids.c文件里,列出了各种NAND的特点列表。。。然后把
{“NAND 512MiB 3,3V 8-bit”, 0xDC, 512, 512, 0x4000, 0},
改为
{“NAND 512MiB 3,3V 8-bit”,0xDC, 0, 512, 0, 0},
就这样改一句就把我纠结那么久的问题解决了。。。辨认俺的NAND出问题了。。。
在看代码的过程中,留意到了一点,便是每逢程序运转到nand初始化的时分,都要花费十分久的时刻,这直接导致u-boot发动时刻大大延伸,这就和咱们的电脑相同,假如BIOS在引导windows时花费了很长时刻,任谁都抓狂。
刚开端我认为这些时刻是花费在检测NAND的容量上,可是经过读代码,终究发现,在nand_base.c里有个函数为nand_scan(),其终究为
return this->scan_bbt (mtd);
便是这个scan_bbt(mtd),占用了这么长时刻。。。然后百度了一下BBT,记载坏块的一个东东,然后我就把他扔掉了,然后这个回来变为return 0;….呱呱,发动只需一会儿,或许我的电脑发动那么慢也是做许多无聊的事吧。。。呵呵,开个打趣,树立BBT是十分有优点滴,自己百度吧。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/dianzi/259109.html