a.在s3c2440_nand.c(路径:drivers\mtd\nand\s3c2440_nand.c)文件中把board_nand_init函数里的:
cfg = S3C2440_NFCONF_EN; cfg |= S3C2440_NFCONF_TACLS(tacls - 1); cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1); cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);
这四句去掉,替换为:
cfg = ((tacls-1)<<12)|((twrph0-1)<<8)|((twrph1-1)<<4); /* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */
b.在
writel(cfg, &nand_reg->nfconf);
这句的下面添加一句:
writel ((1<<4)|(1<<1)|(1<<0),&nand_reg->nfcont);
c. 将
nand->select_chip = null;
这句话修改为:
nand->select_chip = s3c2440_nand_select;
d.将s3c2440_nand.c(路径:drivers\mtd\nand\s3c2440_nand.c)中的:
#define S3C2440_NFCONF_nFCE (1<<11)
改成:
#define S3C2440_NFCONF_nFCE (1<<1)
f. 在board_nand_init函数前面添加s3c2440_nand_select函数:
static void s3c2440_nand_select(struct mtd_info *mtd, int chipnr) { struct s3c24x0_nand *nand = s3c24x0_get_base_nand(); switch(chipnr) { case -1:/*取消选中*/ nand->nfcont |= (1<<1); break; case 0: nand->nfcont &= ~(1<<1); break; default: BUG(); } }
g.将s3c2440_nand.c(路径:drivers\mtd\nand\s3c2440_nand.c)中的s3c24x0_hwcontrol函数修改为:
static void s3c24x0_hwcontrol(struct mtd_info *mtd, int dat, unsigned int ctrl) { struct s3c24x0_nand *nand = s3c24x0_get_base_nand(); if(ctrl & NAND_CLE) { /*发命令*/ writeb(dat, &nand->nfcmd); } else if(ctrl & NAND_ALE) { /*发地址*/ writeb(dat, &nand->nfaddr); } }
h.至此,uboot以支持NAND FLASH: