打印

AM335x的操作系统问题分享(更新)

[复制链接]
10251|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jlass|  楼主 | 2013-3-28 10:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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,所以还是建议使用下一句指令。


评分
参与人数 1威望 +5 收起 理由
refee + 5 赞一个!

相关帖子

沙发
MCU2me| | 2013-3-28 12:29 | 只看该作者
顶一下~

使用特权

评论回复
板凳
hardfire| | 2013-3-28 14:21 | 只看该作者
8错,感谢分享,TI的335X是非常不错的平台。

使用特权

评论回复
地板
dirtwillfly| | 2013-3-28 19:46 | 只看该作者
顶一下,谢谢分享

使用特权

评论回复
5
xuyunhui888| | 2013-3-30 16:52 | 只看该作者
现在这个TI的AM335X系列处理器用于工业上面非常不错,但是TI不发布wince6.0系统,但是国内就一家公司开发出来了,而且有配套的工控机产品,大家可以关注   http://www.chipsee.com/  如果在这家网站购买AM335X系列开发套件就可以提供wince源码和BSP包,好产品不能错过哦

使用特权

评论回复
6
f599gtb| | 2013-5-6 20:26 | 只看该作者
请教一下楼主问题二
我在调试的时候也发现了这个问题,按照楼主的方法的确是能够解决问题。对比了三星和镁光的手册,三星的等待时间的确是比镁光的长,但是也是远小于程序中设定的400ms和20ms的,请教下楼主出现这个问题的原因到底是什么?

使用特权

评论回复
7
jlass|  楼主 | 2013-5-7 08:46 | 只看该作者
本帖最后由 jlass 于 2013-5-7 08:47 编辑
f599gtb 发表于 2013-5-6 20:26
请教一下楼主问题二
我在调试的时候也发现了这个问题,按照楼主的方法的确是能够解决问题。对比了三星和镁 ...

TI的官方回答
http://e2e.ti.com/support/embedded/linux/f/354/p/131445/897190.aspx

另外:我上面说了,例子中把时间增加的比较多,可根据自己的实际情况减小到适当的值。

使用特权

评论回复
8
guyan99| | 2014-3-10 16:23 | 只看该作者
楼主,我现在使用的事TI的dm3730,现在需要实现dm3730与FPGA的通讯,我使用的是GPMC总线与FPGA进行的通讯。
现在发现一个问题,从ARM向FPGA发送数据是可以正常工作的,但是从FPGA向ARM发送数据的时候发现数据是正确的,但是会出现错误,主要表现为文件系统破坏,变成只读了。
下面是一些报错信息,您帮忙看一下
[15507.328674] UBIFS error (pid 5928): make_reservation: cannot reserve 2764 bytes in jhead 2, error -30
[15507.338897] UBIFS error (pid 5928): do_writepage: cannot write page 20 of inode 4893, error -30
[15512.344238] UBIFS error (pid 5928): make_reservation: cannot reserve 2880 bytes in jhead 2, error -30
[15512.354492] UBIFS error (pid 5928): do_writepage: cannot write page 21 of inode 4893, error -30
[15517.359802] UBIFS error (pid 5928): make_reservation: cannot reserve 2777 bytes in jhead 2, error -30
[15517.369995] UBIFS error (pid 5928): do_writepage: cannot write page 22 of inode 4893, error -30
[15522.378723] UBIFS error (pid 5928): make_reservation: cannot reserve 1623 bytes in jhead 2, error -30
[15522.398193] UBIFS error (pid 5928): do_writepage: cannot write page 23 of inode 4893, error -30
[15527.414550] UBIFS error (pid 5928): make_reservation: cannot reserve 2275 bytes in jhead 2, error -30
[15527.424774] UBIFS error (pid 5928): do_writepage: cannot write page 24 of inode 4893, error -30
[15532.430267] UBIFS error (pid 5928): make_reservation: cannot reserve 2659 bytes in jhead 2, error -30
[15532.440521] UBIFS error (pid 5928): do_writepage: cannot write page 25 of inode 4893, error -30
[15537.445678] UBIFS error (pid 5928): make_reservation: cannot reserve 1739 bytes in jhead 2, error -30
[15537.455902] UBIFS error (pid 5928): do_writepage: cannot write page 26 of inode 4893, error -30


[  497.708312] uncorrectable error :
[  497.711944] UBI error: ubi_io_read: error -74 while reading 60 bytes from PEB 49:77272, read 60 bytes
[  497.722442] UBIFS error (pid 1731): ubifs_read_node: bad node type (0 but expected 2)
[  497.730834] UBIFS error (pid 1731): ubifs_read_node: bad node at LEB 47:75224
[  558.138244] uncorrectable error :
[  558.141510] uncorrectable error :
[  558.146087] UBI error: ubi_io_read: error -74 while reading 60 bytes from PEB 49:77272, read 60 bytes
[  558.156494] UBIFS error (pid 1747): ubifs_read_node: bad node type (0 but expected 2)
[  558.164916] UBIFS error (pid 1747): ubifs_read_node: bad node at LEB 47:75224
我看到您的帖子中关于UBIFS error错误的解决方式,我没有在dm3730中找到您推荐的那种方法,不过我用了其他两种软件更改的方法,但是还是会出现错误。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:暗恋失败,分手未遂,入赘无果,破保险套!!!

80

主题

4495

帖子

26

粉丝