上一篇博文:《mini2440移植uboot 2014.04(五)

代码已经上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440

(十)添加nand 启动代码

nand启动是uboot中最让人困惑的东西,它用到SPL(secondary program loader),对SPL进行讲解的文档比较少,初次接触有点无所适从的感觉。

主要参考文档可以查看当前版本uboot下的doc/README.SPL和doc/README.arm-relocation

还有个参考文档是google chromium-os u-boot porting guide: http://www.chromium.org/chromium-os/u-boot-porting-guide

其实当前版本代码结构有点奇怪,uboot源代码下有spl,nand_spl两个类似的文件夹,不知道应该使用哪个文件夹。

nand_spl是很早以前版本就存在的文件夹,spl好像是新添加的文件夹(不清楚是哪个版本新添加的文件夹)。

uboot 2014.07-rc3版本(下载地址)中已经不再包含nand_spl文件夹,似乎以后版本会在spl下编译代码。

仔细查看了一下,2014年6月6日的uboot代码中将nand_spl文件夹全部删除,其链接地址在这里

关于NAND有好几个常见的宏定义:CONFIG_NAND_SPL,CONFIG_SPL_BUILD,CONFIG_NAND_U_BOOT.

其中CONFIG_NAND_SPL已经过时了,2013.01版本uboot代码中有相关说明(参看《uboot 2013.01 代码简析(3)第二阶段初始化》中贴出的部分代码)。

当前使用CONFIG_SPL_BUILD来代替CONFIG_NAND_SPL,但从当前uboot代码来看,支持这个宏的开发板平台并不很多(omap,ti一些开发板有相应支持)。

而CONFIG_NAND_U_BOOT在Makefile中使用,如果定义了这个宏,那么就会编译nand_spl下代码,在该文件夹下生成u-boot-spl,

再将u-boot-spl扩充到4k大小(名为u-boot-spl-16k.bin),然后将其加入到以前生成的u-boot.bin前面,生成u-boot-nand.bin.

而硬件在使用nand 启动时,只能读取u-boot-nand.bin前面的4k大小,如果使用nand 启动,那么恰好读取对应于u-boot-spl-16k.bin这部分代码并执行。

之后再执行必要的输出化,然后将u-boot-nand.bin中后续代码(对应u-boot.bin)搬运到内存,再从内存执行后续代码,其执行过程和直接内存启动uboot非常类似了。

本文中参考https://gitcafe.com/keinye/mini2440-uboot代码来实现nand 启动. 它使用了CONFIG_NAND_U_BOOT和CONFIG_NAND_SPL 这两个宏。

在include/configs/mini2440.h中添加下面一行代码:

#define CONFIG_BOARD_EARLY_INIT_F

在board/friendlyarm/mini2440/mini2440.c中添加下面代码:

#ifdef CONFIG_NAND_SPL
void __weak board_init_f(ulong dummy)
{
unsigned int i;
unsigned int stack = 0x33f80000; __asm__ __volatile__ (
"mov sp, %0"
::"r"(stack)
:"sp");
nand_boot();
}
#endif

重新编译,加载到内存运行,一切正常。

在nand_spl下创建mini2440的文件夹:

mkdir -p nand_spl/board/friendlyarm/mini2440

然后在nand_spl/board/friendlyarm/mini2440下创建三个文件,它们分别是Makefile、u-boot.lds和config.mk。

这三个文件的实际内容比较长,文件具体内容请查看我上面的github链接。

然后需要对以前的代码也进行修改,主要是参考https://gitcafe.com/keinye/mini2440-uboot,具体修改内容参看我上面的github链接。

改好代码后,重新编译:

make mini2440_config
make CROSS_COMPILE=arm-linux-

然后打开三个控制台,

然后打开三个控制台,一个执行"sudo minicom",另一个执行"openocd -f interface/jlink.cfg -f board/mini2440.cfg",最后一个控制台执行下面内容:

telnet localhost 4444
reset
init_2440
nand probe 0
nand erase 0
nand write 0 /home/host/soft/mini2440/u-boot-2014.04/u-boot-nand.bin 0
reset

倒数第二步执行 nand write花了28分钟(uboot文件大小是548KB),

在minicom所在控制台上可以正常显示和进入uboot。

但是,这个u-boot-nand.bin还有个问题,就是它不能直接启动,如果关掉开发板再重新打开开发板,那么就不能进入uboot界面(这个bug留到以后再来解决)。

