转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx

上传人:b****2 文档编号:17240006 上传时间:2023-07-23 格式:DOCX 页数:16 大小:19.15KB
下载 相关 举报
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第1页
第1页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第2页
第2页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第3页
第3页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第4页
第4页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第5页
第5页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第6页
第6页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第7页
第7页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第8页
第8页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第9页
第9页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第10页
第10页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第11页
第11页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第12页
第12页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第13页
第13页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第14页
第14页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第15页
第15页 / 共16页
转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx

《转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx》由会员分享,可在线阅读,更多相关《转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx(16页珍藏版)》请在冰点文库上搜索。

转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx

转GNUARM汇编十七uboot的makefile和mkconfig解读

(转)GNUARM汇编--(十七)u-boot的makefile和mkconfig解读

自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读!

阅读碰到的头等问题:

Makefile和shell脚本看不懂...

说起来做linux也很久了,Makefile和shell脚本都接触过,但真的都是略懂而已.因为公司的Makefile和shell简单的一眼望的对穿,很初级的写法,简单的应用.再随便在网上下个老外的开源代码,那个Makefile和shell复杂啊.一不留神想起来了qt的qmake根据工程文件生成的Makefile也是很简单,但qmake是人家老外写的.不说其他语言了,只看Makefile和shell,中外的差距就在那了.

这次准备移植u-boot到tq2440上,选用的u-boot版本是u-boot-2012.07.

下面是我对u-boot配置和编译的makefilemkconfigconfig.mk等文件的解读,有些解读我是在源档上添加文字注释的,有些是另外写的,解读难免有误,若有读者发现了,希望能够指出,在下感激不尽!

在编译u-boot的过程,就是makexxx_config和make两步

以makesmdk2410_config为例:

当以smdk2410_config为目标时,makefile中前面一些变量的定义和其他文件的引用也是有的,这个在原档中添加了有关注释:

在makefile中有:

 

[cpp]viewplaincopyunconfig:

@rm-f$(obj)include/config.h$(obj)include/config.mk\

$(obj)board/*/config.tmp$(obj)board/*/*/config.tmp\

$(obj)include/autoconf.mk$(obj)include/autoconf.mk.dep

%_config:

:

unconfig

echo$@

$(MKCONFIG)-A$(@:

_config=)

%是个通配符,makexxx_config都是这个目标.目标的依赖是unconfig,unconfig的命令是删除一些文件,而这些文件正是从makexxx_config过程中产生的.unconfig就是清理配置的.

我们来看@$(MKCONFIG)-A$(@:

_config=)

其实执行的是mkconfig-Asmdk2410

我们可以在该行上面添加一行:

echo$@

则会输出smdk2410_config,因为$@就是指目标

$(@:

_config=)是变量的替换引用

格式为“$(VAR:

A=B)”(或者“${VAR:

A=B}”),意思是:

替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。

所以smdk2410_config末尾的_config去除了.

下面就是执行mkconfig脚本了,mkconfig-Asmdk2410

给出添加注释的mkconfig文件:

 

[cpp]viewplaincopy#!

/bin/sh-e

#Scripttocreateheaderfilesandlinkstoconfigure

#U-Bootforaspecificboard.

#

#Parameters:

TargetArchitectureCPUBoard[VENDOR][SOC]

#

#(C)2002-2010DENXSoftwareEngineering,WolfgangDenk<wd@denx.de>

#

APPEND=no#Default:

Createnewconfigfile

BOARD_NAME=""#Nametoprintinmakeoutput

TARGETS=""

arch=""

cpu=""

board=""

vendor=""

soc=""

options=""

echo$#

