天天看點

u-boot-2012.10分析一配置過程

難得五一沒啥安排,閑的無聊,開始移植u-boot-2012.10,與大家分享哈。首先分析u-boot-2012.10,看它與以前的u-boot-1.1.6有啥不同,分析u-boot建Source Insight工程不再詳述。這裡以TQ2440為例,配置過程分析,從Makefile開始。

一·、分析u-boot根目錄下的Makefile

往往在編譯u-boot之前,會配置相應單闆。eg:make smdk2410_config,打開Makefile,找不到smdk2410_config,隻看到746:smdk6400_config。

[email protected]:~$ cd Si/TQ2440/u-boot-2012.10/

[email protected]:~/Si/TQ2440/u-boot-2012.10$ ls

api    boards.cfg  COPYING  doc      examples  lib          Makefile  net     rules.mk         test

arch   common      CREDITS  drivers  fs        MAINTAINERS  mkconfig  post    snapshot.commit  tools

board  config.mk   disk     dts      include   MAKEALL      nand_spl  README  spl

[email protected]:~/Si/TQ2440/u-boot-2012.10$ grep "smdk2410" * -nR

arch/arm/include/asm/mach-types.h:1646:# define machine_is_smdk2410()   (machine_arch_type == MACH_TYPE_SMDK2410)

arch/arm/include/asm/mach-types.h:1648:# define machine_is_smdk2410()   (0)

board/samsung/smdk2410/Makefile:28:COBJS        := smdk2410.o

boards.cfg:72:smdk2410                     arm         arm920t     -                   samsung        s3c24x0

MAINTAINERS:771:        smdk2410        ARM920T

找到了,在根目錄下的board.cfg,還是回到Makefile找boards.cfg:718

sinclude $(obj).boards.depend

$(obj).boards.depend: boards.cfg

@awk '(NF && $$1 !~ /^#/) { print $$1 ": " $$1 "_config; $$(MAKE)" }' $< > [email protected]

.boards.depend是個隐藏檔案,在根目錄下ctrl + h,配置之前沒有,配置後就生成了.boards.depend30:smdk:smdk2410_config;$(MAKE)。這裡應該是讀取根目錄下的boards.cfg,生成單闆相關依賴檔案.boards.depend。

根據這些線索開始分析:

[email protected]:~/Si/TQ2440/u-boot-2012.10$ make smdk2410_config 

Configuring for smdk2410 board...

/Makefile:715

%_config:: unconfig

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

%_config:: unconfig,其中%是通配符,會執行MKCONFIG。在Makefile113:MKCONFIG:= $(SRCTREE)/mkconfig,及執行根目錄下的mkconfig。 $(:_config=)等于空相當于沒有, make smdk2410_config 相當于執行mkconfig -A smdk2410,即開始執行根目錄下的mkconfig

二、分析u-boot根目錄下的mkconfig

mkconfig -A smdk2410 //$1=-A$2=smdk2410

if [ \( $# -eq 2 \) -a \( "$1" = "-A" \) ] ; then//滿足條件

line=`egrep -i "^[[:space:]]*${2}[[:space:]]" boards.cfg`//在boards.cfg中grep smdk2410,知道boards.cfg确實有單闆smdk2410,下面echo不會執行

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

set ${line} //在這裡設定參數,可以做個試驗在這加幾個列印語句echo $1;echo $2;echo $3;echo $4;echo $5;echo $6

[email protected]:~/Si/TQ2440/u-boot-2012.10$ make smdk2410_config 

smdk2410

arm

arm920t

-

samsung

s3c24x0

Configuring for smdk2410 board...

OK現在參數明确了$1=smdk2410,$2=arm,$3=arm920t,$4=NULL,$5=samsung,$6=s3c24x0,接着分析配置,就跟以前的u-boot差不多了,我直接把執行的語句列出

CONFIG_NAME="${1%_config}" //CONFIG_NAME=smdk2410_config

arch="$2" //arch=arm

cpu=`echo $3...‘ //cpu=arm920t

if [ "$4" = "-" ] ; then

board=${BOARD_NAME}//board=smdk2410

[ $# -gt 5 ] && [ "$6" != "-" ] && soc="$6" //soc=s3c24x0

echo "Configuring for ${BOARD_NAME} board..." //對于配置輸出的Configuring for smdk2410 board...

# Create link to architecture specific headers

cd ./include

rm -f asm

ln -s ../arch/${arch}/include/asm asm

rm -f asm/arch

ln -s ${LNPREFIX}arch-${cpu} asm/arch

if [ "${arch}" = "arm" ] ; then

rm -f asm/proc

ln -s ${LNPREFIX}proc-armv asm/proc

# 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}" //CPU=arm920t

    fi

    echo "BOARD  = ${board}"

    [ "${vendor}" ] && echo "VENDOR = ${vendor}"

    [ "${soc}"    ] && echo "SOC    = ${soc}"

    exit 0 ) > config.mk //将上面資訊建立到/include/config.mk,可以看到如下:

[email protected]:~/Si/TQ2440/u-boot-2012.10/include$ cat config.mk 

ARCH   = arm

CPU    = arm920t

BOARD  = smdk2410

VENDOR = samsung

SOC    = s3c24x0

# Create board specific header file

if [ "$APPEND" = "yes" ] # Append to existing config file

then

echo >> config.h

else

> config.h # Create new config file //APPEND" = no,建立/include/config.h

fi

echo "" >>config.h//加内容到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 //加内容到config.h:#define CONFIG_SYS_ARCH  "arm"下面也是如此

echo "#define CONFIG_SYS_CPU   \"${cpu}\""   >> config.h//#define CONFIG_SYS_CPU   "arm920t"

echo "#define CONFIG_SYS_BOARD \"${board}\"" >> config.h//#define CONFIG_SYS_BOARD "smdk2410"

[ "${vendor}" ] && echo "#define CONFIG_SYS_VENDOR \"${vendor}\"" >> config.h//#define CONFIG_SYS_VENDOR "samsung"

[ "${soc}"    ] && echo "#define CONFIG_SYS_SOC    \"${soc}\""    >> config.h//#define CONFIG_SYS_SOC    "s3c24x0"

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

#define CONFIG_BOARDDIR board/$BOARDDIR //#define CONFIG_BOARDDIR board/samsung/smdk2410

#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

分析結果:

1.讀取boards.cfg,生成單闆相關依賴檔案.boards.depend

2.mkconfig -A smdk2410,執行根目錄下mkconfig,在boards.cfg中搜尋單闆

3.在/include目錄下生成config.mk、config.h,内容如下:

[email protected]:~/Si/TQ2440/u-boot-2012.10$ cat include/config.mk

ARCH   = arm

CPU    = arm920t

BOARD  = smdk2410

VENDOR = samsung

SOC    = s3c24x0

[email protected]:~/Si/TQ2440/u-boot-2012.10$ cat include/config.h

#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>

[email protected]:~/Si/TQ2440/u-boot-2012.10$

花了不少時間,配置過程總算分析完成。編譯過程以後再分析吧,分析這些東東太累了,比移植u-boot還要累。

繼續閱讀