楼主你好,也在研究K9GAG08U0F的nand启动,我这边nand也可以启动起来,有几个地方不一样,
1 \include\s5pc110.h 我用的是
#define NFCONF_VAL (0<<25)|(0x3<<23)|(7<<12)|(7<<8)|(7<<4)|(1<<3)|(0<<2)|(1<<1)|(0<<0)
查210 datasheet NFCONF这段
PageSize [2] This bit indicates the page size of NAND Flash Memory,
When MLCFlash is 0, the value of PageSize is as follows:
0 = 2048 Bytes/page 1 = 512 Bytes/page
When MLCFlash is 1, the value of PageSize is as follows:
0 = 4096 Bytes/page 1 = 2048 Bytes/page
K9GAG08U0F 是用的4k pagesize MLC 16bit ECC
2 int s3c_nand_correct_data_16bit(struct mtd_info *mtd, u_char *dat)
{
int ret = -1;
u_long nf8eccerr0, nf8eccerr1, nf8eccerr2, nf8eccerr3, nf8eccerr4, nf8eccerr5, nf8eccerr6, nf8eccerr7, nf8eccerr8,nfmlc8bitpt0, nfmlc8bitpt1,nfmlc8bitpt2, nfmlc8bitpt3;
u_char err_type;
s3c_nand_wait_ecc_busy_8bit();
nf8eccerr0 = readl(NFECCSECSTAT);
nf8eccerr1 = readl(NFECCERL0);
nf8eccerr2 = readl(NFECCERL1);
nf8eccerr3 = readl(NFECCERL2);
nf8eccerr4 = readl(NFECCERL3);
/*add */
nf8eccerr5 = readl(NFECCERL4);
nf8eccerr6 = readl(NFECCERL5);
nf8eccerr7 = readl(NFECCERL6);
nf8eccerr8 = readl(NFECCERL7);
nfmlc8bitpt0 = readl(NFECCERP0);
nfmlc8bitpt1 = readl(NFECCERP1);
/*add */
nfmlc8bitpt2 = readl(NFECCERP2);
nfmlc8bitpt3 = readl(NFECCERP3);
err_type = (nf8eccerr0) & 0xf;
/* No error, If free page (all 0xff) */
if ((nf8eccerr0 >> 29) & 0x1)
err_type = 0;
switch (err_type) {
case 17/*9*/: /* Uncorrectable */
printk("s3c-nand: ECC uncorrectable error detected\n");
ret = -1;
break;
#if 1 /*add */
case 16: /* 8 bit error (Correctable) */
dat[(nf8eccerr8 >> 16) & 0x3ff] ^= ((nfmlc8bitpt3 >> 24) & 0xff);
case 15: /* 7 bit error (Correctable) */
dat[(nf8eccerr8) & 0x3ff] ^= ((nfmlc8bitpt3 >> 16) & 0xff);
case 14: /* 6 bit error (Correctable) */
dat[(nf8eccerr7 >> 16) & 0x3ff] ^= ((nfmlc8bitpt3 >> 8) & 0xff);
case 13: /* 5 bit error (Correctable) */
dat[(nf8eccerr7) & 0x3ff] ^= ((nfmlc8bitpt3) & 0xff);
case 12: /* 8 bit error (Correctable) */
dat[(nf8eccerr6 >> 16) & 0x3ff] ^= ((nfmlc8bitpt2 >> 24) & 0xff);
case 11: /* 7 bit error (Correctable) */
dat[(nf8eccerr6) & 0x3ff] ^= ((nfmlc8bitpt2>> 16) & 0xff);
case 10: /* 6 bit error (Correctable) */
dat[(nf8eccerr5 >> 16) & 0x3ff] ^= ((nfmlc8bitpt2>> 8) & 0xff);
case 9: /* 1 bit error (Correctable) */
//printk("s3c-nand: %d bit(s) error detected, corrected successfully\n", err_type);
dat[(nf8eccerr5) & 0x3ff] ^= ((nfmlc8bitpt2) & 0xff);
//ret = err_type;
break;
#endif
case 8: /* 8 bit error (Correctable) */
dat[(nf8eccerr4 >> 16) & 0x3ff] ^= ((nfmlc8bitpt1 >> 24) & 0xff);
case 7: /* 7 bit error (Correctable) */
dat[(nf8eccerr4) & 0x3ff] ^= ((nfmlc8bitpt1 >> 16) & 0xff);
case 6: /* 6 bit error (Correctable) */
dat[(nf8eccerr3 >> 16) & 0x3ff] ^= ((nfmlc8bitpt1 >> 8) & 0xff);
case 5: /* 5 bit error (Correctable) */
dat[(nf8eccerr3) & 0x3ff] ^= ((nfmlc8bitpt1) & 0xff);
case 4: /* 8 bit error (Correctable) */
dat[(nf8eccerr2 >> 16) & 0x3ff] ^= ((nfmlc8bitpt0 >> 24) & 0xff);
case 3: /* 7 bit error (Correctable) */
dat[(nf8eccerr2) & 0x3ff] ^= ((nfmlc8bitpt0>> 16) & 0xff);
case 2: /* 6 bit error (Correctable) */
dat[(nf8eccerr1 >> 16) & 0x3ff] ^= ((nfmlc8bitpt0>> 8) & 0xff);
case 1: /* 1 bit error (Correctable) */
printk("s3c-nand: %d bit(s) error detected, corrected successfully\n", err_type);
dat[(nf8eccerr1) & 0x3ff] ^= ((nfmlc8bitpt0) & 0xff);
ret = err_type;
break;
case 0: /* No error */
ret = 0;
break;
}
return ret;
}
/*add */ 是我添加的地方,与16位校准相对应,可以查看datasheet 中NFECCSECSTAT NFECCERP0~3 这几个寄存器说明。
我测试了一下,上面这两个地方其实并不影响nand 启动,个人感觉从驱动完整性方面考虑应该是这样配置。
现在卡在nand启动解压 kernel这块
.......
dev_id ID:d5
MLC
maf_id=ec,dev_id=d5
11111
mtd->erasesize =1048576, mtd->writesize =4096, mtd->oobsize =512, busw =0
busw=0
2048 MB
*** Warning - using default environment
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
checking mode for fastboot ..
.NAND read: device 0 offset 0x600000, size 0x400000
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 8 bit(s) error detected, corrected successfully
s3c-nand: 6 bit(s) error detected, corrected successfully
s3c-nand: 8 bit(s) error detected, corrected successfully
s3c-nand: 7 bit(s) error detected, corrected successfully
s3c-nand: 8 bit(s) error detected, corrected successfully
s3c-nand: 7 bit(s) error detected, corrected successfully
s3c-nand: 7 bit(s) error detected, corrected successfully
s3c-nand: 3 bit(s) error detected, corrected successfully
s3c-nand: 2 bit(s) error detected, corrected successfully
s3c-nand: 6 bit(s) error detected, corrected successfully
s3c-nand: 8 bit(s) error detected, corrected successfully
s3c-nand: 5 bit(s) error detected, corrected successfully
s3c-nand: 5 bit(s) error detected, corrected successfully
s3c-nand: 7 bit(s) error detected, corrected successfully
s3c-nand: 5 bit(s) error detected, corrected successfully
s3c-nand: 3 bit(s) error detected, corrected successfully
s3c-nand: 7 bit(s) error detected, corrected successfully
s3c-nand: 4 bit(s) error detected, corrected successfully
s3c-nand: 3 bit(s) error detected, corrected successfully
s3c-nand: 2 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 4 bit(s) error detected, corrected successfully
s3c-nand: 4 bit(s) error detected, corrected successfully
s3c-nand: 2 bit(s) error detected, corrected successfully
s3c-nand: 1 bit(s) error detected, corrected successfully
s3c-nand: 3 bit(s) error detected, corrected successfully
4194304 bytes read: ERROR
## Booting kernel from Legacy Image at c0008000 ...
Image Name: Linux-3.0.8
Created: 2013-04-22 10:44:57 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3739992 Bytes = 3.6 MB
Load Address: 20008000
Entry Point: 20008000
Verifying Checksum ... Bad Data CRC
ERROR: can't get kernel image!
如果nand 启动的时候 直接用tftp c0008000 uImage;bootm c0008000 的话,内核是可以解压的,打印信息都正常,启动参数的设置 环境变量 包括串口这些方面我都确认过了 没问题,
网上就这个Verifying Checksum ... Bad Data CRC错误有所谓很多的解决方法,都没用,使用 nand dump *** 读出内容和uboot.bin uImage 文件是一致的.觉得问题还是出在uboot中nandflash 驱动这块。不知大家有什么建议,不胜感激!