Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1684258
  • 博文数量: 511
  • 博客积分: 967
  • 博客等级: 准尉
  • 技术积分: 2560
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-06 14:19
文章分类

全部博文(511)

文章存档

2016年(11)

2015年(61)

2014年(257)

2013年(63)

2012年(119)

分类: LINUX

2012-09-13 23:43:15

u-boot下mkconfig脚本文件分析 发布时间:2011-07-02 15:16:28
技术类别:
需要确认注册邮箱后才能下载,

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 " >>config.h //创建的config.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即可

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