本帖最后由 jlass 于 2013-5-22 15:24 编辑
前几天写了一份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);
}
解决方案四:(推荐) 使能wait0 FILE_PATH: arch/arm/mach-omap2/gpmc-nand.c: gpmc_nand_init () //修改前 if(gpmc_nand_data->dev_ready) { gpmc_cs_configure(gpmc_nand_data->cs,GPMC_CONFIG_RDY_BSY, 1); }
//修改后 gpmc_nand_data->dev_ready= 1; if(gpmc_nand_data->dev_ready) { gpmc_cs_configure(gpmc_nand_data->cs,GPMC_CONFIG_RDY_BSY, 1); }
补充说明:一直不明白TI为什么不使能wait0线,现在有点明白了。AM335x的V1版本中wait0线和百兆网口有冲突,V2版本把wait0线改成可配置后解决了此问题。所以使用千兆网口时,建议使能wait0线以保证nand的正常读写,使用百兆网口时,识情况而定。
问题三: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,所以还是建议使用下一句指令。
|