uboot的nandflash启动saveenv时Writing to Nand... FAILED问题解决办法

来源:互联网 发布:科比各项数据荣誉 编辑:程序博客网 时间:2024/05/17 08:27
之前碰到问题是saveenv命令时,出现Writing to Nand... FAILED!,说明写入nand有问题,上网查了之后解决了该问题。
http://www.arm9home.net/simple/index.php?t8091.html
http://www.linuxidc.com/Linux/2011-05/35982p3.htm
第一个网址是一个网友对此问题的说明,第二个是我在修改程序时参照的,而且第二个网址介绍了很多uboot移植经验,可以以后参照。
现在说明此问题的根源,我们前面重写了s3c2440_nand.c文件,而且是仿照s3c2410_nand.c文件写的,其中有个函数s3c2440_hwcontrol很重要,完成了三个功能:【1】选择写入命令还是写入地址【2】完成片选功能【3】完成发送命令功能,
该函数在board_nand_init函数中被赋值给chip->cmd_ctrl
该函数的重要体现在nand_chip中的两个函数指针成员
chip->select_chip=nand_select_chip
chip->cmdfunc = nand_command
被赋的值nand_select_chip和nand_command都通过调用chip->cmd_ctrl,即s3c2440_hwcontrol来完成主要功能。
在s3c2440_hwcontrol中chip->IO_ADDR_W = (void *)IO_ADDR_W;这句命令修改了chip->IO_ADDR_W 的值,但实际上该值的初始化在之前nand_init_chip函数中nand->IO_ADDR_R = nand->IO_ADDR_W = (void  __iomem *)base_addr;之后再修改该值出现了问题(究其根本原因,本人也说不上),所以不应该修改该值,所以将该s3c2440_hwcontrol函数修改如下:
ulong IO_ADDR_W=NF_BASEX;
static void s3c2440_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
// struct nand_chip *chip = mtd->priv;
struct s3c2440_nand *nand = s3c2440_get_base_nand();

debugX(1, "hwcontrol(): 0x%02x 0x%02x\n", cmd, ctrl);

if (ctrl & NAND_CTRL_CHANGE) {
// ulong IO_ADDR_W = (ulong)nand;
IO_ADDR_W=NF_BASEX;
if (!(ctrl & NAND_CLE))
IO_ADDR_W |= S3C2440_ADDR_NCLE;
if (!(ctrl & NAND_ALE))
IO_ADDR_W |= S3C2440_ADDR_NALE;

// chip->IO_ADDR_W = (void *)IO_ADDR_W;

if (ctrl & NAND_NCE)
writel(readl(&nand->NFCONT) & ~S3C2440_NFCONT_nFCE,  &nand->NFCONT);
 
else
writel(readl(&nand->NFCONT) | S3C2440_NFCONT_nFCE, &nand->NFCONT);
}

if (cmd != NAND_CMD_NONE)
//writeb(cmd, chip->IO_ADDR_W);
writeb(cmd,(void*)IO_ADDR_W);
}
原创粉丝点击