在u-boot的顶层makefile中,对不同开发板可以进行不同的配置。以s3c2400为例,在makefile中我们可以找到这样几行代码:
smdk2400_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2400 NULL s3c24x0
其中第二行的命令就是mkconfig的用法,下面详细解析mkconfig的作用原理。
#!/bin/sh -e # 声明脚本使用的是bash语法
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
# 用法:对应于makefile中的命令,其中从arm开始是脚本参数
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
#
APPEND=no # 默认创建新的config文件
BOARD_NAME="" # Name to print in make output 单板的名字
while [ $# -gt 0 ] ; do # 如果参数的个数大于0
case "$1" in # 对于第一个参数判断
--) shift ; break ;; # 若是--,移除第一个参数并退出循环
-a) shift ; APPEND=yes ;; # 若是-a,移除第一个参数且变量APPEND赋值为yes
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;; # 若是-n,移除第一个参数,并将第二个参数的_config去掉后赋值给变量BOARD_NAME,再将第二个参数移除
*) break ;; # 若非上述情况,退出循环
esac # case结束
done # while结束
[ "${BOARD_NAME}" ] || BOARD_NAME="$1" # 若变量BOARD_NAME为空字符串,则赋值为第一个参数
[ $# -lt 4 ] && exit 1 # 若参数个数少于4个,退出
[ $# -gt 6 ] && exit 1 # 若参数个数多于6个,退出
echo "Configuring for ${BOARD_NAME} board..." # 打印信息
#
# Create link to architecture specific headers
# 创建连接文件,连接相应架构的具体头文件,名为asm
if [ "$SRCTREE" != "$OBJTREE" ] ; then # 若源代码顶层目录和输出目录不同
mkdir -p ${OBJTREE}/include # 则在输出目录中创建目录include
mkdir -p ${OBJTREE}/include2 # 同时创建目录include2
cd ${OBJTREE}/include2 # 进入include2目录
rm -f asm # 移除asm文件
ln -s ${SRCTREE}/include/asm-$2 asm # 创建与源代码目录中asm-arm的连接,名字是asm
LNPREFIX="../../include2/asm/" # 变量LNPREFIX赋值为连接asm的路径
cd ../include # 进去include目录
rm -rf asm-$2 # 移除asm-arm目录
rm -f asm # 移除asm
mkdir asm-$2 # 创建asm-arm目录
ln -s asm-$2 asm # 创建与asm-arm的连接,名为asm
else # 若源代码顶层目录和输出目录相同
cd ./include # 进入include目录
rm -f asm # 移除asm
ln -s asm-$2 asm # 创建与asm-arm的连接,名为asm
fi
rm -f asm-$2/arch # 移除asm-arm/arch文件
if [ -z "$6" -o "$6" = "NULL" ] ; then # 若第六个参数为空或为NULL
ln -s ${LNPREFIX}arch-$3 asm-$2/arch # 创建asm/arch-arm920t的链接文件,名字为asm-arm/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch # 创建asm/arch-s3c24x0的连接文件,名字为asm-arm/arch
fi
if [ "$2" = "arm" ] ; then # 若第二个参数为arm
rm -f asm-$2/proc # 移除asm-arm/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc # 创建asm/proc-armv的连接文件,名为asm-arm/proc
fi
#
# Create include file for Make
# 创建make包含的文件
echo "ARCH = $2" > config.mk # 创建config.mk文件,输入ARCH = arm
echo "CPU = $3" >> config.mk # 继续输入cpu = arm920t
echo "BOARD = $4" >> config.mk # 继续输入BOARD = smdk2400
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk # 若第五个参数非空且非NULL,则继续输入VENDOR = ***
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk # 若第六个参数非空且非NULL,则继续输入SOC = s3c24x0
#
# Create board specific header file
# 创建单板的特殊头文件
if [ "$APPEND" = "yes" ] # 若APPEND为yes
then
echo >> config.h # 则在config.h中另起一行追加内容
else
> config.h # 创建新的config.h文件
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h # 输入#include<configs/smdk2400.h>
exit 0