移植uboot-2012.04.01支持Nandflash中flash无法写入的bug

移植uboot-2012.04.01支持Nandflash中flash无法写入的bug
bug表现:
代码修改编译烧写完成后启动,执行save命令,重启一直是//*** Warning - bad CRC, using default environment//输出,说明要不环境变量保存失败,要不启动时从flash读取环境变量失败
debug:
基于smdk2410修改的原代码中,命令、地址、数据的读写在s3c2440_nand.c->board_nand_init()函数中用nand->IO_ADDR_R、nand->IO_ADDR_W变量保存读写地址,它们由以下代码赋值:

	/* initialize nand_chip data structure */
	nand->IO_ADDR_R = (void *)&nand_reg->nfdata;
	nand->IO_ADDR_W = (void *)&nand_reg->nfdata;

但在S3C2440_hwcontrol()函数中IO_ADDR_W变量可能被改变:

		ulong IO_ADDR_W = (ulong)nand;//IO_ADDR_W = 0x4E000000
		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;

而基于smdk2440的Nandflash的读写数据地址必须都为&nand_reg->nfdata;
而在nand_base.c中写flash的基础函数nand_write_buf()中用的却是可能被改变的IO_ADDR_W:

	for (i = 0; i < len; i++)
		writeb(buf[i], chip->IO_ADDR_W);

因此可能会产生错误,把IO_ADDR_W改为IO_ADDR_R就好:

for (i = 0; i < len; i++)
		writeb(buf[i], chip->IO_ADDR_R);

韦东山的视频在改写S3C2440_hwcontrol()时无意识地避免了修改IO_ADDR_W从而幸运地避开了bug

猜你喜欢

转载自blog.csdn.net/weixin_42666958/article/details/88389086