继续 U-Boot编译过程分析(1) ,上面已经看了顶层Makefile文件下的命令,现在看mkconfig文件的作用:
在文件一开始的注释中写了:
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
详细说明了这么个文件要完成的工作和文件参数传递的规则。明显这个脚本文件适用于创建头文件和链接文件的。而参数中【SOC】是片上系统的含义,一般就是指芯片。
下面就逐步分析它的作用:
从U-Boot编译过程分析(1)这篇文章最后我们已经确定“./mkconfig smdk2410 arm 920t smdk2410 samsung s3c24x0”这条命令.确定了各个变量。
1、确定开发板名称
11 APPEND=no # Default: Create new config file
12 BOARD_NAME="" # Name to print in make output
13 TARGETS=""
14
15 while [ $# -gt 0 ] ; do
16 case "$1" in
17 --) shift ; break ;;
18 -a) shift ; APPEND=yes ;;
19 -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
20 -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
21 *) break ;;
22 esac
23 done
24
25 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
26
27 [ $# -lt 4 ] && exit 1
28 [ $# -gt 6 ] && exit 1
30 if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
31 echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2
32 exit 1
33 fi
34
35 echo "Configuring for ${BOARD_NAME} board..."
对第一个参数进行检查,没有匹配项,不执行操作。25行,将第一个参数“smdk2410”赋值给BORAD_NAME。27-28行做参数个数检查,小于4大于7个就退出(个人感觉这个从参数个数检查的位置是不是太晚了啊)。30-33行做架构变量检查,ARCH在Makefile文件中定义,当前为空,如果有值且不匹配则退出。
2、创建架构相关的头文件的链接
37 #
38 # Create link to architecture specific headers
39 #
40 if [ "$SRCTREE" != "$OBJTREE" ] ; then
41 mkdir -p ${OBJTREE}/include
42 mkdir -p ${OBJTREE}/include2
43 cd ${OBJTREE}/include2
44 rm -f asm
45 ln -s ${SRCTREE}/arch/$2/include/asm asm
46 LNPREFIX=${SRCTREE}/arch/$2/include/asm/
47 cd ../include
48 rm -f asm
49 ln -s ${SRCTREE}/arch/$2/include/asm asm
50 else
51 cd ./include
52 rm -f asm
53 ln -s ../arch/$2/include/asm asm
54 fi
55
根据执行Makefile时的文件路径重新创建平台/开发板相关的头文件的链接(为保持源代码目录的干净,我们可以选择在其他目录下编译U-BOOT,作为刚开始学习的新人还是先不这么做吧,尽可能避免不必要的麻烦。等我们足够了解后,再去尝试和深入的学习)。
因为是在顶层目录下直接编译,所以执行else分支下的命令。51-53行,进入顶层下include目录,删除上次上次建立的链接文件,重新建立asm链接文件,使指向arch/arm/include/asm。
56 rm -f asm/arch
57
58 if [ -z "$6" -o "$6" = "NULL" ] ; then
59 ln -s ${LNPREFIX}arch-$3 asm/arch
60 else
61 ln -s ${LNPREFIX}arch-$6 asm/arch
62 fi
63
64 if [ "$2" = "arm" ] ; then
65 rm -f asm/proc
66 ln -s ${LNPREFIX}proc-armv asm/proc
67 fi
68
56行,删除asm/arch目录。
58行判断第六个参数是否为空或者为NULL,显然执行else分支。
由于LNPREFIX为空(在Makefile文件中并没有定义,在这个文件中也没有,直接在终端内执行echo ${LNPREFIX}显示为空,所以我想应该这是一个为定义的变量,希望指正)。所以命令执行的是“ln -s arch-s3c24x0 asm/arch”,将arm/ach链向arch/arm/include/asm/arch-s3c24x0目录。
65-66行,重新建立arm/proc链接文件并链向arch/arm/include/asm/proc-armv目录。
3、创建顶层Makefile需要的头文件
69 #
70 # Create include file for Make
71 #
72 echo "ARCH = $2" > config.mk
73 echo "CPU = $3" >> config.mk
74 echo "BOARD = $4" >> config.mk
75
76 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
77
78 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
79
80 # Assign board directory to BOARDIR variable
81 if [ -z "$5" -o "$5" = "NULL" ] ; then
82 BOARDDIR=$4
83 else
84 BOARDDIR=$5/$4
85 fi
86
说明下,我们现在仍然在顶层include目录下。
72-78得到的结果是新建了include/config.mk文件,内容为
ARCH = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = samsung
SOC = s3c24x0
81-85行因为vendor变量不为空,所以执行else 分支。BOARDDIR的值为samsung/s3c24x0 。
4、创建开发板相关头文件 config.h
87 #
88 # Create board specific header file
89 #
90 if [ "$APPEND" = "yes" ] # Append to existing config file
91 then
92 echo >> config.h
93 else
94 > config.h # Create new config file
95 fi
96 echo "/* Automatically generated - do not edit */" >>config.h
97
98 for i in ${TARGETS} ; do
99 echo "#define CONFIG_MK_${i} 1" >>config.h ;
100 done
101
102 cat << EOF >> config.h
103 #define CONFIG_BOARDDIR board/$BOARDDIR
104 #include <config_defaults.h>
105 #include <configs/$1.h>
106 #include <asm/config.h>
107 EOF
108
APPEND维持的原值“NO”,执行else分支,创建了config.h。
96-100,由于TARGETS为空,不执行。
102-107 在config.h中输入
#define CONFIG_BOARDDIR board/samsung/smdk2410
#include <config_defaults.h>
#include <configs/smdk2410.h>
#include <asm/config.h>
109 exit 0
结束
总结下,mkconfig完成的工作,都是在include/目录下
1、开发板名称BOARD_NAME = $1
2、创建架构相关头文件的链接
ln -s ../arch/${arch}/include/asm asm
ln -s ../arch/${arch}/include/asm/arch-${soc} asm/arch
ln -s ../arch/${arch}/include/asm/proc-armv asm/proc
3、创建顶层Makefile包含的头文件include/config.mk
#ARCH = arm
#CPU = arm920t
#BOARD = smdk2410
#VENDOR = samsung
#SOC = s3c24x0
4、创建开发板相关头文件include/config.h
#define CONFIG_BOARDDIR board/samsung/smdk2410
#include <config_defaults.h>
#include <configs/smdk2410.h>
#include <asm/config.h>
由此可以知道,在移植时如果在board目下新建一个开发板<board_name>的目录,则在include/configs目录下新建一个<board_name>.h的头文件,存放开发板的配置信息。