Chinaunix首页 | 论坛 | 博客
  • 博客访问: 439540
  • 博文数量: 123
  • 博客积分: 2686
  • 博客等级: 少校
  • 技术积分: 1349
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-23 22:11
文章分类
文章存档

2012年(3)

2011年(10)

2010年(100)

2009年(10)

我的朋友

分类: LINUX

2009-12-29 12:49:22

1、到u-boot代码顶层目录下,可以找到mkconfig文件。输入命令make smdk2410_config,其实是执行:(为什么这么执行在下一篇博客u-bootMakefile分析将要详细讲到。)

./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0

mkconfig本质上是一个shell程序。
传入mkconfig这个shell程序的参数依次为,$1=smdk2410,$2=arm,$3=arm920t,$4=smdk2410,
$5=NULL,$6=s3c24x0

2
mkconfig代码分析

  1 #!/bin/sh -e
  2
  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]
  7 #
  8 #
(C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
  9 #
 10
#定义了3个变量,并初始化。
 11 APPEND
=no # Default: Create new config file
 12 BOARD_NAME
="" # Name to print in make output
 13 TARGETS
=""
 14
#分析传进来的参数1$1,然后执行相应的动作,我们这里执行

  # ./mkconfig  smdk2410 arm arm920t smdk2410 NULL s3c24x0,传入到_

  # $1里面值_smdk2410,显然15-24行不会执行任何动作

 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
#给变量BOARD_NAME 赋值为$1,即,BOARD_NAME=smdk2410
 25
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
 26
 27
[ $# -lt 4 ] && exit 1
 28
[ $# -gt 6 ] && exit 1

 29 #30-33判断ARCH是否等于参数2:arm.不是就推出,并提示失败
 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 #
执行到这里,就向终端输出提示:Configuring for smdk2410 board...
 35 echo "Configuring for ${BOARD_NAME} board..."
 36
 37 #
 38 # Create link to architecture specific headers
 39 #40-56
判断源代码目录和目标代码目录是否在同一个目录下面。可以选择
   
#
其他_目录编译u-boot,可以使源代码保持原样。一般就在一个目录下面
    #
完成,免得_麻烦。所以40行条件不满足,直接执行52-56.你可以模拟下
    #
53-55行的工作,_进入到u-boot代码顶层目录下,然后进入include
    #
录;删除asm文件,如果_以前没有make过,是没有asm这个链接文件的;
    #
重新建立asm链接文件,把asm _链接到 asm-arm目录。

    #即,asm --> asm-arm.($2=arm)
 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}/include/asm-$2 asm
 46         LNPREFIX="../../include2/asm/"
 47         cd ../include
 48         rm -rf asm-$2
 49         rm -f asm
 50         mkdir asm-$2
 51         ln -s asm-$2 asm
 52 else
 53         cd ./include
 54         rm -f asm
 55         ln -s asm-$2 asm
 56 fi
 57 #58
删除文件asm-arm/arch.你可以模拟下。
 58 rm -f asm-$2/arch
 59 #$6=s3c24x0,
所以61行不执行,执行63,LNPREFIX 为空,63行等价:
   
# ln -s arch-s3c24x0 asm-arm/arch
 60 if [ -z "$6" -o "$6" = "NULL" ] ; then
 61         ln -s ${LNPREFIX}arch-$3 asm-$2/arch
 62 else
 63         ln -s ${LNPREFIX}arch-$6 asm-$2/arch
 64 fi
 65 #66-69
,67删除asm-arm/proc,68建立asm-arm/proc -->proc-armv
 66 if [ "$2" = "arm" ] ; then
 67         rm -f asm-$2/proc
 68         ln -s ${LNPREFIX}proc-armv asm-$2/proc
 69 fi
 70
 71 #
创建顶层Makefile中需要的头文件include/config.mk,include目录里 面的
 72 # Create include file for Make
 73 #74-80
行,往config.mk里面写入:
    # ARCH = arm
CPU = arm920tBOARD = smdk2410,SOC = s3c24x0
    #
你可以在顶层目录输入make smdk2410_config,include目录里面多了
    #
一个config.mk文件,里面内容就是刚刚写入的内容
 74 echo "ARCH   = $2" >  config.mk
 75 echo "CPU    = $3" >> config.mk
 76 echo "BOARD  = $4" >> config.mk
 77
 78 [ "$5" ] &&[ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
 79
 80 [ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
 81
 82 #
创建开发板相关的头文件/board/samsung/smdk2410/lowlevel_init.S
   
#开头有条语句:#include
    #85
行条件不成立,因为APPEND在本文件开头赋值为no.
    #
执行89行,创建一个新的config.h文件
    #91
行,写入注释,等make smdk2410_config后,可以看下是否写入

 83 # Create board specific header file
 84 #
 85 if [ "$APPEND" = "yes" ]        # Append to existing config file
 86 then
 87         echo >> config.h
 88 else
 89         > config.h              # Create new config file
 90 fi
 91 echo "/* Automatically generated - do not edit */" >>config.h
 92 #
此处TARGETS="",93-95,不执行任何操作
 93 for i in ${TARGETS} ; do
 94         echo "#define CONFIG_MK_${i} 1" >>config.h ;
 95 done
 96 #
config.h写入:#include
    #               #include

 97 echo "#include " >>config.h
 98 echo "#include " >>config.h
 99
100 exit 0


3.
看看我们生成的config.h文件。make前,先清除以前做过的垃圾文件。在看inclue目录里面是否有
config.h
文件,显然没有。然后,make smdk2410_config,在看inclue目录里面是否有config.h文件,显然有了。打印出来看看吧,对照着mkconfig程序看看吧。

make distclean
find /
include/config.h
make smdk2410_config
find /
include/config.h
cat /
include/config.h

 

4.总结mkconfig做的工作

  a. 25 [ "${BOARD_NAME}" ] || BOARD_NAME = "$1",结果    BOARD_NAME=smdk2410.

  b. include目录下,建立链接:asm --> asm-arminclude/asm-arm目录下,arch --> arch-s3c24x0,

proc --> proc-armv

  c.include目录下,建立config.mk文件,往里面写入:

     ARCH  = arm

     CPU   = arm920t

     BOARD = smdk2410

     SOC   = s3c24x0

  d.include目录下,建立头文件config.h.往里面写入:

     /* Automatically generated - do not edit */

     #include

     #include




后记:明白了这个mkconfig代码就能明白移植u-boot大概要增加什么文件了。下一篇将是:u-boot主目录Makefile分析



参考书籍:《嵌入式Linux应用开发完全手册》---韦东山


欢迎转载,但是注明出处。

阅读(3030) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~