分类: Delphi
2012-08-06 20:04:48
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出现,但希望不要有原则性的东西了,呵呵。就写到这了。