ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:19.15KB ,
资源ID:17240006      下载积分:6 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-17240006.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(转GNU ARM汇编十七uboot的makefile和mkconfig解读.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

1、转GNU ARM汇编十七uboot的makefile和mkconfig解读(转)GNU ARM汇编-(十七)u-boot的makefile和mkconfig解读 自己写的bootloader可以引导kernel了,我以为曾经神秘的u-boot代码将变得毫无挑战,然事实表明u-boot作为优秀的开源代码,阅读起来还是很有挑战的,值得一读! 阅读碰到的头等问题:Makefile和shell脚本看不懂. 说起来做linux也很久了,Makefile和shell脚本都接触过,但真的都是略懂而已.因为公司的Makefile和shell简单的一眼望的对穿,很初级的写法,简单的应用.再随便在网上下个老外的开

2、源代码,那个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和

3、make两步 以make smdk2410_config为例: 当以smdk2410_config为目标时,makefile中前面一些变量的定义和其他文件的引用也是有的,这个在原档中添加了有关注释: 在makefile中有: cpp view plaincopyunconfig: 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.de

4、p %_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=)是变量的替换引用 格式为“

5、$(VAR:A=B)”(或者“$VAR:A=B”),意思是:替换变量“VAR”中所有“A”字符结尾的字为“B”结尾的字。所以smdk2410_config末尾的_config去除了. 下面就是执行mkconfig脚本了,mkconfig -A smdk2410 给出添加注释的mkconfig文件: cpp view plaincopy#!/bin/sh -e # Script to create header files and links to configure # U-Boot for a specific board. # # Parameters: Target Architectu

6、re CPU Board VENDOR SOC # # (C) 2002-2010 DENX Software Engineering, Wolfgang Denk <wddenx.de> # APPEND=no # Default: Create new config file BOARD_NAME= # Name to print in make output TARGETS= arch= cpu= board= vendor= soc= options= echo $# if ( $# -eq 2 ) -a ( $1 = -A ) ; then # Automatic mod

7、e line=egrep -i :space:*$2:space: boards.cfg | echo make: * No rule to make target $2_config. Stop. >&2 exit 1 set $line echo $line echo $# # add default board name if needed $# = 3 && set $line $1 # #我们执行脚本的命令是mkconfig -A smdk2410,$#表示的是参数的个数,$1表示的是第一个参数 #line 就是在boards.cfg文件中smdk241

8、0的那行,而-i表示忽略大小写 #在boards.cfg文件中,有 #Target ARCH CPU Board name Vendor SoC Options #smdk2410 arm arm920t - samsung s3c24x0 # set $line # set也可用于在脚本内部给出其运行参数,所以这个时候参数就变为smdk2410 arm arm920t - samsung s3c24x0 #这个时候参数个数就变成6个了 # elif $MAKEFLAGS+set$MAKELEVEL+set = setset ; then # only warn when using a co

9、nfig target in the Makefile cat <<-EOF warning: Please migrate to boards.cfg. Failure to do so will mean removal of your board in the next release. EOF sleep 5 fi echo $1 while $# -gt 0 ; do case $1 in -) shift ; break ; -a) shift ; APPEND=yes ; -n) shift ; BOARD_NAME=$1%_config ; shift ; -t)

10、shift ; TARGETS=echo $1 | sed s:_: :g $TARGETS ; shift ; *) break ; esac done # #因为$1的值为smdk2410,所以case找不到对应的 # $# -lt 4 && exit 1 $# -gt 7 && exit 1 # #对参数个数做检查,小于4个或大于7个就退出 # # Strip all options and/or _config suffixes CONFIG_NAME=$1%_config # #CONFIG_NAME的值为smdk2410 # echo config_

11、 echo $CONFIG_NAME $BOARD_NAME | BOARD_NAME=$1%_config echo board 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 # $# -gt 4 &

12、& $5 != - && vendor=$5 $# -gt 5 && $6 != - && soc=$6 # #设定verdor变量的值为samsung #设定soc变量的值为s3c24x0 # $# -gt 6 && $7 != - && # check if we have a board config name in the options field # the options field mave have a board config name and a list # of options,

