uboot的make config操作

来源:互联网 发布:什么是注解java 编辑:程序博客网 时间:2024/05/16 14:21

一种是在boards.cfg里面配置

另外一种是直接写到makefile里面

直接写在MakeFile里面的那种提示需要移植。。所以还是建议使用写在boards.cfg里面的


在boards.cfg里面配置

1 在boards.cfg里面配置新的开发板的数据。主要有

# Target                     ARCH        CPU         Board name          Vendor       SoC         Options
rpi_b                           arm         arm1176     rpi_b                        raspberry bcm2835


2 执行make ARCH=arm CROSS_COMPILE=XXX/XXX/arm-linux-gnu-eabihf-  rpi_b_config

产生配置文件


过程是。

执行 rpi_b_config目标的时候

匹配到

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

unconfig主要是删除前一次配置的config.mk和config.h等文件

然后调用当前目录下的mkconfig脚本来实现配置

$(@:_config=)意思是将_config用等号后面的代替,这里等号后为空。所以就是去掉_config。

make rpi_b_config--->mkconfig  -A rpi_b

另外一种是直接在MakeFile里面编辑xxx_config后面跟这个脚本

比如

@$(MKCONFIG) smdk6400 arm arm1176 smdk6400 samsung s3c64xx

这样直接传递这几个变量。



继续看mkconfig做的操作


//默认创建新的文件

APPEND=no # Default: Create new config file

//板子的名字
BOARD_NAME="" # Name to print in make output

//
TARGETS=""


arch=""
cpu=""
board=""
vendor=""
soc=""
options=""

$#表示参数个数。 mkconfig -A rpi_b

这里的意思是如果参数个数为2 并且第一个参数为-A 
if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then
# Automatic mode

那么去borads.cfg里面根据${2}也就是 rpi_b 寻找匹配的配置行。

如果没有找到。显示错误
line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {
echo "make: *** No rule to make target \`$2_config'.  Stop." >&2
exit 1
}

  解析出来Line为6为那一行的数据个数,一般是6个,有些是7个。分别是

       # Target                     ARCH        CPU         Board name          Vendor       SoC         Options
       通过set {}line}以后 设置了6个参数。原来的参数就没了。
set ${line}

        参数已经变成6个了

# add default board name if needed

        #设置以后。如果参数是三个的话(这里是6个参数。所以不会执行后面的 set ${line} ${1})。
