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) |