一、uboot中增加NANDFLASH
由第二节分析得知,硬件初始化在board_init_r中,我们到这里找到nand的初始化:
u-boot-2016.09$ vim common/board_r.c
看这里知道首先我们需要定义宏CONFIG_CMD_NAND,屏蔽CONFIG_CMD_ONENAND,才可以调用nand的初始化函数,在include/conifgs/tq210.h中定义宏:
#define CONFIG_CMD_NAND
编译,发现没有定义CONFIG_SYS_MAX_NAND_DEVICE,由于我们的板子上只有一个nandflash,所以在tq210.h中定义宏:
#define CONFIG_SYS_MAX_NAND_DEVICE 1
再次编译,发现没有定义CONFIG_SYS_NAND_BASE,查看datasheet,定义宏:
#define CONFIG_SYS_NAND_BASE 0xB0E00000
再次编译,还是出错,onenand_mtd和board_nand_init又没有定义,查看common/Makefile
我们需要把环境变量保存到nand,所以屏蔽掉CONFIG_ENV_IS_IN_ONENAND,并定义宏CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_IS_IN_NAND
再次变编译,发现onenand_mtd的错误消失,只有board_nand_init没有定义了。搜索代码,发现只drivers/mtd/nand/s3c2410_nand.c中有定义,于是我们仿照s3c2410_nand.c修改一个s5pv210_nand.c
修改drivers/mtd/nand/Makefile,将s5pv210_nand.c编译进uboot.
obj-$(CONFIG_NAND_S5PV210) += s5pv210_nand.o
#define CONFIG_NAND_S5PV210
首先我们需要用到nand相关的寄存器操作,在arch/arm/mach-s5pv210/include/mach/cpu.h中添加nand的基地址和宏
#define S5PV210_NAND_BASE 0xB0E00000
SAMSUNG_BASE(nand, NAND_BASE)
然后在arch/arm/mach-s5pv210/include/mach/下创建文件nand_reg.h,定义 NAND 的寄存器结构体
u-boot-2016.09$ vim arch/arm/mach-s5pv210/include/mach/nand_reg.h
然后在s5pv210_nand.c 中添加头文件
#include <asm/arch/nand_reg.h>
在board_nand_init进行相关的初始化,增加函数s5pv210_nand_select_chip,这个片选函数最终将调用s5pv210_hwcontrol,修改s5pv210_hwcontrol函数,这个函数主要做一些硬件相关的操作,比如发命令、发地址、片选。
编译,发现产生u-boot.bin,烧录发现不能识别出nand的信息,前面已经配置好了串口,所以这里就进行打印调试,最终发现是nand_scan中chip信息有问题,搜索尝试发现在drivers/mtd/nand/nand.c中static void nand_init_chip(int i)函数中添加mtd->priv = nand;就可以解决问题。
二、给nandflash分区:
在tq210.h中,已经有NAND分区的例子,我们直接修改
256K给u-boot,128K给params,即环境变量,3M给内核,剩余的全部给根文件系统,这里指定了环境变量在NAND的分区所在的地址空间,在tq210.h中定义了其所在的地址和大小,两者必须保持一致。
重新编译,将u-boot.bin烧录进开发板,打开串口,开发板上电,发现nand信息已经打印出来。