tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

时间:2023-02-13 19:31:53

这节我们开始移植nand flash:通过查看帮助文档 doc/README.nand,要支持 NAND,需要配置CONFIG_CMD_NAND我们修改 tiny210.h,把 CONFIG_CMD_ONENAND 屏蔽掉,同时加上CONFIG_CMD_NAND:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

编译出错 ,没有定义 CONFIG_SYS_MAX_NAND_DEVICE,最大 NAND 设备数,我们的板子只有 1 个 NAND,将其
定义为 1

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

再次编译,出错:未定义 NAND 的基地址,查看 S5PV210 手册, NAND 的基地址为 0xB0E00000,在 tiny210.h 中定义:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

再次编译,还是出错:env_onenand.c 与 onenand 相关的,我们不需要编译,查看 u-boot-2014.04/common/Makefile:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

有 env_nand.o 和 env_onenand.o,我们需要把环境变量保存到 NAND,因此我们需要定义
CONFIG_ENV_IS_IN_NAND,同时屏蔽掉 CONFIG_ENV_IS_IN_ONENAND

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

再次编译,没有定义 board_nand_init,看名字就知道这是单板相关的 NAND 初始化函数。通过搜索 u-boot 源码
发现在 u-boot-2014.04/drivers/mtd/nand/s3c2410_nand.c 中定义了这个函数,我们仿照s3c2410_nand.c 编写 s5pv210_nand.c,拷贝 s3c2410_nand.c 为 s5pv210_nand.c:tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

同时查看 u-boot-2014.04drivers/mtd/nand/Makefile,看下怎么将 s5pv210_nand.c 编译进 u-boot:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

只有定义了 CONFIG_NAND_S3C2410 就会编译 s3c2410_nand.c我们仿照添加一行:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

并且在 tiny210.h 中定义 CONFIG_NAND_S5PV210:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

将 s5pv210_nand.c 中的 s3c2410 全部替换为 s5pv210,然后我们修改S5pv210_nand.c.首先我们需要用到 nand 相关的寄存器操作,在 arch/arm/include/asm/arch-s5pc1xx/cpu.h 中添加 NAND的基地址:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

紧接着在下面添加宏:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

然后在 arch/arm/include/asm/arch-s5pc1xx/下创建文件 nand_reg.h,定义 NAND 的寄存器结构体:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

然后在 s5pv210_nand.c 中添加头文件#include <asm/arch/nand_reg.h>
在 board_nand_init 进行相关的初始化,增加函数s5pv210_nand_select_chip,这个片选函数最终将调用 s5pv210_hwcontrol,修改 s5pv210_hwcontrol函数,这个函数主要做一些硬件相关的操作,比如发命令、发地址、片选。具体请看代码。
编译成功,由于增加了 NAND 驱动,u-boot.bin 的大小已经变为 225172B

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

我们需要修改 u-boot-spl.bin 中的 copy_bl2_to_ram 中的拷贝大小225172 / 512 = 439
我们之间将拷贝大小修改为 500  ,拷贝 250KB:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

再次编译,将 tiny210-spl.bin 和 u-boot.bin 烧写的 SD 卡,从 SD 卡启动开发板:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH


打印警告:Warning - bad CRC, using default environment
这是由于我们在 smdkv210.h 中指定了将环境变量保存到 NAND,u-boot 启动的时候会从指定的地址读取环境变量 
如果读取失败,则使用默认的环境变量,默认的环境变量就是我们通过 CONFIG_这样的宏在单板配置文件中的定义的。比如之前定义的 CONFIG_IPADDR。我们执行 saveenv 将环境变量保存到 NAND 中,下次启动就不会有那样的警告了:


tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

执行 reset 复位 

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

现在来测试一下 NAND  读写是否正确无误,我们先通过 tftp 下载一个文件到内存 :

先配置网络,测试网络是否联通:

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH


下载一个文件到内存 :

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

然后擦除 NAND 的 0x80000 地址开始的一块

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

然后将内存 0x20000000 开始的 0x800 字节的数据写入 NAND 的 0x80000 地址

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

然后从 NAND 的 0x80000 地址读取 0x800 字节数据到内存的 0x20002000 地址

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH

然后使用 cmp 命令,比较 0x20000000 和 0x20002000 开始的 0x800 字节数据是否相同

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH


Total of 2048 byte(s) were the same
我们读写了 0x800 个字节,即 2048 个字节,全部正确无误。

nand flash  的移植算是成功了,下次我们给nand flash 添加分区