本次移植跟以往的不同之处是采用了spl来引导u-boot,参考了博客http://blog.csdn.net/fulinus/article/details/42738641

下载链接:http://pan.baidu.com/s/1bnlRKgn

使用方法:

1、 编译

  make tq2440_defconfig

  make

2、 然后会在u-boot根目录下生成u-boot.bin,在spl目录下会生成u-boot-spl.bin,目前的分区是:

u-boot-spl.bin

(1M)

u-boot.bin

(1M)

kernel

(3M)

rootfs

(剩余)

自己可以改动,在arch/arm/lib/crt0.S中:

  #if defined(CONFIG_SPL_BUILD)
     /* Read u-boot from Nandflash to SDRAM address $CONFIG_SYS_TEXT_BASE */
     ldr r0, =CONFIG_UBOOT_MTD_ADDR               /*u-boot镜像在NandFlash中存储地址*/
     ldr r1, =CONFIG_SYS_TEXT_BASE                /*u-boot在内存中的加载地址*/
     ldr r2, =CONFIG_UBOOT_LENGTH                 /*u-boot镜像的大小*/

bl  copy_code_to_sdram

ldr pc, =CONFIG_SYS_TEXT_BASE
  #else
     bl    board_init_f
  #endif

3、目前支持NandFlash和DM9000。

4、为什么要用spl来引导u-boot?

  对于tq2440,采用的是S3C2440,当从NandFlash启动时,上电时S3C2440内部固化的程序自动把NandFlash的前4KB程序拷贝到片内SRAM,然后执行IRAM中的程序,同时要保证这4KB中的程序是位置无关码,在这4KB程序完成了内存的初始化,栈的设置,NandFlash的初始化,将u-boot镜像从NandFlash中拷贝到内存中,将PC跳转到内存中执行。

  随着u-boot的更新,在u-boot的前4K已经无法完成上面这些事,在前4KB会执行位置相关码,导致u-boot无法正常运行。

  为了解决这个问题,u-boot提供了SPL,用spl来引导u-boot,spl的体积很小,只完成将u-boot从NandFlash中拷贝到内存中,然后跳转到内存。

5、可能存在的问题:

  由于从NandFlash启动的时候,IRAM被映射到了0地址处,现在是用spl引导u-boot,所以IRAM中是spl,如果有中断发生,PC执行的是spl中程序,而不是u-boot中的,可以考虑u-boot启动后,在将u-boot的前4KB拷贝到IRAM中。

后来再次阅读了u-boot代码,发现上面的这个担心纯属多余,这个u-boot在代码重定位,并且修改完相关的符号信息后,紧接着又将中断向量也进行了重定位,即将最终u-boot代码段在内存中运行起始地址的前64字节拷贝到了SRAM的0x0处,这样如果发生了中断也不用怕跳飞了。

下面我们简单看一下

相关代码路径:

中断向量表:arch/arm/lib/vectors.S

复位异常入口:arch/arm/cpu/arm920t/start.S

_main: arch/arm/lib/crt0.S

board_init_f:common/board_f.c

relocate_code: arch/arm/lib/relocate.S

relocate_vectors: arch/arm/lib/relocate.S

board_init_r:common/board_r.c

main_loop: common/main.c

cli_loop: common/cli.c

parse_file_outer: common/cli_hush.c

crt0.S:

#if ! defined(CONFIG_SPL_BUILD)

 

