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

2023-11-01 51浏览
百检网是一家专业的第三方检测平台,汇聚众多拥有权威资质的第三方检测机构为你提供一站式的检测服务,做检测就上百检网。百检网让检测从此检测,一份报告全国通用,专业值得信赖。

一、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

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


百检网秉承“客户至上,服务为先,精诚合作,以人为本”的经营理念,始终站在用户的角度解决问题,为客户提供“一站购物式”的新奇检测体验,打开网站,像挑选商品一样简单,方便。打破行业信息壁垒,建构消费和检测机构之间高效的沟通平台