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

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

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

定义为 1

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

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

有 env_nand.o 和 env_onenand.o,我们需要把环境变量保存到 NAND,因此我们需要定义

CONFIG_ENV_IS_IN_NAND,同时屏蔽掉 CONFIG_ENV_IS_IN_ONENAND

再次编译,没有定义 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:

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

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

并且在 tiny210.h 中定义 CONFIG_NAND_S5PV210:

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

紧接着在下面添加宏:

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

然后在 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

我们需要修改 u-boot-spl.bin 中的 copy_bl2_to_ram 中的拷贝大小225172 / 512 = 439

我们之间将拷贝大小修改为 500  ,拷贝 250KB:

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

打印警告:Warning - bad CRC, using default environment

这是由于我们在 smdkv210.h 中指定了将环境变量保存到 NAND,u-boot 启动的时候会从指定的地址读取环境变量

如果读取失败,则使用默认的环境变量,默认的环境变量就是我们通过 CONFIG_这样的宏在单板配置文件中的定义的。比如之前定义的 CONFIG_IPADDR。我们执行 saveenv 将环境变量保存到 NAND 中,下次启动就不会有那样的警告了:

执行 reset 复位

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

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

下载一个文件到内存 :

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

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

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

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

Total of 2048 byte(s) were the same

我们读写了 0x800 个字节,即 2048 个字节,全部正确无误。

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

时间: 2024-10-14 16:35:26

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植NAND FLASH的相关文章

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植u-boot.bin(打印串口控制台)

在之前我们移植的代码中,都没看到明显的效果,这节我们实现控制台的打印信息. 在上节,我们看到调用 relocate_code 重定位.在 u-boot 的帮助文档 doc/README.arm-relocation 中对重定位有说明.u-boot 为了生成位置无关码,在链接时指定了-pie 选项,这个选项在 u-boot-2014.04/arch/arm/config.mk 中指定: 当使用-pie 选项后,链接器会生成一个修正表(fixup  tables),在最终的二进制文件 u-boot.

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

我们知道 s5pv210启动方式有很多种,sd卡和nand flash 启动就是其中的两种,前面我们实现的都是基于sd卡启动,这节我们开始实现从nand flash 启动: 从 NAND 启动 u-boot,需要 BL1 初始化 NAND 控制器,然后从 NAND 拷贝 BL2 到 DDR 内存.这里的BL1 即我们移植的 u-boot-spl.bin,BL2 即我们移植的 u-boot.bin.在 u-boot.bin 中的 NAND 驱动比较大,它包含了很多功能,而 u-boot-spl.b

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——NAND 8位硬件ECC

这节我们实现nand的ecc,保存环境变量到nand flash 中.然后把我们之前的led灯烧写到nand flash 中,开机启动,在 tiny210.h 中定义宏 CONFIG_S5PV210_NAND_HWECC.CONFIG_SYS_NAND_ECCSIZE.CONFIG_SYS_NAND_ECCBYTES CONFIG_SYS_NAND_ECCSIZE 定义了消息长度,即每多少字节进行 1 次 ECC 校验 CONFIG_SYS_NAND_ECCBYTES 定义为 13Byte,将

tiny210(s5pv210)移植u-boot(基于 2014.4 版本号)——移植u-boot.bin(打印串口控制台)

在之前我们移植的代码中,都没看到明显的效果,这节我们实现控制台的信息打印. 在上节.我们看到调用 relocate_code 重定位.在 u-boot 的帮助文档 doc/README.arm-relocation 中对重定位有说明. u-boot 为了生成位置无关码,在链接时指定了-pie 选项,这个选项在 u-boot-2014.04/arch/arm/config.mk 中指定: 当使用-pie 选项后.链接器会生成一个修正表(fixup  tables).在终于的二进制文件 u-boot

tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——NAND添加分区

这里的分区只是为了操作的方便.假设有个分区 kernel,其地址区间为 0x20000~0x320000,其大小为 0x300000 在没有分区的情况下,对这块区间的操作如下: nand erase 20000 300000        擦除操作 nand write 20000000 20000 300000    写操作 nand read 20000000 20000 300000    读操作 而有了分区的情况下,操作将变得非常简单,如下(其中 kernel 为分区名) nand er

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

我们知道 s5pv210启动方式有非常多种,sd卡和nand flash 启动就是当中的两种,前面我们实现的都是基于sd卡启动,这节我们開始实现从nand flash 启动: 从 NAND 启动 u-boot,须要 BL1 初始化 NAND 控制器,然后从 NAND 拷贝 BL2 到 DDR 内存.这里的BL1 即我们移植的 u-boot-spl.bin,BL2 即我们移植的 u-boot.bin.在 u-boot.bin 中的 NAND 驱动比較大,它包括了非常多功能,而 u-boot-spl

基于mini2440的Qt移植

花了很长时间,终于把Qt移植到mini2440开发板上了,不能说完全成功,总算是完成一大步,各中过程心酸,废话不多说,下面正式讲解移植过程. 移植环境: win7系统,虚拟机是ubuntu12.04 友善之臂mini2440开发板 Qt版本:4.8.6   交叉编译器版本:4.4.3 一.虚拟机Qt开发环境的搭建 1.上Qt的官网下载Qt的源码包:http://qt-project.org/downloads,下载版本是4.8.6,也可以下载其他的版本 2.安装Qt所需要支持的文件 sudo a

基于FPGA的DW8051移植(三)

总结一下问题: 1) http://www.cnblogs.com/sepeng/p/4137405.html  基于FPGA的DW8051移植(一)里面用modelsim观测波形发现程序进入了idata区间初始化循环中跳转不出来,没有进入用户程序这一块. 2) http://www.cnblogs.com/sepeng/p/4141072.html 基于FPGA的DW8051移植(二)里面将idata区间初始化去掉,程序进入了用户程序却发现在执行DelayMs 函数的时候,循环执行完毕,在最后

如何进行基于am335的boa移植?

基于am335进行boa移植,一共需要五步,下面是详细的步骤,对这方面知识比较陌生的小伙伴,可以学起来啦. 1.准备开发环境: (1)VMware 10.0 (2)Ubuntu 14.04 64bit (3)Sail335开发板 (4)交叉编译器:gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux 2.源码: (1)Boa源码:boa-0.94.13.tar.gz (2)Boa测试页面:index.html 3.移植过程: (1)移植Boa ①解压缩