UBIFS error调试总结

原文地址: http://bbs.21ic.com/icview-464754-1-1.html

前几天写了一份AM335x的硬件问题分享,这几天把操作系统也搞定了,所以再写一篇操作系统的问题分享。其中修改内核的部分是网上的资料,并非我的原创,但是我都验证过,特此说明。


问题一:第一次加载有效,第二次就不行了,错误打印如下
UBIFS: recovery needed
UBIFS error (pid 1): replay_log_leb: log error detected while replaying the log at LEB 3:0

这个错误的原因是'fixup_free_space()中计算空空间开始地址为c->lhead_offs。正确的应该为一直是0

解决方案一:
只有在第一次启动过程中突然断电才会引起此问题,只要正常启动过一次UBIfs的文件系统(进入文件系统之后稍微等待几秒钟)即可解决此问题。

解决方案二(推荐):
修改 linux 内核代码
FILE_PATH: fs/ubifs/sb.c : fixup_free_space()
//修改前
err = fixup_leb(c, c->lhead_lnum, c->lhead_offs);
//修改后
err = fixup_leb(c,c->lhead_lnum,ALIGN(UBIFS_CS_NODE_SZ, c->min_io_size));

问题二:随机出现无法加载的情况,错误打印如下      
UBIFS: read-only UBI device
UBIFS error (pid 1): mount_ubifs: cannot mount read-write - read-only media
而且随着使用时间的增加,nand flash的坏块会越来越多

解决方案一:
更换nand flash,把K9F2G08改为MT29F2G08即可,其实就是换一家,呵呵。

解决方案二:
修改 linux 内核代码
FILE_PATH: drivers/mtd/nand/omap2.c : omap_wait()
//修改前
if (state == FL_ERASING)
  timeo += (HZ * 400) / 1000; 
else
  timeo += (HZ * 20) / 1000;
//修改后
if (state == FL_ERASING)
  timeo += (HZ * 4000) / 1000; 
else
  timeo += (HZ * 1000) / 1000;
注:例子中把时间增加的比较多,可根据自己的实际情况减小到适当的值。

解决方案三(推荐):
修改 linux 内核代码
FILE_PATH: drivers/mtd/nand/omap2.c : omap_wait()
//修改前
while (time_before(jiffies, timeo)) {
    status = __raw_readb(this->IO_ADDR_R);
    if (status & NAND_STATUS_READY)
        break;
    cond_resched();
}
//修改后
while (time_before(jiffies, timeo)) {
    status = __raw_readb(this->IO_ADDR_R);
    if (status & NAND_STATUS_READY)
        break;
    cond_resched();
}

if (!(status & NAND_STATUS_READY)) {
   status = __raw_readb(this->IO_ADDR_R);
}

问题三:K9F2G08不支持sub page结构(在内核中使用硬件ECC没有此问题,使用软件ECC才有,因为我使用了硬件ECC,所以不用改内核)

解决方案一:在制作ubi.img时,把原指令
sudo ubinize -o ubi.img -m 2048 -p 128KiB -s 512 -O 2048 ubinize.cfg
改为
sudo ubinize -o ubi.img -m 2048 -p 128KiB -s 2048 -O 2048 ubinize.cfg
注:实际测试时发现使用原先的指令也没有问题,不过从ubinize的参数说明来看-s应该填写2048,所以还是建议使用下一句指令。

你可能感兴趣的:(嵌入式)