自己写的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装备和编译的makefile mkconfig config.mk等文件的解读,有些解读我是在源档上增加文字注释的,有些是别的写的,解读不免有误,若有读者发现了,期望能够指出,鄙人感激不尽!
在编译u-boot的进程,便是make xxx_config和make两步
以make smdk2410_config为例:
当以smdk2410_config为方针时,makefile中前面一些变量的界说和其他文件的引证也是有的,这个在原档中增加了有关注释:
在makefile中有:
- unconfig:
- @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=)
%是个通配符,make xxx_config都是这个方针.方针的依靠是unconfig,unconfig的指令是删去一些文件,而这些文件正是从make xxx_config进程中发生的.unconfig便是整理装备的.
咱们来看@$(MKCONFIG) -A $(@:_config=)
其实履行的是mkconfig -A smdk2410
咱们能够在该行上面增加一行:echo $@
则会输出smdk2410_config,由于$@便是指方针
$(@:_config=)是变量的替换引证
格局为“$(VAR:A=B)”(或许“${VAR:A=B}”),意思是:替换变量“VAR”中所有“A”字符结束的字为“B”结束的字。
所以smdk2410_config结尾的_config去除了.
下面便是履行mkconfig脚本了,mkconfig -A smdk2410
给出增加注释的mkconfig文件:
- #!/bin/sh-e
- #Scripttocreateheaderfilesandlinkstoconfigure
- #U-Bootforaspecificboard.
- #
- #Parameters:TargetArchitectureCPUBoard[VENDOR][SOC]
- #
- #(C)2002-2010DENXSoftwareEngineering,WolfgangDenk
- #
- 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|seds:_::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}|seds:,::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.hprocessor.hptrace.hsystem.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<
>config.h - #defineCONFIG_BOARDDIRboard/$BOARDDIR
- #include
- #include
- #include
- #include
- #include
- EOF
- ######################################################
- #生成config.h文件如下:
- #/*Automaticallygenerated-donotedit*/
- ##defineCONFIG_SYS_ARCH”arm”
- ##defineCONFIG_SYS_CPU”arm920t”
- ##defineCONFIG_SYS_BOARD”smdk2410″
- ##defineCONFIG_SYS_VENDOR”samsung”
- ##defineCONFIG_SYS_SOC”s3c24x0″
- ##defineCONFIG_BOARDDIRboard/samsung/smdk2410
- ##include
- ##include
- ##include
- ##include
- ##include
- #####################################################
- exit0
make xxx_config后,首要的改变是多了几个文件:
1.include/asm –> arch/arm/include/arm
2.include/asm/arch –> arch-s3c24x0
3.include/asm/proc –> proc-armv
4.在include目录下新建了config.mk文件,文件内容是ARCH CPU BOARD VENDOR SOC的界说
5.在include目录下新建了config.h文件
接着看make:
给出部分makefile中的注释,首要是一些变量的界说: