原创 u-boot下mkconfig脚本文件分析

2011-7-2 15:17 1923 7 7 分类: 工程师职场

http://blog.sina.com.cn/s/blog_3e7848600100hr2g.html

u-boot1.1.6 mkconfig脚本分析

脚本功能:根据脚本开头注释可知,该脚本针对指定单板,创建一些头文件和相关链接用于配置u-boot,是编译Uboot的第一个步骤,make smdk2410_config就执行该脚本
脚本参数:Target Architecture CPU Board [VENDOR] [SOC]
   根据uboot的Makefile可知,当执行./mkconfig时,传入的参数分别对应为
   Target --   smdk2410
   Architecture –  arm
   CPU --    arm920t
   Board --   smdk2410
   VENDOR --  NULL  按厂商划分(如AT9200、S3C44B0等)
   SOC --   s3c24x0

为何要编制该脚本文件:因为uboot是一个多CPU多架构的统一bootloader,为了完成针对特定目标单板,目标架构的编译,需要给Makefile指明,哪些文件需要编译,相当与从整体上控制需要编译的cpu,单板等

代码分析
#!/bin/sh –e //指定执行该脚本所使用的解释器, -e相当于/bin/bash

APPEND=no #缺省创建一个新的配置文件
BOARD_NAME=”” #make 执行smdk2410_config的时候打印输出单板名

while [ $# -gt 0 ] ; do //当参数数量大于0,做一下判断
 case “$1” in //判断第一个参数
 --) shift ; break ;; //-- 所有参数左移,不包括$0,$0是命令名
 -a) shift ; APPEND=YES ;; //-a, APPEND变量赋值yes,不生成新的config.h
 -n) shift ; BOARD_NAME=”$(1%%_config)” ; shift ;;
 *) break ;;
 esac
done

$(1%%_config)原形为$(string%%substring),从string的右侧删除掉最后匹配substring的字符串

如果我们编译的是smdk2410单板,以上条件不满足,则退出while循环

[ “${BOARD_NAME}” ] || BOARD_NAME=”$1” //如果BOARD_NAME非空,则什么也不做,否则将参数1赋值给BOARD_NAME,或表示,前面如果为真,则不执行后面操作,如果为假,则执行或后面的代码

[ $# -lt 4 ] && exit 1 //如果参数数量小于4,则退出
[ $# -gt 6 ] && exit 1 //如果参数数量大于6,则退出


echo "Configuring for ${BOARD_NAME} board..." //输出单板名,如果没有名字,则表明没有此单板

//以下的代码,是该脚本的核心,主要在目标文件下创建一些指向架构头文件的链接

if [ “$SRCTREE” != “$OBJTREE” ]  ; then
 mkdir –p ${OBJTREE}/include 在目标目录下创建include文件夹
 mkdir –p ${OBJTREE}/include2 在目标目录下创建include2文件夹
 cd ${OBJTREE}/include2 进入include2
 rm –f asm 删除asm链接
 ln –s ${SRCTREE}/include/asm-$2 asm 创建asm链接,指向源目录下include/asm-arm
 LNPREFIX="../../include2/asm/" 赋值
 cd ../include //进入目标目录下的include目录
 rm –rf asm-$2 //删除asm-arm
 rm –f asm //删除asm
 mkdir asm-$2 //创建asm-arm
 ln –s asm-$2 asm //创建asm软连接指向当前目录的asm-arm
else
 cd ./include //如果资源目录和目标目录是同一路径,则只创建指向asm-arm的软连接
 rm –f asm
 ln –s asm-$2 asm
fi

rm -f asm-$2/arch

//如果$6(即SOC)为0或者为NULL,-o意味或的意思,在目标目录的Include下创建软链接arm-arm/arch指向${LNPREFIX}arch-$3,否则指向${LNPREFIX}arch-soc24x0
if [ -z "$6" -o "$6" = "NULL" ] ; then
 ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
 ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi

if [ "$2" = "arm" ] ; then
 rm -f asm-$2/proc
 ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi


最终目标目录下的软链接创建就是在Include下创建了asm
asm指向目标路径下的include下的/asm-arm,而asm-arm下也有2个软链接,分别指向include2/asm/arch-s3c24x0 和proc-armv,最终就是在目标路径下的include下创建一个和资源路径下include一样的路径,只是里面都是一些软链接

//创建config.mk
echo "ARCH   = $2" >  config.mk
echo "CPU    = $3" >> config.mk
echo "BOARD  = $4" >> config.mk

[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk

[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC    = $6" >> config.mk

创建单板指定的头文件config.h
if [ "$APPEND" = "yes" ] # Append to existing config file
then
 echo >> config.h
else
 > config.h  # Create new config file
fi
echo "" >>config.h
echo "#include <configs/$1.h>" >>config.h //创建的config.h,包含<configs/smdk2410.h>

//这种方式在多目标项目中经常使用,对用户来说,头文件只需要包含config.h(脚本动态生成),具体包含的是哪一个单板的config.h.由编译时指定

exit 0 //脚本正常退出

mkconfig脚本文件的目的就是在目标路径下创建一个源文件路径下include下的一个镜像

目标路径       源文件路径
include/asm-arm      include/asm-arm
include/asm-arm/arch     include/asm-arm/arch-s3c24x0  
include/asm-arm/proc     include/asm-arm/proc-armv
include/config.h      include/configs/smdk2410.h
include/asm -> include/asm-arm

之所以目标路径下多了Include2是为了编写脚本方便,一切链接都是通过
LNPREFIX(../../include2/asm/)指向源文件路径下的/include/asm-arm,这样,以后如果源文件路径有改动,则只需要修改脚本下的LNPREFIX即可

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
7
关闭 站长推荐上一条 /3 下一条