备注:分析的是OK210开发板自带的uboot_smdkv210,可能有些部分和其他版本不太一样,但是原理都类似。
编译u-boot的步骤 make forlinx_linux_config make首先生成配置文件,然后编译源码,依次看看这些命令都干了些什么事情
配置过程 #forlinx add forlinx_linux_config : unconfig @$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110 linux @echo "TEXT_BASE = 0xcc800000" > $(obj)board/samsung/smdkc110/config.mk 清除上一次配置的文件此目标依赖unconfig目标,因此先调用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 \ $(obj)board/$(VENDOR)/$(BOARD)/config.mk执行的操作主要是删除上一次配置生成的配置文件。
开始配置操作在Makefile中以@开头的命令表示,在命令执行的时候不在终端上打印信息。
$(MKCONFIG)变量在Makefile的101行有定义,如下:
$(@:_config=)这句话的意思是将 forlinx_linux_config的_config用空白代替只剩下forlinx_linux,
其中$(srcfiles:xxx=ccc)是Makefile的规则,用等号后边的ccc替代srcfiles中等号前边的xxx,
$(@) = $@ 代表目标,即在命令行输入的make forlinx_linux_config中的forlinx_linux_config。
因此@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110 linux
的意思就是调用u-boot根目录的mkconfig脚本并将 forlinx_linux arm s5pc11x smdkc110 samsung s5pc110 linux作为参数传递给脚本。
在文件的头部的注释已经交代了文件的作用和调用的格式
# Script to create header files and links to configure # U-Boot for a specific board. # # Parameters: Target Architecture CPU Board [VENDOR] [SOC] #即
$0 = mkconfig (脚本文件名) $1 = Target (目标) forlinx_linux $2 = Architecture (架构) arm $3 = CPU (CPU型号)s5pc11x $4 = Board (开发板名)smdkc110 $5 = VENDOR (生产商)samsung $6 = SOC (芯片名)s5pc110最后一个linux是OK210的工程师自己添加的用于区别Android版本的内核和linux的内核,没有什么实质用途。(个人猜测)
APPEND=no # Default: Create new config file BOARD_NAME="" # Name to print in make output while [ $# -gt 0 ] ; do case "$1" in --) shift ; break ;; -a) shift ; APPEND=yes ;; -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; *) break ;; esac done接下来定义了两个变量为后边配置过程做准备,用途注释已经写的很清楚,APPEND=no是表示需要重新创建配置文件的标志。
再然后循环:如果参数个数大于零就执行循环,然后再循环里判断第一个参数(脚本可以有参数选项),很明显都不符合,所以直接跳出循环。
将BOARD_NAME赋值为forlinx_linux,然后判断参数个数,小于4大于7(一般情况为大于6应该还是OK210的工程师修改了)就直接退出脚本,放弃执行。
创建软连接接下来创建很多链接文件,这些操作是mkconfig脚本的主要工作,主要创建的链接文件如下:
if [ "$SRCTREE" != "$OBJTREE" ] ; then mkdir -p ${OBJTREE}/include mkdir -p ${OBJTREE}/include2 cd ${OBJTREE}/include2 rm -f asm ln -s ${SRCTREE}/include/asm-$2 asm LNPREFIX="../../include2/asm/" cd ../include rm -rf asm-$2 rm -f asm mkdir asm-$2 ln -s asm-$2 asm else cd ./include rm -f asm ln -s asm-$2 asm fi