x210:uboot和系统移植扩展--uboot启动第一阶段

从u-boot.lds中ENTRY所指定处可以看出,整个uboot程序的起始就是_start处。

不简单的头文件包含

(1)#include 。config.h是在include目录下的,这个文件不是源码中本身存在的文件,而是配置过程中自动生成的文件(参考uboot配置和编译过程详解章节,该文件中的内容为 #include )。可见start.S中包含的第一个头文件就是:include/configs/x210_sd.h,这个文件是整个uboot移植时的配置文件。这里面是好多宏。

(2)#include 。include/version.h中包含了include/version_autogenerated.h,这个头文件就是配置过程中自动生成的(参考uboot配置和编译过程详解章节,该文件中的内容为 #define U_BOOT_VERSION "U-Boot 1.3.4" )。这里面定义的宏U_BOOT_VERSION的值是一个字符串,字符串中的版本号信息来自于Makefile中的配置值。这个宏在程序中会被调用,在uboot启动过程中会串口打印出uboot的版本号,那个版本号信息就是从这来的。

(3)#include 。实际文件是:include/asm-arm/proc-armv/domain.h(参考uboot配置和编译过程详解章节中mkconfig脚本中创建符号链接部分)。这样的设计主要是为了可移植性,因为如果直接包含,则start.S文件和CPU架构(和硬件)有关了,可移植性就差了。使用符号链接之后再更改cpu等信息时就不用直接更改start.S文件,只需要更改配置阶段的值。

启动代码的16字节头部

(1)裸机中讲过,在SD卡启动/Nand启动等整个镜像开头需要16字节的校验头。(mkv210image.c中就是为了计算这个校验头)。我们以前做裸机程序时根本没考虑这16字节校验头,因为:1、如果我们是usb启动直接下载的方式启动的则不需要16字节校验头(irom application note);2、如果是SD卡启动mkv210image.c中会给原镜像前加16字节的校验头。

(2)uboot这里start.S中在开头位置放了16字节的填充占位,这个占位的16字节只是保证正式的image的头部确实有16字节,但是这16字节的内容是不对的,还是需要后面去计算校验和然后重新填充的。 

(3)sd_fusing/C110-EVT1-mkbl1.c文件就是真正计算校验和的源代码

#if defined(CONFIG_EVT1) && !defined(CONFIG_FUSED)
	.word 0x2000
	.word 0x0
	.word 0x0
	.word 0x0
#endif

 

_start

  • 异常向量表的构建

(1)根据ARM裸机中讲到的异常向量表知识,一般情况下异常向量表的地址是从0x0开始的,如果我们的代码也刚好是在0x0开始,那么这里就是我们所设置的异常向量表

(2)但是我们的S5PV210中uboot起始地址并不在0x0地址,并且uboot中并没有找到设置cp15协处理器的c12去重新设置中断向量表的基地址并且此时uboot的虚拟地址映射还没有起作用,所以我认为这里所设置的异常向量表并没有实际用处,除非芯片内部或者iROM代码中有做一些处理,例如修改cp15协处理器

你可能感兴趣的:(嵌入式linux,uboot)