• 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能正常显示和执行。

      

  • 相关阅读:
    多态与鸭子类型
    mixin与派生
    4.9作业
    property
    继承
    封装
    《梦断代码》阅读笔记1
    阅读笔记3——《大道至简》第四、五、六章
    阅读笔记2——《大道至简》第二、三章
    阅读笔记1——《大道至简》第一章
  • 原文地址:https://www.cnblogs.com/qiaoqiao2003/p/3817844.html
Copyright © 2020-2023  润新知