本节中实现uboot对Nand flash的操作
1. 复制文件
对比了S3C2410和S3C2440的Nand控制寄存器,他们之间的差别还是比较大,uboot源代码中支持2410 nand,我们需要复制文件drivers/mtd/nand/s3c2410_nand.c
为s3c2440_nand.c
2. 修改Makefile
修改drivers/mtd/nand/Makefile
加入obj-$(CONFIG_NAND_S3C2440) += s3c2440_nand.o
CONFIG_NAND_S3C2410
定义在include/configs/smdk2410.h
中
接下来修改include/configs/smdk2440.h
将
#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x4E000000
#endif
修改为
#ifdef CONFIG_CMD_NAND
#define CONFIG_NAND_S3C2440
#define CONFIG_SYS_S3C2440_NAND_HWECC
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x4E000000
#endif
之后编译uboot,发现可以正常编译出u-boot.bin
,但是在最后报错
原因时在uboot编译时,检查有关Kconfig中是否有关新定义的宏是否有对应的配置项。
打开drivers/mtd/nand/Kconfig
,看到并没有CONFIG_NAND_S3C2410
的配置。
使用grep
命令查找uboot源代码,可以看到在scripts/config_whitelist.txt
中有这个宏,从文件名可以推断出如果宏定义在此文件中,Kconfig中不定义对应项,也能正常编译通过。因此在此文件中哦你工加入
CONFIG_NAND_S3C2440
CONFIG_SYS_S3C2440_NAND_HWECC
3. 修改drivers/mtd/nand/s3c2440_nand.c
修改寄存器的配置项
#define S3C2440_NFCONT_EN (1<<0)
#define S3C2440_NFCONT_INITECC (1<<4)
#define S3C2440_NFCONT_nFCE (1<<1)
#define S3C2440_NFCONF_TACLS(x) ((x)<<12)