一般而言編譯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的起始地址。