[ $# = 3 ] && set ${line} ${1}


elif [ "${MAKEFLAGS+set}${MAKELEVEL+set}" = "setset" ] ; then
# only warn when using a config target in the Makefile
cat <<-EOF

        如果是从从MakeFile操作得到的配置参数。那么提醒移植到boards.cfg里面。

        后续估计会全部使用boards.cfg来操作
warning: Please migrate to boards.cfg.  Failure to do so will
        mean removal of your board in the next release.


EOF
sleep 5
fi


参数1-6分别是rpi_b arm arm1176 rpi_b raspberrypi bcm2835

参数0是脚本自己的名字



while [ $# -gt 0 ] ; do

       如果参数1是 -- -a -n -t 分别执行对应的赋值操作,否则直接break。shift就是把参数移一位,原来的参数2变成参数1,参数1就不要了。

      由于这里第一个参数是rpi_b。所以执行最后的* break操作

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

如果参数小于4个,或者参数大于7个。退出
[ $# -lt 4 ] && exit 1
[ $# -gt 7 ] && exit 1




# Strip all options and/or _config suffixes

将xxx_config的xxx赋值给CONFIG_NAME,那么这里CONFIG_NAME=rpi_b
CONFIG_NAME="${1%_config}"


如果"${BOARD_NAME}"为NULL那么BOARD_NAME=rpi_b.跟前面的一样
[ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}"

架构arch=参数2.这里就是arm
arch="$2"


如果有其他的CPU那么cpu=前一个。spl_cpu=后一个

比如 armv7:arm623el中间用冒号分割

cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $1}'`
spl_cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $2}'`

这里只有

cpu=arm1176

spl_cpu=空




if [ "$4" = "-" ] ; then
board=${BOARD_NAME}
else
board="$4"
fi

如果参数4是-那么 board=$BOARD_NAME=rpi_b,否则board=参数4=还是rpi_b



[ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5"
[ $# -gt 5 ] && [ "$6" != "-" ] && soc="$6"

如果参数5 和6 不为空并且不为- 那么分别赋值vendor=$5 soc=$6 这里vendor=raspberrypi soc=bcm2835


如果还有第七个参数并且不为- 这里没有第七个参数。那么就不看了。到时候需要再分析
[ $# -gt 6 ] && [ "$7" != "-" ] && {
# check if we have a board config name in the options field
# the options field mave have a board config name and a list
# of options, both separated by a colon (':'); the options are
# separated by commas (',').
#
# Check for board name
tmp="${7%:*}"
if [ "$tmp" ] ; then
CONFIG_NAME="$tmp"
fi
# Check if we only have a colon...
if [ "${tmp}" != "$7" ] ; then
options=${7#*:}
TARGETS="`echo ${options} | sed 's:,: :g'` ${TARGETS}"
fi
}


如果make ARCH=xxx  这里的xxx和前面赋值的arch不匹配,错误退出。我们make的时候ARCH=arm。$arch也是arm,这样才正确。
if [ "${ARCH}" -a "${ARCH}" != "${arch}" ]; then
echo "Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}" 1>&2
exit 1
fi


这里没有第7个参数options,所以输出 Configuring for rpi_b borad...
if [ "$options" ] ; then
echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}"
else
echo "Configuring for ${BOARD_NAME} board..."
fi


#
# Create link to architecture specific headers
#

如果源码树和构建树不在同一个目录。我们的源码树和构建目录是在同一个目录的。所以进入else部分

if [ "$SRCTREE" != "$OBJTREE" ] ; then
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

       进入include目录
cd ./include

        删除asm链接
rm -f asm

        将../arch/$arch/include/asm 链接到asm。

        这里就是./include目录里面的asm指向 arch/arm/include/asm
ln -s ../arch/${arch}/include/asm asm
fi

这里前面已经进入了include目录,后续的操作都是在include目录里面


删除 asm下面的arch(也是一个软链接)
rm -f asm/arch


如果存在soc。那么链接 arch-$soc到asm/arch

否则链接 arch-$cpu 到asm/arch

这里我们soc是bcm2835

所以链接arch-bcm2835到asm/arch

if [ -z "${soc}" ] ; then
ln -s ${LNPREFIX}arch-${cpu} asm/arch
else
ln -s ${LNPREFIX}arch-${soc} asm/arch
fi



如果架构是arm。删除asm/proc。将proc-armv链接到 asm/proc

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



CONFIG_SPL_BUILD是另一个配置。(没有splcpu的话就不会有下面的。我们这里是没有的。但是还是标记稍微解释一下)

uboot分为

BL0, BL1, BL2

BL0是romcode

BL1是spl  通过CONFIG_SPL_BUILD来确定。

BL2是狭义uboot

这里先标记。后续再看怎么解释


#
# Create include file for Make
#
( echo "ARCH   = ${arch}"
    if [ ! -z "$spl_cpu" ] ; then
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


将ARCH=arm

CPU=arm1176

BOARD=rpi_b

VENDOR="raspberrypi"

SOC=bcm2835

写入config.mk




# Assign board directory to BOARDIR variable
if [ -z "${vendor}" ] ; then
    BOARDDIR=${board}
else
    BOARDDIR=${vendor}/${board}
fi

在uboot源码的board目录下
如果有厂商名字。那么BOARDDIR=${vendor}/${board}。这里就是raspberrypi/rpi_b

如果没有的话那么就直接是 ${board}



#
# Create board specific header file
#

创建板子指定的头文件

如果是append,那么就append到config.h里面

由于我们不是append。所以就是创建一个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

由于targets为NULL。所以循环不执行
for i in ${TARGETS} ; do
i="`echo ${i} | sed '/=/ {s/=//;q; } ; { s/$/1/; }'`"
echo "#define CONFIG_${i}" >>config.h ;
done


将这些定义变量写入config.h
echo "#define CONFIG_SYS_ARCH  \"${arch}\""  >> config.h
echo "#define CONFIG_SYS_CPU   \"${cpu}\""   >> config.h
echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h


如果厂商和soc都存在的话。也写入
[ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h
[ "${soc}"    ] && echo "#define CONFIG_SYS_SOC    \"${soc}\""    >> config.h


追加以下内容
cat << EOF >> config.h


这里board/$BOARDDIR 是board/raspberry/rpi

#define CONFIG_BOARDDIR board/$BOARDDIR


#include <config_cmd_defaults.h>
#include <config_defaults.h>


//这里 configs/${CONFIG_NAME}.h 是configs/rpi_b.h
#include <configs/${CONFIG_NAME}.h>


#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>
EOF

退出。
exit 0


主要是

1 写入了config.mk

ARCH   = arm
CPU    = arm1176
BOARD  = rpi_b
VENDOR = raspberrypi
SOC    = bcm2835



2 写入了config.h

/* Automatically generated - do not edit */
#define CONFIG_SYS_ARCH  "arm"
#define CONFIG_SYS_CPU   "arm1176"
#define CONFIG_SYS_BOARD "rpi_b"
#define CONFIG_SYS_VENDOR "raspberrypi"
#define CONFIG_SYS_SOC    "bcm2835"
#define CONFIG_BOARDDIR board/raspberrypi/rpi_b
#include <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/rpi_b.h>
#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>

2 建立了一些软链接

/arch/arm/include/asm-->include/asm

/arch/arm/include/asm/arch-bcm2835--->include/include/asm/arch

/arch/arm/include/asm/proc-armv--->include/include/asm/proc





0 0
原创粉丝点击