u-boot的配置過程詳解:make xxx_config命令過程

一般而言編譯u-boot都需要配置u-boot,比如make xxx_config,那這個過程發生了什麼?

打開u-boot頂層目錄的Makefile,有如下的語句:

tiny6410_config :  unconfig
    @$(MKCONFIG) mini6410 arm s3c64xx mini6410 samsung s3c6410 NAND ram256
第二句轉換一下就是:

#    mkconfig mini6410 arm s3c64xx mini6410 samsung s3c6410 NAND ram256
#                        $1       $2        $3        $4                $5         $6        $7          $8

以下是頂層的mkconfig的內容:

#	mkconfig mini6410 arm s3c64xx mini6410 samsung s3c6410 NAND ram256
#	      	   $1	   $2	$3		$4		$5		$6		$7	  $8

APPEND=no	# Default: Create new config file
BOARD_NAME=""	# Name to print in make output

[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
#	BOARD_NAME=mini6410
#	就是mini6410,即板名字就是mini6410

[ $# -lt 4 ] && exit 1
[ $# -gt 8 ] && exit 1
#	$#表示參數個數,參數個數小於4個大於8個就會退出,顯然不會退出

echo "Configuring for ${BOARD_NAME} board which boot from $7 $8..."

#
# Create link to architecture specific headers
#
if [ "$SRCTREE" != "$OBJTREE" ] ; then
#	根據Makefile知兩者是相等的,下面的就不會執行,直接執行else分支
	mkdir -p ${OBJTREE}/include
	mkdir -p ${OBJTREE}/include2
	cd ${OBJTREE}/include2
	rm -f asm
	ln -s ${SRCTREE}/include/asm-$2 asm
	LNPREFIX="../../include2/asm/"
	cd ../include
	rm -rf asm-$2
	rm -f asm
	mkdir asm-$2
	ln -s asm-$2 asm
else
	cd ./include
	rm -f asm
	ln -s asm-$2 asm
#	進入include目錄
#	建立一個鏈接文件asm,指向asm-arm,臨時生成
#	lrwxrwxrwx  1 root root      7 2019-04-09 20:11 asm -> asm-arm
#	比如想包含某個文件:#include <asm/type.h>
#	如果是arm架構就是:#include <asm-arm/type.h>
fi

rm -f asm-$2/arch
#	刪除該文件

if [ -z "$6" -o "$6" = "NULL" ] ; then
#	如果第六個參數爲空或者爲NULL就執行then的分支
	ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
	ln -s ${LNPREFIX}arch-$6 asm-$2/arch
#	ln -s arch-s3c6410 asm-arm/arch
#	lrwxrwxrwx 1 root root     12 2019-04-09 20:11 arch -> arch-s3c64xx
fi

# create link for s3c24xx SoC
if [ "$3" = "s3c24xx" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

# create link for s3c64xx SoC
if [ "$3" = "s3c64xx" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

if [ "$2" = "arm" ] ; then
	rm -f asm-$2/proc
	ln -s ${LNPREFIX}proc-armv asm-$2/proc
#	ln -s proc-armv asm-arm/proc
#	lrwxrwxrwx 1 root root      9 2019-04-09 20:11 proc -> proc-armv
fi

# create link for s3c64xx-mp SoC
if [ "$3" = "s3c64xx-mp" ] ; then
	rm -f regs.h
	ln -s $6.h regs.h
	rm -f asm-$2/arch
	ln -s arch-$3 asm-$2/arch
fi

#
# Create include file for Make
#	生成配置文件
echo "ARCH   = $2" >  config.mk	# 新建config.mk文件
echo "CPU    = $3" >> config.mk	# 追加到config.mk文件
echo "BOARD  = $4" >> config.mk	# 追加到config.mk文件
#	ARCH  = arm 
#	CPU   = s3c64xx 
#	BOARD = mini6410
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
#	第五個參數存在且不等於NULL就追加到config.mk文件
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk
#	第六個參數存在且不等於NULL就追加到config.mk文件
#	VENDOR = samsung 
#	SOC    = s3c6410
#	在include目錄下cat config.mk結果如下:
#	ARCH   = arm
#	CPU    = s3c64xx
#	BOARD  = mini6410
#	VENDOR = samsung
#	SOC    = s3c6410	與分析結果一致

#
# Create board specific header file
#	創建單板相關的頭文件,在文件開頭有定義:APPEND=no #Default: Create new config file
if [ "$APPEND" = "yes" ]	# Append to existing config file
then
	echo >> config.h
else
	> config.h		# Create new config file,新建一個config.h文件
fi
echo "/* Automatically generated - do not edit */" >>config.h
case $7 in
SD)
	echo "#define FRIENDLYARM_BOOT_MEDIA_SD"   >> config.h
	;;
NAND)
	echo "#define FRIENDLYARM_BOOT_MEDIA_NAND" >> config.h	#追加到config.h
	;;
*)
	;;
esac
case $8 in
ram128)
	echo "#define FRIENDLYARM_BOOT_RAM128" >> config.h
	;;
ram256)
	echo "#define FRIENDLYARM_BOOT_RAM256" >> config.h	#追加到config.h
	;;
*)
	;;
esac
echo "#include <configs/$1.h>" >>config.h	#追加到config.h

exit 0
#	config.h的內容:
#	/* Automatically generated - do not edit */
#	#define FRIENDLYARM_BOOT_MEDIA_NAND
#	#define FRIENDLYARM_BOOT_RAM256
#	#include <configs/mini6410.h>
#	在include目錄下cat config.h與分析一致

配置過程會發生的事情總結:

1、產生開發板的名字。

2、創建到平臺/開發板相關的頭文件的鏈接:

    ln -s asm-arm asm

    ln -s arch-s3c6410 asm-arm/arch

    ln -s proc-armv asm-arm/proc

3、創建頂層Makefile包含的文件include/config.mk,文件內容如下:

ARCH     = arm 
CPU      = s3c64xx 
BOARD    = mini6410
VENDOR   = samsung
SOC      = s3c6410  

4、創建開發板相關的頭文件include/config.h,文件內容如下:

/* Automatically generated - do not edit */
#define FRIENDLYARM_BOOT_MEDIA_NAND
#define FRIENDLYARM_BOOT_RAM256
#include <configs/mini6410.h>

5、由於u-boot沒有類似於內核一樣的可視化配置界面,故需要手動修改配置文件include/configs/mini6410.h來裁剪,設置u-boot。

a、一類是選項,類似於“CONFIG_”,用於選擇CPU、SOC、開發板類型,設置系統時鐘,選擇設備驅動等。

b、另一類是參數,類似於“CFG_”,用於設置malloc緩衝池的大小、u-boot的提示符、u-boot下載文件時的默認加載地址、flash的起始地址。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章