这种情况下,在重新打开开发板后,还是打开三个控制台,在最后一个控制台,执行下面命令:

halt
init_2440
reset

然后就能在minicom所在控制台上看到uboot能正常显示和执行。

  

mini2440移植uboot 2014.04(六)的更多相关文章

  1. mini2440移植uboot 2014.04(七)

    上一篇博文:<mini2440移植uboot 2014.04(六)> 代码已经上传到github上: https://github.com/qiaoyuguo/u-boot-2014.04 ...

  2. mini2440移植uboot 2014.04(四)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <mini2440移植u ...

  3. mini2440移植uboot 2014.04(五)

    代码上传到github上:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440 前几篇博文: <mini2440移植uboot 2014.04 ...

  4. mini2440移植uboot 2014.04(二)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文章: <u-boot-2011 ...

  5. mini2440移植uboot 2014.04(三)

    我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot-2014.04-mini2440.git 参考文档: s3c2440手册(下载地址) ...

  6. mini2440移植uboot 2014.04(一)

    最新版的uboot添加了很多新功能,我决定在最新版代码基础上重新移植一遍加深理解. 我修改的代码已经上传到github上,地址:https://github.com/qiaoyuguo/u-boot- ...

  7. mini2440移植uboot 2011.03(下)

    参考博文: <u-boot-2011.03在mini2440/micro2440上的移植> 移植(五)添加nand支持: host@debian:~/soft/mini2440/u-boo ...

  8. 移植u-boot.2012.04.01

    /*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...

  9. mini2440移植uboot 2011.03(上)

    参考博文: <u-boot-2011.03在mini2440/micro2440上的移植> 本来我想移植最新版的uboot,但是移植却不太成功,所以先模仿他人的例子重新执行一遍,对uboo ...

随机推荐

  1. Spring MVC文本框

    以下示例显示如何使用Spring Web MVC框架在表单中使用文本框.首先使用Eclipse IDE来创建一个Web工程,按照以下步骤使用Spring Web Framework开发基于动态表单的W ...

  2. Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成

    Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下: Web 模块提供面向web的基本功能和面向web的应用上下文,比如多部分(multipa ...

  3. Win7机器上安装Ubuntu 14.0.4

    折腾了两天,分享一下经历. 我须要在已经安装了win7的机器上安装Ubuntu 14.0.4 (两者共存),研究下来有例如以下几种方案, 都折腾了一遍.分享一下经验: 方式1: wubi.exe, 把 ...

  4. Material design之Material Theme

    Material Theme提供了三方面的内容: 系统组件的颜色可以自定义更改 系统组件添加了触摸反馈动画效果 Activity切换动画效果 系统主题默认被定义在以下三个样式中: 使用Material ...

  5. 郭大侠与Rabi-Ribi (优先队列)

    最近郭大侠迷上了玩Rabi-Ribi这个游戏. Rabi-Ribi呢,是一个打兔子的动作冒险游戏,萌萌哒的兔子在地上跑来跑去,好萌好萌呀~ 这个游戏是这样玩的,郭大侠作为一个主角,拿着一个小锤子,他的 ...

  6. Python之可迭代对象、迭代器、生成器

    在使用Python的过程中,很容易混淆如下几个关联的概念: 1.容器(container) 2.可迭代对象(Iterable) 3.迭代器(Iterator) 4.生成器(generator) 5.生 ...

  7. JS中的this变量的使用介绍

    在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,在本文将为大家详细介绍下JavaScript中this的使用,感兴趣的朋友可以参考下. JavaScript中t ...

  8. KVC示例

    KVC –key value Coding,可以让我们通过键值编码的形式进行属性值的赋值 参考苹果官网的图.. 1.KVC 定义一个Person类 .h文件 1: #import <Founda ...

  9. python Flask框架CBV视图

    1.演示之前需要先写一个装饰器 # 装饰器 def wrapper(func): def inner(*args, **kwargs): print('操作函数%s之前' % func.__name_ ...

  10. Java语言实现简单FTP软件------>FTP协议分析(一)

    FTP(File Transfer Protocol)就是文件传输协议.通过FTP客户端从远程FTP服务器上拷贝文件到本地计算机称为下载,将本地计算机上的文件复制到远程FTP服务器上称为上传,上传和下 ...