U-boot是一个很庞大的程序,这里的“庞大”有多层含义,文件个数庞大(几千个),功能庞大(不亚于一个小型操作系统)、支持种类庞大(多种CPU框架、多种设备驱动),从u-boot的结构就能看出,作者的野心很大,他想做一种引导所有操作系统的bootloader,包含n多常用的驱动,所以程序体量必然特别大,不过,程序本身很庞大,不代表我们全都需要,因为移值的CPU架构是固定的,只需要根据自己的需要,配置即可。所以u-boot的配置命令只有简单的一条,通过一条指令确定自己使用的架构,外围,接下来u-boot的makefile就会根据配置而自动选择编译。
从根目录下的README文件中我们可知:只需要根据开发板名称, 使用
make <board_name>_config
即可,具体的<board_name> 对应的是/board/<board_name>。
官方举的例子是:如果开发板是TQM823L,则配置命令如下:
cd u-boot
make TQM823L_config
那么这条命令会实现什么样的功能 呢?由于我们移值的板子是致远i.mx287开发板,我们在u-boot中 查找,发现没有,那就找个相近的,毕竟所谓“移值”也是找相近的,比葫芦画瓢。
mx31ads_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm1136 mx31ads freescale mx31
从这条语句上发现,应该是执行MKCONFIG工具,传递的函数是mx31ads(去掉_config),arm,arm1136,mx31ads, freescale,mx31,接着我们再看MKCONFIG是什么。
MKCONFIG对应的是顶层目录的<mkconfig>文件,文件内容和对应解释翻译如下:
# Script to create header files and links to configure
# U-Boot for a specific board.
# 这里说的很清楚,这是一个脚本文件,会根据指定的board,生成对应
# 的头文件和配置链接(.mk)
#
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
# 目标 体系架构 CPU 板子 供应商 SOC芯片
# 举例对应 mx31ads arm arm1136 mx31ads freescale mx31
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
#
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
# 参数$1= mx31ads,很显然,不等于‘--’、-a、-n,所以直接退出,这几条命令是实际没执行
while [ $# -gt 0 ] ; do //参数个数大于0,执行
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
#通过 [ ] 符号判断,BOARD_NAME是不是空,这里很明显是空,所以定义 BOARD_NAME=mx31ads
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
[ $# -lt 4 ] && exit 1 //如果参数个数小于4,退出
[ $# -gt 6 ] && exit 1 //参数个数大于6,退出
echo "Configuring for ${BOARD_NAME} board..."
//打印输出.......
#
# Create link to architecture specific headers
#
//生成对应架构的link文件
//判断程序源代码目录和目标文件目录是否一样,可以选择在其他目录下编译u-boot,不过一般都是在
//源代码目录下执行,所以执行else分支
//进入include目录,删掉asm文件(上一次配置生成的配置文件),再次建立asm文件,
//令它连接向asm-$2目录,即asm-arm
if [ "$SRCTREE" != "$OBJTREE" ] ; then
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
fi
//删除asm-arm/arch目录
rm -f asm-$2/arch
//判断$6是否为空或NULL,这里$6=mx31,所以要执行else分支
//LNPREFIX为空,所以执行 ln -s arch-mx31 asm-arm/arch
if [ -z "$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
//建立链接文件 ln -s proc-armv asm-arm/proc
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
#
# Create include file for Make
#
//生成config.mk,特别注意由于前面的脚本已经有了cd include
//所以这个config.mk不是顶层目录下的,而是在include 目录下
// '>'表示,如果没有,则新建
// '>>' 表示增加
//config.mk主要是将该脚本的参数传递给config.mk中。
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
#
# Create board specific header file
#
//生成头文件,
//APPEND的值为no,所以执行else分支,生成config.h文件,应该还是在include目录下
//内容为两条包含头文件
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
echo "#include <asm/config.h>" >>config.h
exit 0
小结:
1、定义 BOARD_NAME=mx31ads
2、进入include目录,删掉asm文件(上一次配置生成的配置文件),再次建立asm文件,
令它连接向asm-$2目录,即asm-arm
3、建立链接文件 ln -s proc-armv asm-arm/proc
4、生成config.mk,特别注意由于前面的脚本已经有了cd include,所以这个config.mk不是顶层目录下的,
而是在include 目录下,内容包括创建对象(变量)
ARCH = arm
CPU = arm1136
BOARD = mx31ads
VENDOR = freescale
SOC = mx31
5、生成 config.h 头文件,内容为:
#include <configs/mx31ads.h> //include目录下
#include <asm/config.h>
该头文件的主要作用就是引用开发板对应的头文件,而mx31ads.h中是各种配置宏,通过这些配置宏,就可以实现对u-boot的进一步配置。