您的位置:首页 > 其它

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

2014-07-20 15:12 351 查看
关于 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。这里只是大致分析了一下代码的走向,并没有详细分析。

具体可以根据代码走向我们下一节一步一步分析代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