移植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