uboot移植(二)——uboot mkconfig 脚本分析
一:mkconfig脚本的作用
mkconfig是通过传入的参数来脚本用于某个开发板配置uboot,主要是通过判断其输入的参数来创建符号链接文件,使它们指向该开发板对应的配置文件来进行配置。
(1)配置CPU架构相关的文件:在include目录下创建asm文件,指向include/asm-arm
(2)配置SOC类型相关的文件:include目录下创建regs.h文件,指向include/s5pc110.h
include/asm-arm目录下创建arch文件,指向include/arch-s5pc11x
(3)其他:include/asm-arm目录下创建proc文件,指向include/asm-arm/proc-armv,这个文件夹中存放了四个.h文件,具体作用还不清楚;
创建config.mk文件,文件的内容也是根据我们的输入参数来确定的。这个文件在我们的主Makefile中也有提到。
二:具体代码分析(红色的为注释)
#!/bin/sh -e
x210_sd_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
主Makefile中调用mkconfig这个脚本,同时传进来了6个参数
$1=$(@:_config=)
$(@:_config=)解析:[email protected]表示目标,也就是我们的x210_sd_config ,:表示要对这个目标进行处理,处理方法就是x210_sd_config 里面的_config用空替代,得到x210_sd,所以
$1=x210_sd
$2=arm
$3=s5pc11x
$4= x210
$5= samsung
$6=s5pc110
所以$#=6
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
#
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <[email protected]>
#
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
while [ $# -gt 0 ] ; do #while($#>0)
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;; *万能匹配符,我们这里的$=x210_sd,和-- -a -n 不匹配,所以和*匹配,执行break跳出while循环,注意case是没有break的
esac
done
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" 简略的if语句,先执行第一个,如果成立,则不执行第二个
这个BOARD_NAME为空,if语句不成立,执行后面的BOARD_NAME="$1" ,执行完后BOARD_NAME= x210_sd
[ $# -lt 4 ] && exit 1 如果$#小于4,mkconfig脚本返回1
[ $# -gt 6 ] && exit 1 如果$#<6,mkconfig脚本也返回1
所以,$#的值为4 5 6 ,如果是其他值,则报错
echo "Configuring for ${BOARD_NAME} board..."
#
# Create link to architecture specific headers 创建一些符号链接文件(开始)
#创建符号链接的目的就是为了让uboot具有可移植性
#uboot可移植性实现的原理:在uboot中有很多的平行代码,各自属于不同的架构/cpu/开发板,当我们确定使用那款CPU/开#发板时,就通过这些创建的符号链接来找到相应的配置文件,进行配置
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 在include目录下创建一个asm文件,指向include/asm-arm
fi
rm -f asm-$2/arch
if [ -z "$6" -o "$6" = "NULL" ] ; then -z:表示判断是否为空 -o:表示逻辑或
#所以这句话的意思是if($6为空,或者$6="NULL")注Makefile中等于是“=”不是“==”
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch在include/asm-arm目录下创建一个arch文件,指向include/asm-arm/arch-s5pc110
fi
# create link for s3c24xx SoC
if [ "$3" = "s3c24xx" ] ; then
rm -f regs.h
ln -s $6.h regs.h
rm -f asm-$2/arch
ln -s arch-$3 asm-$2/arch
fi
# create link for s3c64xx SoC
if [ "$3" = "s3c64xx" ] ; then
rm -f regs.h
ln -s $6.h regs.h
rm -f asm-$2/arch
ln -s arch-$3 asm-$2/arch
fi
# create link for s5pc1xx SoC
if [ "$3" = "s5pc1xx" ] ; then
rm -f regs.h
ln -s $6.h regs.h
rm -f asm-$2/arch
ln -s arch-$3 asm-$2/arch
fi
# create link for s5pc11x SoC 根据不同的SOC创建不同的符号链接
if [ "$3" = "s5pc11x" ] ; then
rm -f regs.h 当前目录是在include下
ln -s $6.h regs.h 在include目录下创建一个regs.h文件,指向include/s5pc110.h
rm -f asm-$2/arch 删除asm-arm/arch文件
ln -s arch-$3 asm-$2/arch 在include/asm-arm目录下创建一个arch文件,指向include/arch-s5pc11x
fi
# create link for s5p64xx SoC
if [ "$3" = "s5p64xx" ] ; then
rm -f regs.h
ln -s $6.h regs.h
rm -f asm-$2/arch
ln -s arch-$3 asm-$2/arch
fi
# create link for s5p644x SoC
if [ "$3" = "s5p644x" ] ; then
rm -f regs.h
ln -s $6.h regs.h
rm -f asm-$2/arch
ln -s arch-$3 asm-$2/arch
fi
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc 在include/asm-arm目录下创建一个proc文件,指向include/asm-
fi arm/proc-armv(存放一些头文件)
# create link for s3c64xx-mp SoC
if [ "$3" = "s3c64xx-mp" ] ; then
rm -f regs.h
ln -s $6.h regs.h
rm -f asm-$2/arch
ln -s arch-$3 asm-$2/arch
fi 创建符号链接结束,这些符号链接的作用就是用来包含头文件,所以将来我们写代码的时候比如 include<asm/xx.h>就要到相应的路径去找相应的文件。
#
# Create include file for Make
#注意我们前面cd include后就没出来过,所以,我们当前还在include目录下,注意在指定文件输出内容的方法,也是写文件的方法:echo "ARCH = $2" > config.mk
# > 表示创建文件 >>表示追加文件(在文件中继续添加内容)
echo "ARCH = $2" > config.mk 创建文件config.mk 并写 "ARCH=arm"
echo "CPU = $3" >> config.mk 追加内容 “CPU=s5pc11x”
echo "BOARD = $4" >> config.mk 追加内容 “BOARD=x210”
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk 追加内容 “VENDOR=samsung”
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk 追加内容“SOC=s5pc110”
#以上这部分就是创建并写内容到我们的config.mk文件中。对于config.mk文件,在我们的主Makefile中提到过,是否还有印象
#
# Create board specific header file
#
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
exit 0