Chinaunix首页 | 论坛 | 博客
  • 博客访问: 119719
  • 博文数量: 22
  • 博客积分: 488
  • 博客等级: 下士
  • 技术积分: 265
  • 用 户 组: 普通用户
  • 注册时间: 2009-02-09 09:31
文章分类

全部博文(22)

文章存档

2013年(1)

2011年(20)

2009年(1)

分类: LINUX

2011-06-15 16:31:35

前面提到了 工厂烧写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) |
给主人留下些什么吧!~~