if[\($#-eq2\)-a\("$1"="-A"\)];then

#Automaticmode

line=`egrep-i"^[[:

space:

]]*${2}[[:

space:

]]"boards.cfg`||{

echo"make:

***Noruletomaketarget\`$2_config'.Stop.">&2

exit1

}

set${line}

echo${line}

echo$#

#adddefaultboardnameifneeded

[$#=3]&&set${line}${1}

#####################################

#我们执行脚本的命令是mkconfig-Asmdk2410,$#表示的是参数的个数,$1表示的是第一个参数

#line就是在boards.cfg文件中smdk2410的那行,而-i表示忽略大小写

#在boards.cfg文件中,有

#TargetARCHCPUBoardnameVendorSoCOptions

#smdk2410armarm920t-samsungs3c24x0

#set${line}

#set也可用于在脚本内部给出其运行参数,所以这个时候参数就变为"smdk2410armarm920t-samsungs3c24x0"

#这个时候参数个数就变成6个了

######################################

elif["${MAKEFLAGS+set}${MAKELEVEL+set}"="setset"];then

#onlywarnwhenusingaconfigtargetintheMakefile

cat<<-EOF

warning:

Pleasemigratetoboards.cfg.Failuretodosowill

meanremovalofyourboardinthenextrelease.

EOF

sleep5

fi

echo$1

while[$#-gt0];do

case"$1"in

--)shift;break;;

-a)shift;APPEND=yes;;

-n)shift;BOARD_NAME="${1%_config}";shift;;

-t)shift;TARGETS="`echo$1|sed's:

_:

:

g'`${TARGETS}";shift;;

*)break;;

esac

done

################################################

#因为$1的值为smdk2410,所以case找不到对应的

#################################################

[$#-lt4]&&exit1

[$#-gt7]&&exit1

##################################################

#对参数个数做检查,小于4个或大于7个就退出

##################################################

#Stripalloptionsand/or_configsuffixes

CONFIG_NAME="${1%_config}"

####################

#CONFIG_NAME的值为smdk2410

#########################

echoconfig_

echo${CONFIG_NAME}

["${BOARD_NAME}"]||BOARD_NAME="${1%_config}"

echoboard

echo${BOARD_NAME}

###########################################

#如果BOARD_NAME在之前已经被设定了,就不做任何动作;如果为空,就设定为smdk2410.这里设定为smdk2410

############################################

arch="$2"

cpu="$3"

if["$4"="-"];then

board=${BOARD_NAME}

else

board="$4"

fi

######################################################

#设定arch变量的值为arm

#cpu变量的值为arm920t

#因为第四个变量为"-",所以board变量的值为smdk2410

#######################################################

[$#-gt4]&&["$5"!

="-"]&&vendor="$5"

[$#-gt5]&&["$6"!

="-"]&&soc="$6"

#############################################################

#设定verdor变量的值为samsung

#设定soc变量的值为s3c24x0

#############################################################

[$#-gt6]&&["$7"!

="-"]&&{

#checkifwehaveaboardconfignameintheoptionsfield

#theoptionsfieldmavehaveaboardconfignameandalist

#ofoptions,bothseparatedbyacolon(':

');theoptionsare

#separatedbycommas(',').

#

#Checkforboardname

tmp="${7%:

*}"

if["$tmp"];then

CONFIG_NAME="$tmp"

fi

#Checkifweonlyhaveacolon...

if["${tmp}"!

="$7"];then

options=${7#*:

}

TARGETS="`echo${options}|sed's:

:

:

g'`${TARGETS}"

fi

}

#################################################

#因为我们的变量个数就是6个,这一段不执行

#################################################

echo${ARCH}

echo${arch}

if["${ARCH}"-a"${ARCH}"!

="${arch}"];then

echo"Failed:

\$ARCH=${ARCH},shouldbe'${arch}'for${BOARD_NAME}"1>&2

exit1

fi

####################################################

#ARCH是在顶层makefile中定义的,在此刻还是为空的。

#如果ARCH已经有值了,那么就检测ARCH和arch是否匹配了.

####################################################

if["$options"];then

echo"Configuringfor${BOARD_NAME}-Board:

${CONFIG_NAME},Options:

${options}"

else

echo"Configuringfor${BOARD_NAME}board..."

fi

###########################################################################

#我们没有定义options变量,所以输出Configuringforsmdk2410board...

###########################################################################

#

#Createlinktoarchitecturespecificheaders

#

echo${SRCTREE}

echo${OBJTREE}

if["$SRCTREE"!

="$OBJTREE"];then

mkdir-p${OBJTREE}/include

mkdir-p${OBJTREE}/include2

cd${OBJTREE}/include2

rm-fasm

ln-s${SRCTREE}/arch/${arch}/include/asmasm

LNPREFIX=${SRCTREE}/arch/${arch}/include/asm/

cd../include

mkdir-pasm

else

cd./include

rm-fasm

ln-s../arch/${arch}/include/asmasm

fi

#############################################################################

#在makefile中我们已经知道SRCTREE和OBJTREE都是当前目录,所以这里执行else

#进入./include目录,删除asm链接,并重新建立链接asm,指向arch/arm/include/asm

#############################################################################

rm-fasm/arch

#########################################################################

#删除include目录下的asm下的arch链接文件

########################################################################

ss=

echo${ss}

if[-z"${ss}"];then

echo"null"

else

echo"notnull"

fi

echo${LNPREFIX}

if[-z"${soc}"];then

ln-s${LNPREFIX}arch-${cpu}asm/arch

else

ln-s${LNPREFIX}arch-${soc}asm/arch

fi

##########################################################

#-z用来检测字符串是否为空,为空返回真

#这里我们的soc不为空,执行else

#将asm/arch链向arch-s3c24x0,看一下arch-s3c24x0目录,里面都是s3c24x0相关的头文件

##########################################################

if["${arch}"="arm"];then

rm-fasm/proc

ln-s${LNPREFIX}proc-armvasm/proc

fi

###########################################################

#删除asm/proc链接文件

#将asm/proc链向proc-armv目录,该目录下是四个头文件:

domain.h\processor.h\ptrace.h\system.h

#############################################################

#

#CreateincludefileforMake

#

echo"ARCH=${arch}">config.mk

echo"CPU=${cpu}">>config.mk

echo"BOARD=${board}">>config.mk

["${vendor}"]&&echo"VENDOR=${vendor}">>config.mk

["${soc}"]&&echo"SOC=${soc}">>config.mk

######################################################################

#上面几句的作用在注释中描述的很清楚

#include/config.mk的文件如下:

#ARCH=arm

#CPU=arm920t

#BOARD=smdk2410

#VENDOR=samsung

#SOC=s3c24x0

######################################################################

#AssignboarddirectorytoBOARDIRvariable

if[-z"${vendor}"];then

BOARDDIR=${board}

else

BOARDDIR=${vendor}/${board}

fi

echo${BOARDDIR}

#######################################################################

#因为vendor变量不为空,所以执行else

#BOARDDIR的值为samsung/s3c24x0

########################################################################

#

#Createboardspecificheaderfile

#

if["$APPEND"="yes"]#Appendtoexistingconfigfile

then

echo>>config.h

else

>config.h#Createnewconfigfile

fi

########################################################################

#在文件的最开头可以看到APPEND为no,所以这里我们在include文件夹下建立config.h文件

#######################################################################

echo"/*Automaticallygenerated-donotedit*/">>config.h

echo${TARGETS}

foriin${TARGETS};do

i="`echo${i}|sed'/=/{s/=//;q;};{s/$/1/;}'`"

echo"#defineCONFIG_${i}">>config.h;

done

###################################################

#这里我们TARGETS为空,上面不执行了

##################################################

echo"#defineCONFIG_SYS_ARCH\"${arch}\"">>config.h

echo"#defineCONFIG_SYS_CPU\"${cpu}\"">>config.h

echo"#defineCONFIG_SYS_BOARD\"${board}\"">>config.h

["${vendor}"]&&echo"#defineCONFIG_SYS_VENDOR\"${vendor}\"">>config.h

["${soc}"]&&echo"#defineCONFIG_SYS_SOC\"${soc}\"">>config.h

cat<<EOF>>config.h

#defineCONFIG_BOARDDIRboard/$BOARDDIR

#include<config_cmd_defaults.h>

#include<config_defaults.h>

#include&

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2