難得五一沒啥安排,閑的無聊,開始移植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還要累。