13、both separated by a colon (:); the options are # separated by commas (,). # # Check for board name tmp=$7%:* if $tmp ; then CONFIG_NAME=$tmp fi # Check if we only have a colon. if $tmp != $7 ; then options=$7#*: TARGETS=echo $options | sed s:,: :g $TARGETS fi # #因为我们的变量个数就是6个,这一段不执行 # echo $ARCH ech

14、o $arch if $ARCH -a $ARCH != $arch ; then echo Failed: $ARCH=$ARCH, should be $arch for $BOARD_NAME 1>&2 exit 1 fi # #ARCH是在顶层makefile中定义的,在此刻还是为空的。 #如果ARCH已经有值了,那么就检测ARCH和arch是否匹配了. # if $options ; then echo Configuring for $BOARD_NAME - Board: $CONFIG_NAME, Options: $options else echo Confi

15、guring for $BOARD_NAME board. fi # #我们没有定义options变量,所以输出Configuring for smdk2410 board. # # # Create link to architecture specific headers # echo $SRCTREE echo $OBJTREE if $SRCTREE != $OBJTREE ; then mkdir -p $OBJTREE/include mkdir -p $OBJTREE/include2 cd $OBJTREE/include2 rm -f asm ln -s $SRCTREE/a

16、rch/$arch/include/asm asm LNPREFIX=$SRCTREE/arch/$arch/include/asm/ cd ./include mkdir -p asm else cd ./include rm -f asm ln -s ./arch/$arch/include/asm asm fi # #在makefile中我们已经知道SRCTREE和OBJTREE都是当前目录,所以这里执行else #进入./include目录,删除asm链接,并重新建立链接asm,指向arch/arm/include/asm # rm -f asm/arch # #删除include目录

17、下的asm下的arch链接文件 # ss= echo $ss if -z $ss ; then echo null else echo not null fi echo $LNPREFIX if -z $soc ; then ln -s $LNPREFIXarch-$cpu asm/arch else ln -s $LNPREFIXarch-$soc asm/arch fi # #-z用来检测字符串是否为空,为空返回真 #这里我们的soc不为空,执行else #将asm/arch链向arch-s3c24x0,看一下arch-s3c24x0目录,里面都是s3c24x0相关的头文件 # if $a

18、rch = arm ; then rm -f asm/proc ln -s $LNPREFIXproc-armv asm/proc fi # #删除asm/proc链接文件 #将asm/proc链向proc-armv目录,该目录下是四个头文件:domain.hprocessor.hptrace.hsystem.h # # # Create include file for Make # echo ARCH = $arch > config.mk echo CPU = $cpu >> config.mk echo BOARD = $board >> config.m

19、k $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 # # Assign board directory to BOARDIR variable if -z $vendor ;

20、then BOARDDIR=$board else BOARDDIR=$vendor/$board fi echo $BOARDDIR # #因为vendor变量不为空,所以执行else #BOARDDIR的值为samsung/s3c24x0 # # # Create board specific header file # if $APPEND = yes # Append to existing config file then echo >> config.h else > config.h # Create new config file fi # #在文件的最开头可

21、以看到APPEND为no,所以这里我们在include文件夹下建立config.h文件 # echo /* Automatically generated - do not edit */ >>config.h echo $TARGETS for i in $TARGETS ; do i=echo $i | sed /=/ s/=/ /;q; ; s/$/ 1/; echo #define CONFIG_$i >>config.h ; done # #这里我们TARGETS为空,上面不执行了 # echo #define CONFIG_SYS_ARCH $arch &g

22、t;> config.h echo #define CONFIG_SYS_CPU $cpu >> config.h echo #define CONFIG_SYS_BOARD $board >> config.h $vendor && echo #define CONFIG_SYS_VENDOR $vendor >> config.h $soc && echo #define CONFIG_SYS_SOC $soc >> config.h cat << EOF >> config.h #define CONFIG_BOARDDIR board/$BOARDDIR #include <config_cmd_defaults.h> #include <config_defaults.h> #include &

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

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