u-boot-2016.09移植(7)-nandflash

一、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信息已经打印出来。

这里写图片描述

猜你喜欢

转载自blog.csdn.net/keyue123/article/details/53087732