u-boot的配置过程

来源:互联网 发布:mac 软件安装路径 编辑:程序博客网 时间:2024/05/16 09:28
1.顶层Makefile
        这里我们将以smdk2410为例来介绍,uboot是u-boot-2009.03,首先我们应该打开u-boot的顶层Makefile,这里按照人的思维来说,我们应该首先去看看smdk2410的配置项:
smdk2410_config:

2830 smdk2410_config :       unconfig
2831         @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0

关注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 s3c24x0 ,ok到了这一步我们就应该去看看mkconfig。

2.mkconfig
        打开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行判断参数的个数必须为5,不然就退出。

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为s3c24x0,不为空也不为NULL,所以将会执行56行,而 LNPREFIX为空,所以这句实际上执行的是“ln -s arch-$6 asm-$2/arch”,也就是创建asm-arm/arch ,并将其链接到arch-s3c24x0。
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                     =     s3c24x0

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 " >>config.h
86 echo "#include " >>config.h
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-s3c24x0 asm-arm/arch
                 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没有定义任何东西,但是在其他平台的这个文件中就有一些宏定义了)。