手机版
你好,游客 登录 注册 搜索
背景:
阅读新闻

u-boot-1.1.6第1阶段分析之make smdk2410_config指令

[日期:2018-07-07] 来源:Linux社区  作者:坦然~ [字体: ]

uboot源码中的README文档中介绍要使用uboot必须先进行配置后编译,即先执行make xxx_config命令,然后执行make命令,下面以make smdk2410_config指令为例来介绍uboot的配置过程。

解压uboot-1.1.6文件夹后,在顶层目录的Makefile中可以看到如下代码:

87 SRCTREE        := $(CURDIR)
92 MKCONFIG    := $(SRCTREE)/mkconfig
1879 smdk2410_config    :    unconfig
1880    @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

我们在u-boot-1.1.6的根目录下编译,那么第87行代表当前目录的变量$(CURDIR)即为u-boot-1.1.6的根目录,立即变量SRCTREE等于$(CURDIR),也表示uboot的根目录,所以第92行中的MKCONFIG就是根目录下的mkconfig文件。第1879和1880代码告诉我们,执行make smdk2410_config时就相当于执行一下指令:

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

这条语句中有个高级的语法$(var:a=b),意思是把变量"var"中所有的以字符串"a"结尾变量的结尾字符串"a"替换成字符串"b"。由上面的分析,$@代表的是目标"smdk2410_config",  "_config="意思是_config等于空字符,所以$(@:_config=)就是将目标"smdk2410_config"中的"_config"去掉,结果为"smdk2410"。将这条语句中各处的变量展开,可以清楚的看到执行"make smdk2410_config"实际是执行下面命令:

          ./mkconfig  smdk2410  arm  arm920t  smdk2410  NULL  s3c24x0 

              $0              $1            $2        $3            $4            $5          $6

再来看看makconfig的作用,打开mkconfig脚本,可以清楚看到在文件开头的第6行给出了它的用法:           

6 # Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]

这里刚好与上面分析make smdk2410_config执行命令相对应,Parameters($0)  Target($1)  Architecture($2)  CPU($3)  Board($4)  [VENDOR]($5)  [SOC]($6)

下面来详细分析mkconfig的作用

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"

对于“./mkconfig  smdk2410  arm  arm920t  smdk2410  NULL  s3c24x0” 命令中没有"--","-a","-n","*"等符号,所以14~22行代码没有实现任何相应操作,第11和12行的变量仍然为原来定义是内容。执行完第23行语句时BOARD_NAME等于第一个参数"smdk2410"。

25 [ $# -lt 4 ] && exit 1
26 [ $# -gt 6 ] && exit 1
27
28 echo "Configuring for ${BOARD_NAME} board..."

第25,26行中,$#表示输入总参数个数,-lt为小于(less than),-gt为大于(greater than),&&表示左边命令为真则执行"exit 1",跳出执行。由于总参数个数为6,所以不满足25,26执行条件,所以不跳出继续执行,28行为打印配置信息,当执行"make smdk2410_config"时将自动打印此处信息。

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行判断源代码目录和目标文件目录是否一样,可以选择在其他的目录下进行编译,这里我们是直接在源代码文件中进行编译,这里第33行的if语句不满足条件,直接执行else分支语句。第46~48行是通过cd命令进入include目录,删除上一次配置的链接文件asm文件,然后再次建立asm文件,并使其链接向asm-$2目录,也就是asm-arm。第51行是删除asm-arm/arch,53行检测输入的第六个参数是否为空,若为空则执行if分支语句,否则执行else分支,我们输入的第六个参数为“s3c24x0”,不为空,也不为“NULL”所以执行else分支,即创建asm-arm/arch,并令其链接向arch-s3c24x0目录。第60~61行重新建立asm-arm/pro文件,并让它链接向proc-armv目录。

64 #
65 # Create include file for Make
66 #
67 echo "ARCH  = $2" >  config.mk                  /* 新建文件config.mk,内容为"ARCH    =arm" */
68 echo "CPU    = $3" >> config.mk                  /* 追加内容"CPU    =arm920t"到config.mk文件中 */
69 echo "BOARD  = $4" >> config.mk                  /* 追加内容"BOARD  =smdk2410"到config.mk文件中 */
70
71 [ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk      /* $5参数为空,不执行追加内容 */
72
73 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk      /* 追加内容"SOC    =S3C24x0到config.mk文件中"

 第64~73行执行完后,在include文件夹中创建config.mk内容为:
 ARCH = arm
 CPU = arm920t
 BOARD = smdk2410
 SOC = s3c24x0

如下图所示:

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 <configs/$1.h>" >>config.h
86
87 exit 0

APPEND维持原值为"no",执行分支语句,创建config.h文件,第84~85为在创建config.h文件内追加信息,config.h内容如下图所示:

现在来总结一下,执行配置命令“make smdk2410_config”产生结果:
1.开发板名称BOARD_NAME等于$1(此处为smdk2410)
2.创建到平台/开发板相关头文件的链接
3.创建根目录下Makefile文件包含的文件include/config.mk
4.创建开发板相关的头文件include/config.h(此文件会在start.S中包含,很重要)

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址https://www.linuxidc.com/Linux/2018-07/153063.htm

linux
相关资讯       U-boot 
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数

       

评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款