Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4611370
  • 博文数量: 385
  • 博客积分: 21208
  • 博客等级: 上将
  • 技术积分: 4393
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-30 13:40
文章分类

全部博文(385)

文章存档

2015年(1)

2014年(3)

2012年(16)

2011年(42)

2010年(1)

2009年(2)

2008年(34)

2007年(188)

2006年(110)

分类: LINUX

2007-03-13 09:34:46






 
Nand Flash 启动 时的 ECC问题

为了支持NAND FLASH 的系统引导,S3C2410A具备了一个叫做“Stepping Stone"的内部SRAM缓冲器。当系统启动时,NAND FLASH的前4KB代码自动载入到“Steppingstone”中,然后系统自动执行这些载入的代码。一般这4KB引导代码需要将NAND FLASH 中的程序内容拷贝到SDRAM中,拷贝完后程序会转入到SDRAM中继续执行。

因为考虑到NAND FLASH的位交换问题,在NAND FLASH 向SDRAM拷贝数据时,我加入了ECC校验代码。ECC校验代码我是搬移U-BOOT的ECC部分的(这个ECC算法和VIVIBOOTLOADER的 ECC算法以及YAFFS中的ECC算法是一样的)。反复测试程序显示:一旦加入ECC算法,读页数据时很多时候会出现位错误(一位或两位或两位以上的位错误),程序运行不稳定。

问题:1. 为什么多数启动代码中的Nand Flash 的数据拷贝部分没有ECC校验,是不是硬件不支持?

         2. 问题会不会和NAND FLASH + SRAM 的启动方式有关呢?
[此贴子已经被作者于2006-3-17 15:59:05编辑过]

 
 回答:

2410a有NAND FLASH控制器,可以自己生成ECC码。也就是说在不考虑纠错的情况下,在读数据页的时候,比较NAND控制寄存器产生的ECC和FLASH中保存的ECC,就可以知道数据是否正确。





 - 华恒嵌入式Linux技术论坛 ()
-- ()
--- 免费提供2410/2440 vivi 程序 (&topic=490)

-- 作者: cefanty
-- 发布时间: 2006/09/14 11:07am

[这个贴子最后由cefanty在 2006/09/19 08:41pm 第 4 次编辑]

为了让大家能用到好用的bootloader vivi.现在免费发布vivi给大家使用.其中的功能包括:

1.加入了rootfs带hwecc功能的烧写.需要你编译kernel的时候加上S3C2410 NANDFLASH Hardware ECC选项.这样你就可以把nandflash/s3c2410.c中的chip->eccmode    = NAND_ECC_SOFT;给恢复了. 当然我也可以提供vivi是带NAND_ECC_SOFT的.
2.支持带yaffs iamge的写入功能.你可以将mkyaffsimage做好的yaffs的image 通过usb或者串口下载.
3.支持vivi开机logo,支持sharp和samsung的TFT 3.5''LCD.
4.支持高版本的gcc编译.vivi的体积只有83K(不支持网络)
5.通过load flash partition u 命令用usb下载.如何区分是yaffs image的下载.是通过每个分区的flag来区分的.例如:

part show
mtdpart info. (6 partitions)
name              offset        size            flag
------------------------------------------------
vivi            : 0x00000000    0x00020000    32(LOADER)        128k
param           : 0x00020000    0x00010000    64(PARAM)          64k
kernel          : 0x00030000    0x001c0000   128(KERNEL)          1M+768k
root            : 0x00200000    0x00500000   256(CRAMFS)          5M
usr             : 0x00700000    0x03500000   512(YAFFS1)         53M
yaffs           : 0x03c00000    0x00400000   512(YAFFS1)          4M

以YAFFS1和YAFFS2标志的partition是会用yaffs image的方式写回nandflash的.以CRAMFS为标志的是用HW ECC方式回写到partition的

需要提供的请跟帖,留下email.并声明需要的是2410A(12MHZ)版本还是2440A(16.9346MHZ)版本.用HW ECC还是Soft ECC.控制口是串口1,还是串口2等.

