Tiny4412 u-boot分析(1)u-boot配置流程分析


參考Friendlyarm的文檔,編譯uboot的流程為

make tiny4412_config
make

這個過程主要涉及到兩個文件,頂層的Makefile文件和mkconfig文件,makeconfig文件是一個腳本,通過文件的注釋可以了解到它的作用

# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]

意思是,mkconfig 是用來創建頭文件和鏈接腳本,並以此來為特定的開發板配置u-boot的腳本。它的主要參數有

Target  Architecture  CPU  Board [VENDOR] [SOC]

首先來分析頂層的Makefile文件,在Makefile文件中我們可以看到下面的代碼

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

%在Makefile中作為通配符用來通配任意長度的字符,因此當我們執行 make tiny4412_config的時候就會匹配到%_config這條語句。::在Makefile中用來強制執行下面的命令,所以匹配到%_config之后,就會去執行unconfig,unconfig的作用是去除原來的配置信息。然后去執行

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

這條命令,@的作用是用來去除回顯,$(MKCONFIG)在前面被定義為

MKCONFIG    := $(SRCTREE)/mkconfig
SRCTREE    := $(CURDIR)

我們將@去掉,然后執行make tiny4412_config,可以通過回顯看到以下內容

make tiny4412_config
awk '(NF && $1 !~ /^#/) { print $1 ": " $1 "_config; $(MAKE)" }' boards.cfg > .boards.depend
/....../uboot_tiny4412/mkconfig -A tiny4412
Configuring for tiny4412 board...

所以我們執行make tiny4412_config實際上被解析成

/....../uboot_tiny4412/mkconfig -A tiny4412

指定了-A選項,mkconfig腳本會自動去解析boards.cfg文件,找到以下內容

# Target                     ARCH        CPU         Board name          Vendor         SoC         Options
tiny4412                     arm         armv7       tiny4412            samsung        exynos

所以我們最終執行的命令為

./mkconfig  tiny4412   arm  armv7  tiny4412  samsung  exynos

總結一下,mkcongif腳本主要做了以下幾件事

(1)解析boards.cfg tiny4412相關數據

tiny4412                     arm         armv7       tiny4412            samsung        exynos
2)針對平台做了一系列鏈接,創建平台、開發板相關的頭文件的鏈接
#
# 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
    rm -f asm
    ln -s ${SRCTREE}/arch/${arch}/include/asm 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

實際執行的命令為

cd ./include
rm -f asm
ln -s ../arch/arm/include/asm asm
ln -s arch-exynos asm/arch

(3)創建頂層Makefile包含的文件 include/ config.mk

#
# Create include file for Make
#
echo "ARCH   = ${arch}"  >  config.mk
echo "CPU    = ${cpu}"   >> config.mk
echo "BOARD  = ${board}" >> config.mk
[ "${vendor}" ] && echo "VENDOR = ${vendor}" >> config.mk
[ "${soc}"    ] && echo "SOC    = ${soc}"    >> config.mk
# Assign board directory to BOARDIR variable
if [ -z "${vendor}" ] ; then
    BOARDDIR=${board}
else
    BOARDDIR=${vendor}/${board}
fi

生成的config.mk內容如下

ARCH   = arm 

CPU    = armv7
BOARD  = tiny4412
VENDOR = samsung
SOC    = exynos

(4)創建開發板相關的頭文件inlucde/config.h

#
# 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/=/\t/;q } ; { s/$/\t1/ }'`"
    echo "#define CONFIG_${i}" >>config.h ;
done
cat << EOF >> config.h
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_defaults.h>
#include <configs/${CONFIG_NAME}.h>
#include <asm/config.h>
EOF

生成的include/config.h內容為

/* Automatically generated - do not edit */ 
#define CONFIG_BOARDDIR board/samsung/tiny4412
#include <config_defaults.h>
#include <configs/tiny4412.h>
#include <asm/config.h>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM