tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——移植u-boot-spl.bin(核心初始化)

      关于 u-boot 中的命令的使用,大家可以百度“uboot 命令详解”,或者查看 u-boot 的帮助文档。

      注意:所有修改或添加的代码都标注有“add by shl”或者“modied by shl” ,这样方便查看。

      首先大致分析一下 u-boot 的代码走向,通过看链接脚本 u-boot-2014.04/arch/arm/cpu/u-boot.lds 和u-boot-2014.04/arch/arm/cpu/u-boot-spl.lds  得知,不管是 u-boot.bin 还是 u-boot-spl.bin 都以u-boot。2014.04/arch/arm/cpu/armv7/start.S  开始,同时在链接脚本文件中指定了程序的入口函数ENTRY(_start):


     start.S 首先定义了异常向量表,其实也可以不用,在arm中,一般异常向量表是在0地址处,但sp5v210 在固化的BL0中,已经把异常向量表放在了0xD003_7400处,从这幅图可以看出:


  当然,我猜想u-boot为了代码移植的规范性,也定义了异常向量表,然后执行第 1 条指令,然后跳转到这里:


在这里主要是做了一些初始化工作关闭中断,设置处理器到svc模式:接在往下执行到:


    这里有个判断,如果没有定义 CONFIG_SKIP_LOWLEVEL_INIT 这个宏,则进行一些底层的初始化(不跳过底层初始化) ,其中 cpu_init_crit 又调用了 lowlevel_init,这个函数在u-boot-2014.04/board/samsung/smdkv210/lowlevel_init.S 中定义,我们可以在里面进行时钟、内存等底层的初始化。然后跳转到函数_main,这个函数在 u-boot-2014.04/arch/arm/lib/crt0.S 中定义,crt 即 C Run-time :


ENTRY(_main)展开即为:
           .globl _main;
            ALIGN;
            _main:

接着调用函数 board_init_f,这个函数在 u-boot-2014.04/arch/arm/lib/board.c 中定义, 进行一些基本的硬件初始化,为进入 DRAM 内存运行做准备,然后继续往下执行:



这里调用 relocate_code,重定位,将 u-boot 搬运到 DRAM 内存。



这里执行清 BSS 操作,然后把函数 board_init_r 的链接地址赋给 PC 指针,直接跳转到 DRAM 内存运行,在 board_init_r 继续执行一些硬件初始化,最终执行到这里:


       main_loop 在 u-boot-2014.04/vi common/main.c 中定义, 在 main_loop 中会检测用户的输入,如果在指定的延时时间内,没有用户按下按钮,则根据环境变量,从 SD 卡或 FLASH 拷贝内核镜像到 DRAM,然后跳转到 OS 起始地址执行 OS。这里只是大致分析了一下代码的走向,并没有详细分析。

     具体可以根据代码走向我们下一节一步一步分析代码。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值