uboot 2013.01 代码简析(1)开发板配置

时间:2023-03-09 02:03:01
uboot 2013.01 代码简析(1)开发板配置

u-boot下载地址:ftp://ftp.denx.de/pub/u-boot/u-boot-2013.01.01.tar.bz2

下载之后对该文件进行解压。

我试着分析smdk2410_config对应的代码执行流程,接触u-boot时间较短,有不周之处还请见谅。

通常执行u-boot第一步就是进行开发板的配置,而smdk2410的配置命令如下:

make smdk2410_config

而Makefile中对应内容如下:

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

因为Makefile是先执行后面的目标再执行其后的命令,所以会执行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目标会把以前配置产生的文件先删除掉。

$(MKCONFIG)对应mkconfig文件

当配置参数是smdk2410时,$(@:_config=)的值为smdk2410

所以相当于执行下面的内容:

mkconfig -A smdk2410

mkconfig文件内容如下:

     1    #!/bin/sh -e

         # Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
#
# (C) - DENX Software Engineering, Wolfgang Denk <wd@denx.de>
# APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
TARGETS="" arch=""
cpu=""
board=""
vendor=""
soc=""
options="" if [ \( $# -eq \) -a \( "$1" = "-A" \) ] ; then
# Automatic mode
line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg` || {
echo "make: *** No rule to make target \`$2_config'. Stop." >&
exit
} set ${line}
# add default board name if needed
[ $# = ] && set ${line} ${}
elif [ "${MAKEFLAGS+set}${MAKELEVEL+set}" = "setset" ] ; then
# only warn when using a config target in the Makefile
cat <<-EOF warning: Please migrate to boards.cfg. Failure to do so will
mean removal of your board in the next release. EOF
sleep
fi while [ $# -gt ] ; 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 [ $# -lt ] && exit
[ $# -gt ] && exit # Strip all options and/or _config suffixes
CONFIG_NAME="${1%_config}" [ "${BOARD_NAME}" ] || BOARD_NAME="${1%_config}" arch="$2"
cpu=`echo $ | awk 'BEGIN {FS = ":"} ; {print $1}'`
spl_cpu=`echo $ | awk 'BEGIN {FS = ":"} ; {print $2}'`
if [ "$4" = "-" ] ; then
board=${BOARD_NAME}
else
board="$4"
fi
[ $# -gt ] && [ "$5" != "-" ] && vendor="$5"
[ $# -gt ] && [ "$6" != "-" ] && soc="$6"
[ $# -gt ] && [ "$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=${#*:}
TARGETS="`echo ${options} | sed 's:,: :g'` ${TARGETS}"
fi
} if [ "${ARCH}" -a "${ARCH}" != "${arch}" ]; then
echo "Failed: \$ARCH=${ARCH}, should be '${arch}' for ${BOARD_NAME}" >&
exit
fi 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
#
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
cd ./include
rm -f asm
ln -s ../arch/${arch}/include/asm asm
fi rm -f asm/arch if [ -z "${soc}" ] ; then
ln -s ${LNPREFIX}arch-${cpu} asm/arch
else
ln -s ${LNPREFIX}arch-${soc} asm/arch
fi if [ "${arch}" = "arm" ] ; then
rm -f asm/proc
ln -s ${LNPREFIX}proc-armv asm/proc
fi #
# 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 ) > config.mk # Assign board directory to BOARDIR variable
if [ -z "${vendor}" ] ; then
BOARDDIR=${board}
else
BOARDDIR=${vendor}/${board}
fi #
# 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
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 "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h [ "${soc}" ] && echo "#define CONFIG_SYS_SOC \"${soc}\"" >> config.h cat << EOF >> config.h
#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

其中24行从boards.cfg中查找包含smdk2410并其后紧跟空格的行,从而可以得到:

line = smdk2410 arm arm920t - samsung s3c24x0

后续内容就是创建一些文件夹链接。

之后根据line提取出arch,cpu,board,vendor,soc,并写入到include/config.mk中,include/config.mk内容如下:

         ARCH   = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = samsung
SOC = s3c24x0

然后将配置写入到include/config.h中,include/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_BOARDDIR board/samsung/smdk2410
#include <config_cmd_defaults.h>
#include <config_defaults.h>
#include <configs/smdk2410.h>
#include <asm/config.h>
#include <config_fallbacks.h>
#include <config_uncmd_spl.h>

这样整个配置部分就基本完成了