分类: LINUX
2009-05-02 12:01:27
这里我们将以smdk2410为例来介绍,uboot是u-boot-2009.03,首先我们应该打开u-boot的顶层Makefile,这里按照人的思维来说,我们应该首先去看看smdk2410的配置项:
smdk2410_config:
2830 smdk2410_config : unconfig
2831 @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s
关注2831行,了解Makefile语法的朋友一定对$(@:_config=)在做什么很了解,其实它就是将$@即目标 smdk2410_config的后面的_config替换成空,所以结果就是'smdk2410',另外我们在搜索一下Makefile,就可以找到下面的语句:
106 SRCTREE := $(CURDIR)
...
111 MKCONFIG := $(SRCTREE)/mkconfig
112 export MKCONFIG
很明显@$(MKCONFIG)就是当前目录下面的mkconfig。所以执行上面的2831行其实就是执行./mkconfig smdk2410 arm arm920t smdk2410 samsung s
打开mkconfig,整个脚本很短,只有88行。
a. 我们应该先看看最上面的注释:
3 # Script to create header files and links to configure
4 # U-Boot for a specific board.
5 #
6 # Parameters: Target Architecture CPU Board [VENDOR] [SOC]
3,4行告诉你这个脚本的作用,6行介绍了它的参数的含义。
b. 接下来,获得BOARD_NAME:
11 APPEND=no # Default: Create new config file
12 BOARD_NAME="" # Name to print in make output
13
14 while [ $# -gt 0 ] ; do
15 case "$1" in
16 --) shift ; break ;;
17 -a) shift ; APPEND=yes ;;
18 -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
19 *) break ;;
20 esac
21 done
22
23 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
24
25 [ $# -lt 4 ] && exit 1
26 [ $# -gt 6 ] && exit 1
27
28 echo "Configuring for ${BOARD_NAME} board..."
14行,判断参数的个数($#)是否大于零,之后判断$1中有没有-,有的话就左移一个位置,没有就出来,很明显参数中没有带-的,那么就会执行到23行,&&相当于“if...then...”,而||相当于“if not...then...”,所以这里就表示如果 BOARD_NAME为空,就使 BOARD_NAME=$1,即 BOARD_NAME为'smdk2410'. 25, 26行判断参数的个数如果小于4或者大于6就退出,参数的个数可以为4,5或者6。
c. 创建到平台,开发板相关的头文件的链接
30 #
31 # Create link to architecture specific headers
32 #
33 if [ "$SRCTREE" != "$OBJTREE" ] ; then
34 mkdir -p ${OBJTREE}/include
35 mkdir -p ${OBJTREE}/include2
36 cd ${OBJTREE}/include2
37 rm -f asm
38 ln -s ${SRCTREE}/include/asm-$2 asm
39 LNPREFIX="../../include2/asm/"
40 cd ../include
41 rm -rf asm-$2
42 rm -f asm
43 mkdir asm-$2
44 ln -s asm-$2 asm
45 else
46 cd ./include
47 rm -f asm
48 ln -s asm-$2 asm
49 fi
50
51 rm -f asm-$2/arch
52
53 if [ -z "$6" -o "$6" = "NULL" ] ; then
54 ln -s ${LNPREFIX}arch-$3 asm-$2/arch
55 else
56 ln -s ${LNPREFIX}arch-$6 asm-$2/arch
57 fi
58
59 if [ "$2" = "arm" ] ; then
60 rm -f asm-$2/proc
61 ln -s ${LNPREFIX}proc-armv asm-$2/proc
62 fi
33行判断源码目录跟目标文件目录是否一致,不一致的话就在目标文件目录创建相关的文件和链接,这样可以使源码目录保持干净,不过我们一般都是直接在源码目录进行编译的,所以这里执行的是 else后面的语句,46-48行,进入./include中,删除掉原来的asm目录,因为可能你之前就已经编译过了,然后再次建立asm,并让它链接到asm-$2,这里是连接到asm-arm。
之后51行删除到asm-$2下面的arch,53行因为$6为s
59-61行,如果$2=arm的话,重新建立一下asm-arm/proc目录,并将它链接到 proc-armv。
d. 之后创建顶层Makefile包含的文件include/config.mk
64 #
65 # Create include file for Make
66 #
67 echo "ARCH = $2" > config.mk
68 echo "CPU = $3" >> config.mk
69 echo "BOARD = $4" >> config.mk
70
71 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
72
73 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
这几句很简单,就是创建config.mk,请注意,之前46行我们就已经在include目录下面了,因此这几行执行完成后,config.mk的内容就应该是下面的样子:
ARCH = arm
CPU = arm920t
BOARD = smdk2410
VENDOR = samsung
SOC = s
e. 最后就开始创建include/config.h:
75 #
76 # Create board specific header file
77 #
78 if [ "$APPEND" = "yes" ] # Append to existing config file
79 then
80 echo >> config.h
81 else
82 > config.h # Create new config file
83 fi
84 echo "/* Automatically generated - do not edit */" >>config.h
85 echo "#include
86 echo "#include
87
88 exit 0
上面的代码很好理解,首先因为之前APPEND=no,所以我们就会执行82行,创建一个config.h文件,然后84-86行将一个注释和两个头文件写入config.h中。
到这里这个mkconfig文件就完了,这里我稍微小结一下这个文件所做的工作,不然头会有点晕:
(1). BOARD_NAME='smdk2410'
(2). ln -s asm-arm asm
ln -s arch-s
ln -s proc-armv asm-arm/proc
(3). 创建include/config.mk
(4). 创建include/config.h
到了这里我们就已经可以算是配置完成了,为什么了?请注意最后生成的include/config.h之中包含了两个头文件,对于2410来说的这两个头文件就是config/smdk2410.h,以及asm/config.h(asm-arm/config.h), 如果你打开这两个文件就会发现很多CONFIG_的宏定义(当然 asm-arm/config.h没有定义任何东西,但是在其他平台的这个文件中就有一些宏定义了)。