声明:我这个版本的vivi本人花费精力巨大,所以source code恕不免费提供.请大家不要用砖拍我.

启动信息如下:
VIVI version 1.1.0 (Modifed by cefanty_qiu Email:cefanty_qiu@163.com)  (root@rad
hat) (gcc version 3.4.1) #0.1.4 四 9月 14 08:45:24 CST 2006
MMU table base address = 0x33DFC000
Succeed memory mapping.
NAND device: Manufacture ID: 0xec, Chip ID: 0x76 (Samsung K9D1208V0M)
Found saved vivi parameters.
Press Return to start the LINUX now, any other key for vivi
type "help" for help.
vivi>
>Block 1585 marked for retirement
**>>yaffs ecc error unfixed on chunk 50910:0
**>>yaffs ecc error unfixed on chunk 50910:1
**>>Block 1590 marked for retirement
Reading data from NAND FLASH without ECC is not recommended
**>>yaffs ecc error unfixed on chunk 55855:0
**>>yaffs ecc error unfixed on chunk 55855:1
 mount -t yaffs /dev/mtdblock/4   /usr






关于nand,mtd和yaffs2的配合使用问题的解决方法!

       如果你作nand驱动,那么肯定会知道yaffs2文件系统了,由于yaffs2的更新没有mtd那么快,所以就出现了他们配合不好的问题,经常出现 nand mount和umount的时候丢数据的问题,当你碰到这个问题的时候,不要慌张。你首先应该用jffs2去测试一下你的nand驱动是否正常,如果驱动是好的,但是还存在丢失数据的问题的话,那么你就碰到了yaffs2和mtd不匹配的想象了,总结了很多网友的经验,虽然不同的人解决问题的方法不一样,但是大部分都是由于nand写oobbuf的问题上,yaffs2要给mtd一个buf,你要查查看mtd有没有接受这个buf吧,还有就是最新的 yaffs2和最新的mtd代码是不能匹配的,我测试过效果极差,需要手动去修改bug,另外最新的mtd当你选择none-ecc模式的时候是不处理 oob数据的,你要在write_ecc函数里加上写oobbuf的语句才可以的。

     总之当你碰到nand丢失数据的问题的时候,不要和我一样盲目的人为yaffs2代码有bug了,其实是他们配合的问题,更不要盲目的下载最新代码,这样你porting她们也要花很多时间,弄好了还不一定能解决问题啊!

    如果你的问题实在不能解决可以mail我,我和兄弟们会帮大家查看一下,再不行只能另请高人了:)

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

chinaunix网友2008-08-28 15:34:42

CPU:s3c2440 kernel:linux2.6.24 yaffs:最新版本 下载编译进内核,编译成功,下载到flash,系统正常启动,加载Yaffs文件系统,也能成功,但是将文件写到flash上后,再重启后,发现文件的大小变化了,文件或变大或变小,但变化后文件大小都变为512的倍数。 例如:yaffs文件系统加载到/mnt下 一个文件TD.o大小为190396 B写到/mnt下,当时察看属性,大小是190396 B,但重启系统后,再查看其属性,大小变为:190464B。有的文件变大,有的文件变小,不知道是什么原因 lby147612@126.com bj.byliu@inside.evoc.cn

chinaunix网友2008-08-28 15:34:42

CPU:s3c2440 kernel:linux2.6.24 yaffs:最新版本 下载编译进内核,编译成功,下载到flash,系统正常启动,加载Yaffs文件系统,也能成功,但是将文件写到flash上后,再重启后,发现文件的大小变化了,文件或变大或变小,但变化后文件大小都变为512的倍数。 例如:yaffs文件系统加载到/mnt下 一个文件TD.o大小为190396 B写到/mnt下,当时察看属性,大小是190396 B,但重启系统后,再查看其属性,大小变为:190464B。有的文件变大,有的文件变小,不知道是什么原因 lby147612@126.com bj.byliu@inside.evoc.cn