您的位置:首页 > 其它

u-boot之mkconfig分析

2017-01-08 20:37 411 查看
编译u-boot的过程,就是make xxx_config和make两步执行过程如下:

以make smdk2410_config为例:

(一)

make  smdk4412_config指令在Makefile找到

%_config::        unconfig

     @$(MKCONFIG) -A $(@:_config=)

但是发现

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

清除上次产生的*.Mk,*.h等文件

 

@$(MKCONFIG) -A $(@:_config=)   

$(MKCONFIG)为当前目录

$(@:_config=)表示保留去除_config后的字符串,即是smdk4412,

将两个参数(A  smdk4412)传入mkconfig中,并执行该文件。

 

(二)

if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then

        # Automatic mode

        line=`egrep -i"^[[:space:]]*${2}[[:space:]]" boards.cfg` || {

                  echo "make:*** No rule to make target \`$2_config'. Stop." >&2

                  exit 1

        }

        set ${line}

        # add default board name ifneeded

        [ $# = 3 ] && set${line} ${1}

 

表示有两个参数,如果第一个参数是-A,就执行then语句,即在boards.cfg寻找第二个参数,如果没找到则打印"make: *** No rule tomake target \`$2_config'.  Stop."

smdk4412   arm   armv7   smdk4212   samsung  exynos

$1         $2    $3      $4         $5       $6

 

(三)
while [ $# -gt 0 ] ; do     //-gt表示“>”

         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

 

表示参数大衣0个(参数从boards.cfg读取),且第一个参数为case in语句列表里的,执行相应的操作。

 
(四)
[ $# -lt 4 ] && exit 1
[ $# -gt 7 ] && exit 1
如果参数小于4个或大于7个就退出。
 
(五)
CONFIG_NAME="${1%_config}"     //将第一个值传给CONFIG_NAME=smdk4412
[ "${BOARD_NAME}" ] ||BOARD_NAME="${1%_config}"
arch="$2"                      //第二个参数赋值给arch
cpu=”$3”                       //第三个参数赋值给cpu
if [ "$4" = "-" ] ; then
         board=${BOARD_NAME}
else
         board="$4"
fi               //如果第四个参数为“-“,即board为第四个参数
 
(六)
[ $# -gt 4 ] && [ "$5" != "-" ]&& vendor="$5" //如果第五个参数不等于“-“,则赋值$5。
[ $# -gt 5 ] && [ "$6" != "-" ]&& soc="$6"    //如果第六个参数不等于“-“,则赋值$6。
[ $# -gt 6 ] && [ "$7" != "-" ]&& {            //如果第七个参数不等于“-“,则执行如下。
         tmp="${7%:*}"
         if ["$tmp" ] ; then
                   CONFIG_NAME="$tmp"
         fi
         # Check if we onlyhave a colon...
         if ["${tmp}" != "$7" ] ; then
                   options=${7#*:}
                   TARGETS="`echo${options} | sed 's:,: :g'` ${TARGETS}"
         fi
}
if [ "${ARCH}" -a "${ARCH}" !="${arch}" ]; then//-a表示与逻辑,ARCH存在则检测ARCH、arch是否匹配
         echo"Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}"1>&2
         exit 1
fi
if [ "$options" ] ; then            //我们并没定义options,因此配置成功
         echo"Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options:${options}"
else
         echo"Configuring for ${BOARD_NAME} board..."
fi
(七)
if [ "$SRCTREE" != "$OBJTREE" ] ; then
// SRCTREE和OBJTREE都是当前目录,则执行else
         mkdir -p${OBJTREE}/include
         mkdir -p${OBJTREE}/include2
         cd${OBJTREE}/include2
         rm -f asm
         ln -s${SRCTREE}/arch/${arch}/include/asm asm
         LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/
         cd ../include
         mkdir -p asm
else
         cd ./include               
 //进入include目录(后面的文件都进入这个文档)
         rm -f asm                
  //删除asm链接
         ln -s../arch/${arch}/include/asm asm //建立软链接,指向/arch/arm/inlcue/asm
fi
rm -f asm/arch                     
//删除include目录下的asm下的arch链接文件
if [ -z "${soc}" ] ; then   //此处不为空soc=exynos),并新建asm/arch目录,让他指向arch-exynos目录
         ln -s ${LNPREFIX}arch-${cpu}asm/arch
else
         ln -s${LNPREFIX}arch-${soc} asm/arch //建立链接
fi
if [ "${arch}" = "arm" ] ; then //删除现有的asm/proc目录,并新建asm/proc目录,指向proc-armv目录
         rm -f asm/proc
         ln -s${LNPREFIX}proc-armv asm/proc  //建立链接
fi
(八)
( echo "ARCH   =${arch}" 
    if [ ! -z"$spl_cpu" ] ; then         //如果$spl_cpu"长度不为真,则
         echo 'ifeq($(CONFIG_SPL_BUILD),y)'
         echo"CPU    = ${spl_cpu}"
         echo"else"
         echo"CPU    = ${cpu}"
         echo"endif"
    else
         echo"CPU    = ${cpu}"
    fi
    echo"BOARD  = ${board}"
 
    ["${vendor}" ] && echo "VENDOR = ${vendor}"
    ["${soc}"    ] && echo"SOC    = ${soc}"
exit 0 ) > config.mk        //
将上述打印写入config.mk

if [ -z "${vendor}" ] ; then   //为vendor变量不为空,所以执行else 
   BOARDDIR=${board}
else
   BOARDDIR=${vendor}/${board}
fi
(九)
//在文件的最开头可以看到APPEND为no,所以这里我们在include文件夹下建立config.h文件
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           
               //我们TARGETS为空,上面不执行了 
         i="`echo${i} | sed '/=/ {s/=/     /;q; } ; { s/$/      1/; }'`"
         echo"#define CONFIG_${i}" >>config.h ;
done
echo "#define CONFIG_SYS_ARCH  \"${arch}\""  >> config.h
echo "#define CONFIG_SYS_CPU   \"${cpu}\""   >> config.h
echo "#define CONFIG_SYS_BOARD\"${board}\"" >> config.h
[ "${vendor}" ] && echo "#defineCONFIG_SYS_VENDOR \"${vendor}\"" >> config.h
[ "${soc}"   ] && echo "#define CONFIG_SYS_SOC    \"${soc}\""    >> config.h
cat << EOF >> config.h      // cat << EOF>> config.h 表示将如下内容追加到config.h中,直到出现EOF为止,
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/${CONFIG_NAME}.h>
#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>
EOF
 
exit 0      //退出
###################################################### 
#生成config.h文件如下: 
#  /* Automatically generated - do not edit */ 
#  #define CONFIG_SYS_ARCH "arm" 
#  #define CONFIG_SYS_CPU  "arm920t" 
#  #define CONFIG_SYS_BOARD "smdk2410" 
#  #define CONFIG_SYS_VENDOR "samsung" 
#  #define CONFIG_SYS_SOC   "s3c24x0" 
#   #define CONFIG_BOARDDIRboard/samsung/smdk2410 
#  #include <config_cmd_defaults.h> 
#  #include <config_defaults.h> 
#  #include <configs/smdk2410.h> 
#  #include <asm/config.h> 
#  #include <config_fallbacks.h> 
##################################################### 
 
总结:
make smdk2410_config 的工作如下:

1.include/asm    -->     arch/arm/include/arm
2.include/asm/arch  --> arch-s3c24x0
3.include/asm/proc  --> proc-armv
4.在include目录下新建了config.mk文件,文件内容是ARCH CPU BOARD VENDOR SOC的定义 
5.在include目录下新建了config.h文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: