Chinaunix首页 | 论坛 | 博客
  • 博客访问: 204605
  • 博文数量: 56
  • 博客积分: 1085
  • 博客等级: 少尉
  • 技术积分: 652
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-29 13:50
文章分类
文章存档

2014年(4)

2012年(25)

2011年(27)

我的朋友

分类: Delphi

2012-08-06 20:04:48

最近这几天一直在和nandflash的坏块打交道,原来系统的uboot,kernel,文件系统都是自己移植的,跑起来没有问题,但qt对一个*.dat文件进行读写的时候造成nandflash出现大量坏块。原本以为还真坏了呢,起初还考虑是不是k9f1208u0c芯片的质量问题,跑到中发买了几片u0b,现象一样,说明不是应该是芯片的质量问题,应该是移植软件的事情。

   google了半天看到uboot里有这个一个宏定义,#define ALLOW_ERASE_BAD_DEBUG 0, 如果该宏定义为1, 这样,不管如何都执行擦除的操作!所以我立即重新编译了uboot把 宏定义改为1,用tftp烧了进去(网络就是快啊),执行nand erase 0x100000 0x2900000,竟然全擦了,原来的报的坏块也没有了,看来是伪坏块啊。分析肯定是文件系统和内核哪里有问题了。还是goooogle吧,没有找到一样的情况,但还是有类似的问题,最后定位是mtd的ecc和yaffs ecc 冲突的问题。

  经过考虑,用开发板供应商提供的uboot和kernel试试,看能不能行。按照文档,uboot,kernel烧进去,用nfs方式启动,很顺利,成功,但他们提供的文件系统是2.95.3,内核是3.4.3的,insmod 模块的时候根本加不进去啊,和他们沟通了半天,还是提供不了高版本的,那只能自己弄了。我原本的内核就是在开发板提供的基础上改的,但当时没有理解真的含义。开发板是把/drivers/mtd/nand/s3c2410.c 中chip->eccmode 修改了=NAND_ECC_NONE ,说明他们是不想用mtd的ecc,用的是yaffs的ecc。这些通过内核配置的选项也能得到验证,yaffs选项他们选了let yaffs do it own ecc 。我刚开始弄得时候根本没有注意这些,没有选let yaffs do it own ecc 这一项,这就是yaffs层写*.dat,和mtd不一样报错的原因吧。(我分析的,呵呵)

接下来,我把let yaffs do it own ecc ,选上了,结果启动了一下一看,出现了大量的**>>yaffs ecc error fix performed on chunk 4296:1
**>>Block 134 marked for retirement
**>>yaffs ecc error fix performed on chunk 9654:0
**>>Block 301 marked for retirement
**>>yaffs ecc error fix performed on chunk 10011:0
**>>Block 312 marked for retirement
**>>yaffs ecc error fix performed on chunk 10012:0
**>>Block 312 marked for retirement
**>>yaffs ecc error fix performed on chunk 25283:0
**>>Block 790 marked for retirement
**>>yaffs ecc error fix performed on chunk 25285:0
**>>Block 790 marked for retirement
**>>yaffs ecc error fix performed on chunk 25286:0
**>>Block 790 marked for retirement
**>>yaffs ecc error fix performed on chunk 25287:0
**>>Block 790 marked for retirement
**>>yaffs ecc error fix performed on chunk 25289:0
**>>Block 790 marked for retirement
**>>yaffs ecc error fix performed on chunk 25292:0
**>>Block 790 marked for retirement
**>>yaffs ecc error fix performed on chunk 25293:0
**>>Block 790 marked for retirement
**>>yaffs ecc error fix performed on chunk 25295:0
**>>Block 790 marked for retirement
**>>yaffs ecc error fix performed on chunk 25297:0
**>>Block 790 marked for retirement
**>>yaffs ecc error fix performed on chunk 25298:0
**>>Block 790 marked for retirement
如果内核这样配置肯定是得改文件系统了啊。

  原本我制作了cramfs只读文件系统,先烧写只读的,然后mount到主机,用mkyaffs工具烧写mkyaffsimg生成的img文件,mkyaffsimg这个工具是我自己编译生成的,我后来看了一下那个yaffs2文件和开发板提供的内核/fs/yaffs2文件夹的文件版本不太一样啊,那问题找到了啊。我没有直接去解决mkyaffimg工具的问题。用了另外的一种方法。既然nfs方式能启动系统,为什么不利用呢。我先通过nfs方式启动,让后执行

mount -t yaffs /dev/mtdblock2 /nfs

mount -o nolock -t nfs 192.168.1.130:/armsys2410/root /mnt

其中armsys241/root是共享目录,挂载成功后,把制作好的文件系统直接执行

cd /

cp /mnt/armsys2410/root/yaffs_rootfs /nfs -a

因为我移植了qt,opt文件夹很大,拷贝了好几分钟,ok,reboot,更改启动参数,yaffs启动(不啰嗦怎么改参数了)

成功了启动。

我把mtdblock3也yaffs方式挂载上来了,将来想把应用程序和频繁读写的*.dat文件都放在这了,这样即使写坏了也不会影响系统的启动。

(其实我把原来有问题的那个内核和文件系统,稍改了一下,就是把应用程序和频繁读写的文件放到mtdblock3上,就没有出现问题),但为了彻底的解决这个问题,还是重新编译了内核,改变了原来的烧写方式,现在看是没有什么问题了,系统还需大量的时间测试,估计还有很多的bug出现,但希望不要有原则性的东西了,呵呵。就写到这了。

阅读(2103) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~