jlass的个人空间 https://bbs.21ic.com/?134715 [收藏] [复制] [RSS]

日志

AM335x系列文章二

已有 3137 次阅读2013-4-18 16:13 |个人分类:心得|系统分类:ARM| AM335x

本帖最后由 jlass 于 2013-3-28 10:08 编辑

前几天写了一份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,所以还是建议使用下一句指令。

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)