|||
本帖最后由 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,所以还是建议使用下一句指令。 |