简介
通过阅读讯为提供的使用手册,我们可以知道三星Exynos4412的Uboot的编译是通过调用build_uboot.sh来实现的,这个脚本文件通过传入参数的不同来生成不同内存大小、emmc大小的核心板的uboot.bin二进制文件,例如:SCP封装2GDDR内存的核心板的编译命令为
./build_uboot.sh SCP_2GDDR
所以我们就以它为起点来分析Uboot的编译过程
本篇文章将着重分析三个文件:build_uboot.sh、mkconfig、Makefile
build_uboot.sh分析
这个Uboot编译脚本是三星4412特有的,它其实是三星中国研究所为自己的4412开发板TC4写的,在TC4的Uboot文件夹中可以找到,讯为对它进行了修改,适配了自己的开发板,这个脚本完成了Uboot的配置、编译、清理和二进制文件打包的工作,可以让我们方便的生成.bin文件
对它的分析我以流程图的形式给出:
所以总结来说,build_uboot.sh这个脚本主要做了三个工作:
- 根据传入的参数进行make config
- make all 编译uboot镜像
- 将多个二进制文件合并成最终的uboot镜像(这是4412的启动分层机制决定,BL1+BL2+uboot+TZSW)
关于make config的部分
在上面的build_uboot.sh脚本中执行了如下的指令
make itop_4412_android_config_scp_2GDDR
我们先查看下Makefile可以找到如下的语句
itop_4412_android_config_scp_2GDDR: unconfig
@$(MKCONFIG) $(@:_config=) arm arm_cortexa9 smdkc210 samsung s5pc210 SCP_2GDDR
unconfig的规则是删除了许多的配置文件
unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp \
$(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep
$(MKCONFIG)是执行mkconfig,MKCONFIG被定义为当前文件夹下的mkconfig文件
SRCTREE := $(CURDIR)
MKCONFIG := $(SRCTREE)/mkconfig
(@:_config=)等于把目标文件名称_config替换成“”,即itop_4412_android_config_scp_2GDDR
mkconfig分析
通过上述对build_uboot.sh中make config的分析我们可以得出最后调用mkconfig的语句为
mkconfig itop_4412_android arm arm_cortexa9 smdkc210 samsung s5pc210
对mkconfig的分析见如下的流程图:
Makefile分析
Uboot原本的Makefile的代码是相当多的(有3800多行),但是其中大部分的代码是与我们的4412使用的Uboot无关的,比如给各种架构的芯片的配置之类的,所以我分析的是讯为经过裁剪的删掉没用的部分的Makefile,有600行左右
分析流程图如下: