前面提到了 工厂烧写uboot会出现提示第一个块损坏。原因已经分析了,虽然没有大的影响,但是BOSS还是要求消除这个错误,方便后期调试。
首先工厂的烧写和用仿真器调试还是有区别,为了方便调试,这里模拟一下工厂的烧写。
首先要清除bbt必须使用nand scrub这个命令,该命令调用后会清除整个flash的数据包括oob区域的。
但是这个命令在最后还是会去扫描一次bbt是否存在,并且建立一个bbt。所以这里只需要屏蔽掉扫描的过程,然后按正常顺序的烧写就跟工厂的方式一样了。
nand scrub命令的调用顺序就不说了,可以自己跟踪。最后执行的是
drivers/mtd/nand/nand_util.c的
int nand_erase_opts(nand_info_t *meminfo, const nand_erase_options_t *opts)函数
将242行的代码
priv_nand->scan_bbt(meminfo);
改为
#ifdef STI_7105
/*if scrub , do not scan bbt*/
if(!opts->scrub)
priv_nand->scan_bbt(meminfo);
#else
priv_nand->scan_bbt(meminfo);
#endif
这样使用scrub命令的时候就屏蔽掉扫描过程了。
然后是坏块的解决方法:
也很简单,只需要跳过对第一个块的检查就可以了。
检查的函数
drivers/mtd/nand/nand_bbt.c的
static void create_bbt (struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd, int chip)
在308行处添加代码
#ifdef STI_7105
startblock += 2; //numblocks is 2 * (real numblocks)
from += (1 << this->bbt_erase_shift); //from += erase_size
printk (KERN_WARNING "skip the first block\n");
#endif
这样直接跳过第一个块的检查就可以了。
完。
阅读(2940) | 评论(0) | 转发(0) |