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 = arm920t ,BOARD = 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-arm ,include/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 应用开发完全手册》--- 韦东山 欢迎转载,但是注明出处。
阅读(3022) | 评论(0) | 转发(0) |