NAND_OOB_BBT

来源:互联网 发布:校园网络系统建设方案 编辑:程序博客网 时间:2024/06/06 08:55
2012-03-15 22:34

在经过研读MTD中关于NANDflash的代码后,文件系统已经成功挂载,U-BOOT没有修改什么,只要保证nand_chip->ecc.mode = MTD_OOB_RAW;即以原始模式模式进行烧写。NAND驱动会调用相应的nand_write_page_raw()进行写NAND,至于TI提供的U-BOOT关于4bit 硬件ECC校验。没有修改,在使用U-BOOT烧写kernel时,即采用nand write/read时,依旧是硬件ECC算法。而烧写文件系统时。采用原始模式烧写,从而造成UBL U-BOOT KERNEL 存储的NAND页面对应的OOB区划分一样。而YAFFS2文件系统所在页面的OOB区划分与U-BOOT KERNEL都不一样。并且在禁止KERNEL中的硬件ECC算法,这样系统能成功挂接起来。但对于NAND的管理,存在缺陷,各个分区的OOB划分不一样。
关于坏块的管理,倒是区别不到,坏块标记都是在该块的第一页的OOB区第一二个字节。下面分析NAND驱动中BBT的建立:
首先是入口:
:nand_init()
然后遍历所有的NAND设备,一般情况也只有一片
board_nand_init()//是对应具体硬件层的操作
整个NAND驱动中就这个函数需要我们自己完成,必须设置的是nand_chip->ecc.mode
表示,包括软件校验,硬件校验,综合校验和无校验几个配置,对应不同的配置需要我们完成的函数就不尽相同,特别是硬件校验与具体硬件相关。而对于软件校验,可以不用自己完成,NAND驱动系统有一套ECC校验方法,比如对于2K的NAND,NAND将OOB的40-63作为ECC的存储位,并且以每256B产生3B的方法生成。
这里必须要完成的函数,有以下三个:
nand_chip->cmd_ctrl//具体的硬件控制,CLE ALE的选择
nand_chip->cmd_ready //
nand_chip->waitfunc //

至于其他的函数就看ECC对应的模式来完成了,当然关于NAND 控制器的配置也需要在这个函数里进行。


在nand_scan_tail()调用chip->scan_bbt(mtd)来建立BBT
而在nand_set_defaults()中被指向nand_default_bbt();
这个函数会根据配置选项,确定将BBT存储在什么地方内存/NAND,具体地址
如果设置了NAND_IS_AND,表示存储于NAND的第0个块,都知道NAND在出厂时 会保证第一个块是好块,所以用来存BBT是不二选择,当然也可以设置成NAND_USE_FLASH_BBT,表示也存储于NAND中,若没有以上宏,则默认存储在内存中
。建议存在NAND中,这样只需在第一次建立BBT时才遍历整个NAND,出现坏块添加即可,而不像内存,每次加载都需要遍历NAND。