zoukankan      html  css  js  c++  java
  • mini2440移植uboot 2014.04(六)

    上一篇博文:《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能正常显示和执行。

      

  • 相关阅读:
    HTML DOM 06 节点关系
    HTML DOM 05 事件(三)
    HTML DOM 05 事件(二)
    HTML DOM 05 事件(一)
    html DOM 04 样式
    html DOM 03 节点的属性
    html DOM 02 获取节点
    html DOM 01 节点概念
    JavaScript 29 计时器
    JavaScript 28 弹出框
  • 原文地址:https://www.cnblogs.com/qiaoqiao2003/p/3817844.html
Copyright © 2011-2022 走看看