u-boot之mkconfig解析

正常U-Boot的编译流程如下

make itop_4412_android_config_scp_1GDDR
make all

当我们执行第一条指令时,它会到Makefile中找到如下代码,然后执行

itop_4412_android_config_scp_1GDDR:     unconfig
    @$(MKCONFIG) $(@:_config=) arm arm_cortexa9 smdkc210 samsung s5pc210 SCP_1GDDR

其中的依赖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

这个依赖的意思是:在执行下面的指令之前,先去执行unconfig,也就是清除上次执行make itop_4412_android_config_scp_1GDDR 产生的配置文件,然后再回来执行下面的代码,如下所示

@$(MKCONFIG) $(@:_config=) arm arm_cortexa9 smdkc210 samsung s5pc210 SCP_1GDDR

其中$(MKCONFIG)在上面指定为$(SRCTREE)/mkconfig。$(@:_config=)会将传进来的所有参数中的_config清除掉,因此这段代码的最终作用就是,将itop_4412_android_scp_1GDDR和后面的六个参数一起传给U-Boot的顶层目录中的mkconfig

mkconfig是一个配置脚本,用来配置U-Boot,它的主要输入参数有如下几个

Self Target Arch CPU Board [VENDER] [SOC]

分别对应着

  • Self:自己定义的一些信息
  • Target:目标板
  • Arch :芯片架构
  • CPU:芯片内核
  • Board:开发板型号
  • VENDER:芯片供应商
  • SOC:片上系统

下面我们来分析mkconfig这个文件,看看它在接收了七个参数之后到底做了什么事情

# no表示创建新的配置文件,yes表示追加到配置文件中
APPEND=no   # Default: Create new config file
BOARD_NAME=""   # Name to print in make output
TARGETS=""

# 确定板子名称,并将这个名字赋值给BOARD_NAME变量
if   [ "$7" = "SCP_1GDDR" ]  ||   [ "$7" = "SCP_2GDDR" ] || [ "$7" = "POP_1GDDR" ]  ||   [ "$7" = "POP_2GDDR" ]
then 
      BOARD_NAME="itop_4412_android"
      echo "CoreBoard OS is android or linux...... "

elif [ "$7" = "SCP_1GDDR_Ubuntu" ]  ||  [ "$7" = "SCP_2GDDR_Ubuntu" ] || [ "$7" = "POP_1GDDR_Ubuntu" ] ||  [ "$7" = "POP_2GDDR_Ubuntu" ]
then
      BOARD_NAME="itop_4412_ubuntu"
      echo "CoreBoard OS is Ubuntu...... "
else
      echo "unknown coreboard type and os type......"
fi

APPEND用来指示是创建新的配置文件,还是在配置文件后面追加,我们这里选择no,表示创建新的配置文件,下面的就是根据参数7来确定板子名称变量的值

while [ $# -gt 0 ] ; do
    case "$1" in
    --) shift ; break ;;
    -a) shift ; APPEND=yes ;;
#   -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
    -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
    *)  break ;;
    esac
done

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"

# 检查参数合法性
[ $# -lt 4 ] && exit 1
[ $# -gt 7 ] && exit 1

if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
    echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2
    exit 1
fi

echo "Configuring for ${BOARD_NAME} board..."

-gt的是大于的意思,$#用来获取参数个数,由于这里的参数个数是大于0,所以会进入到下面的case语句,但是又因为我们没有传递任何的选项,因此case语句不起作用,也就是while不起作用,最后又给BOARD_NAME进行了一次赋值,其实之前的赋值是U-Boot使用者自己添加的,这里的才是U-Boot源码的名称赋值,紧接着又对参数的合法性进行了检查-lt是小于的意思,也就是说参数的个数必须大于4,小于7。

# Create link to architecture specific headers
#
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

rm -f asm-$2/arch

if [ -z "$6" -o "$6" = "NULL" ] ; then
    ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
    ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi

if [ "$2" = "arm" ] ; then
    rm -f asm-$2/proc
    ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi

这段代码用于创建架构特定的软连接,为了简单起见,我们假设源码树和目标树相同,那么if判断部分会直接执行else部分,也就是

cd ./include
rm -f asm
ln -s asm-$2 asm

这段代码的作用是在include目录下创建一个asm-arm的软连接asm。

下面的代码可以简化成如下几句

rm -f asm-arm/arch
ln -s arch-s5pc210 asm-arm/arch
rm -f asm-arm/proc
ln -s proc-armv asm-arm/proc

到此为止,我们创建了三个软链接

# 建立config.mk,并将$1~$6输入到config.mk文件
#
# Create include file for Make
#
echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

# 指定开发板所在目录
# Assign board directory to BOARDIR variable
if [ -z "$5" -o "$5" = "NULL" ] ; then
    BOARDDIR=$4
else
    BOARDDIR=$5/$4
fi

上面的代码在include文件夹下面建立了config.mk文件,并且在里面写入了一些配置信息,紧接着指定了开发板所在目录

#
# 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

for i in ${TARGETS} ; do
    echo "#define CONFIG_MK_${i} 1" >>config.h ;
done

#add by dg for all itop4412 type boards

[ "$7" ] && [ "$7" != "NULL" ] && echo "#define CONFIG_$7" >> config.h

cat << EOF >> config.h
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_defaults.h>
#include <configs/$BOARD_NAME.h>
#include <asm/config.h>
EOF

这段代码生成了config.h,并且向里面添加了一些内容

来总结一下,mkconfig到底做了哪些事情

  • 生成三个软链接:include/asm-arm/arch、include/asm-arm/proc、include/asm
  • 创建config.mk
  • 创建开发板目录变量:BOARDDIR
  • 创建config.h

猜你喜欢

转载自www.cnblogs.com/YinShijia/p/11988212.html