u-boot移值(八)-u-boot的配置过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012351051/article/details/86752604

    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 <[email protected]>
#

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的进一步配置。
 

猜你喜欢

转载自blog.csdn.net/u012351051/article/details/86752604