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=)解析:$@表示目标,也就是我们的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 <wd@denx.de>

#


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