以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例
[uboot] uboot流程系列:
[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)
建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例子了解一下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运行位置,功能。
=================================================================================
一、uboot-spl编译和生成文件
spl的编译是编译uboot的一部分,和uboot.bin走的是两条编译流程,这个要重点注意。
正常来说,会先编译主体uboot,也就是uboot.bin.再编译uboot-spl,也就是uboot-spl.bin,虽然编译命令是一起的,但是编译流程是分开的。
1、编译方法
在project X项目中,所有镜像,包括uboot、kernel、rootfs都是放在build目录下进行编译的。具体去参考该项目build的Makefile的实现。
假设config已经配置完成,在build编译命令如下:
make uboot
Makefile中对应的命令如下:
BUILD_DIR=$(shell pwd)
OUT_DIR=$(BUILD_DIR)/out
UBOOT_OUT_DIR=$(OUT_DIR)/u-boot
UBOOT_DIR=$(BUILD_DIR)/../u-boot
uboot:
mkdir -p $(UBOOT_OUT_DIR)
make -C $(UBOOT_DIR) CROSS_COMPILE=$(CROSS_COMPILE) KBUILD_OUTPUT=$(UBOOT_OUT_DIR) $(BOARD_NAME)_defconfig
make -C $(UBOOT_DIR) CROSS_COMPILE=$(CROSS_COMPILE) KBUILD_OUTPUT=$(UBOOT_OUT_DIR)
## -C $(UBOOT_DIR) 指定了要在../uboot,也就是uboot的代码根目录下执行make
## CROSS_COMPILE=$(CROSS_COMPILE) 指定了交叉编译器
## KBUILD_OUTPUT=$(UBOOT_OUT_DIR) 指定了最终编译的输出目录是build/out/u-boot.
最终,相当于进入了uboot目录执行了make动作。
也就是说spl的编译是编译uboot的一部分,和uboot.bin走的是两条编译流程,这个要重点注意。
正常来说,会先编译主体uboot,也就是uboot.bin.再编译uboot-spl,也就是uboot-spl.bin,虽然编译命令是一起的,但是编译流程是分开的。
2、生成文件
最终编译完成之后,会在project-x/build/out/u-boot/spl下生成如下文件:
arch common dts include u-boot-spl u-boot-spl.cfg u-boot-spl.map
board drivers fs tiny210-spl.bin u-boot-spl.bin u-boot-spl.lds u-boot-spl-nodtb.bin
其中,arch、common、dts、include、board、drivers、fs是对应代码的编译目录,各个目录下都会生成相应的built.o,是由同目录下的目标文件连接而成。
重点说一下以下几个文件:
文件 | 说明 |
---|---|
u-boot-spl | 初步链接后得到的spl文件 |
u-boot-spl-nodtb.bin | 在u-boot-spl的基础上,经过objcopy去除符号表信息之后的可执行程序 |
u-boot-spl.bin | 在不需要dtb的情况下,直接由u-boot-spl-nodtb.bin复制而来,也就是编译spl的最终目标 |
tiny210-spl.bin | 由s5pv210平台决定,需要在u-boot-spl.bin的基础上加上16B的header用作校验 |
u-boot-spl.lds | spl的连接脚本 |
u-boot-spl.map | 连接之后的符号表文件 |
u-boot-spl.cfg | 由spl配置生成的文件 |
二、uboot-spl编译流程
1、编译整体流程
根据零、2生成的文件说明可知简单流程如下:
(1)各目录下built-in.o的生成