/*

 * Set up intermediate environment (new sp and gd) and call

 * relocate_code(addr_moni). Trick here is that we'll return

 * 'here' but relocated.

 */

 

    ldr    sp, [r9, #GD_START_ADDR_SP]    /* sp = gd->start_addr_sp */

    bic    sp, sp, #7    /* 8-byte alignment for ABI compliance */

    ldr    r9, [r9, #GD_BD]        /* r9 = gd->bd */

    sub    r9, r9, #GD_SIZE        /* new GD is below bd */

 

    adr    lr, here

    ldr    r0, [r9, #GD_RELOC_OFF]        /* r0 = gd->reloc_off */

    add    lr, lr, r0

    ldr    r0, [r9, #GD_RELOCADDR]        /* r0 = gd->relocaddr */

    b    relocate_code

here:

/*

 * now relocate vectors

 */

 

    bl    relocate_vectors

relocate_code 和 relocate_vectors:

ENTRY(relocate_vectors)

    /*

     * Copy the relocated exception vectors to the

     * correct address

     * CP15 c1 V bit gives us the location of the vectors:

     * 0x00000000 or 0xFFFF0000.

     */

    ldr    r0, [r9, #GD_RELOCADDR]    /* r0 = gd->relocaddr */

    mrc    p15, 0, r2, c1, c0, 0    /* V bit (bit[13]) in CP15 c1 */

    ands    r2, r2, #(1 << 13)

    ldreq    r1, =0x00000000        /* If V=0 */

    ldrne    r1, =0xFFFF0000        /* If V=1 */

    ldmia    r0!, {r2-r8,r10}

    stmia    r1!, {r2-r8,r10}

    ldmia    r0!, {r2-r8,r10}

    stmia    r1!, {r2-r8,r10}

    bx    lr

 

ENDPROC(relocate_vectors)

 

ENTRY(relocate_code)

    ldr    r1, =__image_copy_start    /* r1 <- SRC &__image_copy_start */

    subs    r4, r0, r1        /* r4 <- relocation offset */

    beq    relocate_done        /* skip relocation */

    ldr    r2, =__image_copy_end    /* r2 <- SRC &__image_copy_end */

 

copy_loop:

    ldmia    r1!, {r10-r11}        /* copy from source address [r1]    */

    stmia    r0!, {r10-r11}        /* copy to   target address [r0]    */

    cmp    r1, r2            /* until source end address [r2]    */

    blo    copy_loop

 

    /*

     * fix .rel.dyn relocations

     */

    ldr    r2, =__rel_dyn_start    /* r2 <- SRC &__rel_dyn_start */

    ldr    r3, =__rel_dyn_end    /* r3 <- SRC &__rel_dyn_end */

fixloop:

    ldmia    r2!, {r0-r1}        /* (r0,r1) <- (SRC location,fixup) */

    and    r1, r1, #0xff

    cmp    r1, #23            /* relative fixup? */

    bne    fixnext

 

    /* relative fix: increase location by offset */

    add    r0, r0, r4

    ldr    r1, [r0]

    add    r1, r1, r4

    str    r1, [r0]

fixnext:

    cmp    r2, r3

    blo    fixloop

 

relocate_done:

这个关于relocation原理的解析参考博客:

uboot的relocation原理详细分析

完!

u-boot-2015.04 在tq2440上的移植(使用spl引导u-boot)的更多相关文章

  1. u-boot-2014_04在TQ2440上的移植

    本文详细介绍了新版本的u-boot-2014_04在tq2440平台上的移植过程,期间参考了网上的其他移植文档,还有韦东山的移植uboot视频,讲的很好.下面是共享链接,欢迎下载,一同学习.其中有移植 ...

  2. u-boot-2015.01在tq2440上的初步移植

    作者: 彭东林 邮箱: pengdonglin137@163.com QQ:   405728433 开发板:     tq2440 工具:       Win7 + VMware + Debian6 ...

  3. 关于asp.net执行exe程序时权限不够的解决办法(2015.04.17更新)

    一,本文背景 长话短说:asp.net项目中需要用到PDF转换成SWF文件,用户上传后自动调用pdf2swf.exe转换. 但有个问题,执行时权限不够,导致一直报错(滚动条一直在往下滚,刷屏中),见下 ...

  4. 黑马_13 Spring Boot:04.spring boot 配置文件

    13 Spring Boot: 01.spring boot 介绍&&02.spring boot 入门 04.spring boot 配置文件 05.spring boot 整合其他 ...

  5. [Linux] Ubuntu Server 12.04 LTS 平台上搭建WordPress(Nginx+MySql+PHP) Part II

    接着上一节继续搭建我们的LNMP平台,接下来我们安装PHP相关的服务 sudo apt-get install php5-cli php5-cgi php5-fpm php5-mcrypt php5- ...

  6. [Linux] Ubuntu Server 12.04 LTS 平台上搭建WordPress(Nginx+MySQL+PHP) Part IV

    接下来我们去下载 WorePress 用最新的 3.7.1 下载地址是:http://cn.wordpress.org/wordpress-3.7.1-zh_CN.zip 我们先建立一个文件夹 /va ...

  7. ubuntu16.04安装不上有道词典的解决办法

    转自:http://www.linuxdiyf.com/linux/21143.html ubuntu16.04安装不上有道词典,提示: le@hu-pc:~/下载$ sudo dpkg -i you ...

  8. spring boot下MultipartHttpServletRequest如何提高上传文件大小的默认值

    前言: 上传下载功能算是一个非常常见的功能,如果使用MultipartHttpServletRequest来做上传功能. 不配置上传大小的话,默认是2M.在有些场景,这个肯定不能满足条件. 上传代码: ...

  9. Contest2073 - 湖南多校对抗赛(2015.04.06)

    Contest2073 - 湖南多校对抗赛(2015.04.06) Problem A: (More) Multiplication Time Limit: 1 Sec  Memory Limit:  ...

随机推荐

  1. html5的web存储

    在html5标准之前,web存储信息需要cookie来完成,但是cookie不适合大量数据存储.因为需要等待服务器响应,所以速度慢/效率低. 本地存储的特点: localstorage是仅存储在用户的 ...

  2. MJRefresh 源码解读 + 使用

    MJRefresh这个刷新控件是一款非常好用的框架,我们在使用一个框架的同时,最好能了解下它的实现原理,不管是根据业务要求在原有的基础上修改代码,还是其他的目的,弄明白作者的思路和代码风格,会受益匪浅 ...

  3. C++随笔:.NET CoreCLR之GC探索(4)

    今天继续来 带大家讲解CoreCLR之GC,首先我们继续看这个GCSample,这篇文章是上一篇文章的继续,如果有不清楚的,还请翻到我写的上一篇随笔.下面我们继续: // Initialize fre ...

  4. 小兔Java教程 - 三分钟学会Java文件上传

    今天群里正好有人问起了Java文件上传的事情,本来这是Java里面的知识点,而我目前最主要的精力还是放在了JS的部分.不过反正也不麻烦,我就专门开一贴来聊聊Java文件上传的基本实现方法吧. 话不多说 ...

  5. Git使用详细教程(二)

    分支 其实在项目clone下来后就有一个分支,叫做master分支.新建分支的步骤:右键项目→Git→Repository...→Branches... master分支应该是最稳定的,开发的时候,建 ...

  6. Ajax.BeginForm方法 参数

    感谢博主 http://www.cnblogs.com/zzgblog/p/5454019.html toyoung 在Asp.Net的MVC中的语法,在Razor页面中使用,替代JQuery的Aja ...

  7. Linux实战教学笔记02:计算机系统硬件核心知识

    标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 互联网企业常见服务器介绍 1.1 互联网公司服务器品牌 - DELL(大多数公司,常用) - HP - IBM(百度在用) 浪潮 联想 航天联 ...

  8. Spring MVC初始化参数绑定

    初始化参数绑定与类型转换很类似,初始化绑定时,主要是参数类型 ---单日期 在处理器类中配置绑定方法  使用@InitBinder注解 在这里首先注册一个用户编辑器 参数一为目标类型   proper ...

  9. JAVA代码验证身份证信息

    java验证身份证信息代码 转自:http://www.blogjava.net/xylz/archive/2011/01/05/342330.html import java.util.Calend ...

  10. 不该活着的SqlHelper和DBHelper

    前言: 还记得刚学ADO.NET的情景么? 还记得当年是怎么从ADO.NET被忽悠到用SqlHelper的么? 话说从入门到走上工作岗位那些年,我们就一直被纯纯地教导或引导,ADO.NET太原始,得封 ...