uboot114移植分析.docx
- 文档编号:11190083
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:24
- 大小:24.19KB
uboot114移植分析.docx
《uboot114移植分析.docx》由会员分享,可在线阅读,更多相关《uboot114移植分析.docx(24页珍藏版)》请在冰豆网上搜索。
uboot114移植分析
第一部分
u-boot-1.1.4的源程序代码结构分析
本文档详细的分析了u-boot-1.1.4的源代码结构,主要的手段是通过详细的分析它的makefile文件与config.mk文件来实现的.我的u-boot-1.1.4的安装目录为/ubootdevlep/u-boot-1.1.4,所以下面的分析全部都是基于这个目录下的.文件或者是子目录下的makefile文件与config.mk文件.
一.makefile与config.mk文件层次结构
1./ubootdevlep/u-boot-1.1.4/
config.mk
makefile
2./ubootdevlep/u-boot-1.1.4/board/dave/B2
config.mk
makefile
3./ubootdevlep/u-boot-1.1.4/common/
makefile
4./ubootdevlep/u-boot-1.1.4/cpu/s3c44b0/
config.mk
makefile
5./ubootdevlep/u-boot-1.1.4/disk/
makefile
6./ubootdevlep/u-boot-1.1.4/dtt/
makefile
7./ubootdevlep/u-boot-1.1.4/drivers/
makefile
8./ubootdevlep/u-boot-1.1.4/drivers/sk98lin/
makefile
9./ubootdevlep/u-boot-1.1.4/examples/
makefile
10./ubootdevlep/u-boot-1.1.4/fs/
makefile
11./ubootdevlep/u-boot-1.1.4/include/
无
12./ubootdevlep/u-boot-1.1.4/lib_arm/
makefile
13./ubootdevlep/u-boot-1.1.4/lib_generic/
makefile
14./ubootdevlep/u-boot-1.1.4/net/
makefile
15./ubootdevlep/u-boot-1.1.4/post/
makefile
16./ubootdevlep/u-boot-1.1.4/post/cpu/
makefile
17./ubootdevlep/u-boot-1.1.4/rtc/
makefile
18./ubootdevlep/u-boot-1.1.4/tools/
makefile
19./ubootdevlep/u-boot-1.1.4/tools/bddb
无
20./ubootdevlep/u-boot-1.1.4/tools/easylogo/
makefile
21./ubootdevlep/u-boot-1.1.4/tools/env/
makefilefw_env.config
22./ubootdevlep/u-boot-1.1.4/tools/gdb/
makefile
因为我们分析的主要是基于s3c44b0这个cpu的,以及使用的是dave/B2下的板子,还有使用的是lib_arm下的东西,所以就分析这些了.
二.按照上面的结构来分析
第一步:
首先编译一下u-boot-1.1.4,以root身分登录linux操作系统(我们的是RedHat),编译的时候注意修改一下/ubootdevlep/u-boot-1.1.4/cpu/s3c44b0/config.mk这个文件,修改如下:
把PLATFORM_CPPFLAGS+=$(callcc-option,-mapcs-32,-mabi=apcs-gnu)这么一行修改为
#PLATFORM_CPPFLAGS+=$(callcc-option,-mapcs-32,-mabi=apcs-gnu)
PLATFORM_CPPFLAGS+=$(callcc-option,-mapcs-32,$(callcc-option,-mabi=apcs-gnu),)
第二步:
在命令行输入
[root@tanhangroot]#cd/ubootdevlep/u-boot-1.1.4
[root@tanhangu-boot-1.1.4]#makeB2_config
[root@tanhangu-boot-1.1.4]#makeall
如果编译成功了就可会在/ubootdevlep/u-boot-1.1.4/目录下生成几个文件,它们是:
u-bootu-boot.binu-boot.mapu-boot.srecSystem.map这么几个文件,如果还想生成其它的一些文件的话,就要参考这个目录下的makefile文件的那些可以使用的命令了.比如用命令makeu-boot.dis就可在当前目录生成u-boot.dis文件了.
第三步:
分析那些比较重要的makefile文件与config.mk文件
1./ubootdevlep/u-boot-1.1.4/
config.mk
makefile
这2个文件处在u-boot-1.1.4的顶级目录上,具有统筹全局的重要作用,全部的变量都是靠这两个文件来导入与导出的.
(1)config.mk
第一段:
首先定义这么三个变量
PLATFORM_RELFLAGS=
PLATFORM_CPPFLAGS=
PLATFORM_LDFLAGS=
其中第一个变量我暂时还没理解,第2个变量是定义C源文件的编译规则的,第3个变量是定义链接过程的规则的,它与我们的u-boot-1.1.4/board/dave/B2/目录下的u-boot.lds有关系.
第二段:
这个文件接着就有3个条件选择,它们都是用ifeq开头,用endif结尾的,比如这么一个吧(关心arm体系结构的编译):
ifeq($(ARCH),arm)
ifeq($(CROSS_COMPILE),powerpc-netbsd-)
PLATFORM_CPPFLAGS+=-D__ARM__
endif
具体含义就是,如果ARCH是arm的话,又如果CROSS_COMPILE是powerpc-netbsd-这个编译器的话,就对编译的规则扩展一下.
小插曲:
上面有两个变量,一个是ARCH,一个是CROSS_COMPILE,如果你在这个目录中的makefile文件中不指定编译器的话,就会出现这样的默认的编译器,这个编译器就是powerpc-netbsd-,所以就必需要指定这个编译器了,但是如果你在编译使用makeall前没有指定比如:
makeB2_config的话,就会读一个你上次配置的一个默认的配置文件,这个文件是你上次使用
makeXX_config产生的.
在这里容易产生一个疑问,那就是我们的这些变量到底这么获得的问题,比如这个文件后面使用了ARCH,CPU,VENDOR,SOC,TOPDIR等,这些变量都是在与它同一个目录下的makefile文件里面获得的,看它使用了这么几行:
makefile文件中:
TOPDIR:
=$(shellif["$$PWD"!
=""];thenecho$$PWD;elsepwd;fi)
exportTOPDIR
ifeq(include/config.mk,$(wildcardinclude/config.mk))
#loadARCH,BOARD,andCPUconfiguration
includeinclude/config.mk
exportARCHCPUBOARDVENDORSOC
#loadotherconfiguration
include$(TOPDIR)/config.mk
从这里明显的看的到在ARCHCPUBOARDVENDORSOC这些变量就可以在config.mk文件中使用了.再监查一下include/config.mk下的内容,如下:
ARCH=arm
CPU=s3c44b0
BOARD=B2
VENDOR=dave
从上面就知道了在我们包括include$(TOPDIR)/config.mk这个文件前ARCHCPUBOARDVENDOR这些变量有了初值.
第三段:
/ubootdevlep/u-boot-1.1.4/config.mk这个文件然后就是监查我们的ARCH,CPU,VENDOR,SOC,BOARD这些变量是否被定义了?
然后在包含相应的编译规则,比如:
对ARCH是这么做的,
ifdefARCH
sinclude$(TOPDIR)/$(ARCH)_config.mk#includearchitecturedependendrules
endif
这么作的目的就是要包含体系构架所倚赖的规则了!
!
!
因为我们这次编译使用的是arm,所以他会求得$(TOPDIR)/$(ARCH)_config.mk这个得到/ubootdevlep/u-boot-1.1.4/arm_config.mk这个文件被包含进取了.其它的都雷同了,就不多说了!
!
注意$(TOPDIR)=/ubootdevlep/u-boot-1.1.4,就是你安装u-boot-1.1.4的目录.$(ARCH)_config.mk=_arm_config.mk
细心看看:
ifdefARCH
sinclude$(TOPDIR)/$(ARCH)_config.mk#includearchitecturedependendrules
endif
ifdefCPU
sinclude$(TOPDIR)/cpu/$(CPU)/config.mk#includeCPUspecificrules
endif
ifdefSOC
sinclude$(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk#includeSoCspecificrules
endif
ifdefVENDOR
BOARDDIR=$(VENDOR)/$(BOARD)
else
BOARDDIR=$(BOARD)
endif
ifdefBOARD
sinclude$(TOPDIR)/board/$(BOARDDIR)/config.mk#includeboardspecificrules
endif
第四段:
配置shell文件,使用变量CONFIG_SHELL:
=”一串不好离解的东西”
接着配置主机的编译器:
ifeq($(HOSTOS)-$(HOSTARCH),darwin-ppc)
HOSTCC=cc
else
HOSTCC=gcc
endif
HOSTCFLAGS=-Wall-Wstrict-prototypes-O2-fomit-frame-pointer
HOSTSTRIP=strip
第五段:
配置编译u-boot的交叉编译器,还要使用一个生成u-boot的加载文件u-boot.lds.
AS=$(CROSS_COMPILE)as
LD=$(CROSS_COMPILE)ld
CC=$(CROSS_COMPILE)gcc
CPP=$(CC)-E
AR=$(CROSS_COMPILE)ar
NM=$(CROSS_COMPILE)nm
STRIP=$(CROSS_COMPILE)strip
OBJCOPY=$(CROSS_COMPILE)objcopy
OBJDUMP=$(CROSS_COMPILE)objdump
RANLIB=$(CROSS_COMPILE)RANLIB
RELFLAGS=$(PLATFORM_RELFLAGS)
DBGFLAGS=-g#-DDEBUG
OPTFLAGS=-Os#-fomit-frame-pointer
ifndefLDSCRIPT
#LDSCRIPT:
=$(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
LDSCRIPT:
=$(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif
OBJCFLAGS+=--gap-fill=0xff
这个文件后面的那些就不难离解了,看看就够了.
(2)/ubootdevlep/u-boot-1.1.4/Makefile文件分析
第一段:
由脚本文件求得HOSTARCH,HOSTOS(主机体系结构,主机操作系统)然后把这2个变量导出去,这样的话上面介绍的那个config.mk文件就可引用它们了.
接着定义VENDOR=
第二段:
求顶级目录并输出这个目录
TOPDIR:
=$(shellif["$$PWD"!
=""];thenecho$$PWD;elsepwd;fi)
exportTOPDIR
下面这段前面有了说明了,这里就是要加载include/config.mk文件与$(TOPDIR)/config.mk文件.
ifeq(include/config.mk,$(wildcardinclude/config.mk))
#loadARCH,BOARD,andCPUconfiguration
includeinclude/config.mk
exportARCHCPUBOARDVENDORSOC
#loadotherconfiguration
include$(TOPDIR)/config.mk
接着要作的事情就是在没有定义交叉编译器的情况下(一般是这样的),
ifndefCROSS_COMPILE这一句来说明的看是不是没定义这个东西
接下去就是通过看我们的ARCH这个变量是什么来配置相应的交叉编译器.
比如我们在编译的时候就修改了这部分,指定我们用的交叉编译器为arm-elf-,下面是修改后的情形.
ifeq($(ARCH),arm)
CROSS_COMPILE=arm-elf-
endif
然后再把这个CROSS_COMPILE变量输出去,必然到下一级别看到这个变量就不知道在哪里定义的了,呵呵!
!
!
!
!
第三段:
这一段给出U-Boot目标的顺序,这个非常重要,因为可执行文件要安按一个顺序排列源代码的,这个顺序就是
start.o文件必需要在最前面,所以也能看出,如果要想找到u-boot的第一个执行代码文件就是这个start.S文件了,start.o文件是通过start.S文件所在目录下的makefile文件编译出来的.
所以在这里就要使用下面的语句来把它求出来:
OBJS=cpu/$(CPU)/start.o,这里给出的就是一个目录了,就我们的来说就是
/ubootdevlep/u-boot-1.1.4/cpu/s3c44b0这个目录下的start.o文件了.与它对应的start.S汇编代码文件就是u-boot-1.1.4执行的第一个最重要的文件,一切分析源代码的工作都从这里开始.!
!
!
然后就是配置LIBS这些库了,这个也蛮重要的,但很容易离解:
LIBS=lib_generic/libgeneric.a
LIBS+=board/$(BOARDDIR)/lib$(BOARD).a
LIBS+=cpu/$(CPU)/lib$(CPU).a
经过上面的配置就会在相应的目录下产生.a文件了.
还要注意生成一个lib_arm文件
LIBS+=lib_$(ARCH)/lib$(ARCH).a
因为这里的ARCH是arm,所以这个文件就是在lib_arm/libarm.a了呵呵!
!
!
!
!
最后配置了GCC库
看看这个
SUBDIRS=tools\
examples\
post\
post/cpu
.PHONY:
$(SUBDIRS)
是一些子目录!
!
!
第四段:
编译使用的命令
ALL=u-boot.srecu-boot.binSystem.map
all:
$(ALL)
这么两条语句声明了如果在命令行使用makeall的话就可疑生成3个文件,它们都放在了最顶层目录下.
如果想生成别的目标文件的话,可加在ALL的后面,比如要多生成一个16进制的文件只要在ALL后面加一个u-boot.hex就可以了,成为:
ALL=u-boot.srecu-boot.binSystem.mapu-boot.hex
第五段:
makeXXX_config命令的执行
我们只关心
#########################################################################
##S3C44B0Systems
#########################################################################
这里面的,其它的都差不多的,看看
B2_config:
unconfig
@./mkconfig$(@:
_config=)arms3c44b0B2dave
再看看这个文件/ubootdevlep/u-boot-1.1.4/include/config.mk的内容
ARCH=arm
CPU=s3c44b0
BOARD=B2
VENDOR=dave
所以就知道这个文件是执行makeB2_config命令的时候自动生成的.首先是通过unconfig删除原先的内容了,然后再通过执行./mkconfig来写这个文件!
!
!
!
!
!
!
!
这个文件的其它部分就不需要这么分析了,完!
!
!
!
!
下面是这个文件最重要的部分,好好看看就明白了,前面也说了一些的!
!
ALL=u-boot.srecu-boot.binSystem.map
all:
$(ALL)
u-boot.hex:
u-boot
$(OBJCOPY)${OBJCFLAGS}-Oihex$<$@
u-boot.srec:
u-boot
$(OBJCOPY)${OBJCFLAGS}-Osrec$<$@
u-boot.bin:
u-boot
$(OBJCOPY)${OBJCFLAGS}-Obinary$<$@
u-boot.img:
u-boot.bin
./tools/mkimage-A$(ARCH)-Tfirmware-Cnone\
-a$(TEXT_BASE)-e0\
-n$(shellsed-n-e's/.*U_BOOT_VERSION//p'include/version.h|\
sed-e's/"[]*$$/for$(BOARD)board"/')\
-d$<$@
u-boot.dis:
u-boot
$(OBJDUMP)-d$<>$@
u-boot:
depend$(SUBDIRS)$(OBJS)$(LIBS)$(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP)-x$(LIBS)|sed-n-e's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
$(LD)$(LDFLAGS)$$UNDEF_SYM$(OBJS)\
--start-group$(LIBS)--end-group$(PLATFORM_LIBS)\
-Mapu-boot.map-ou-boot
$(LIBS):
$(MAKE)-C`dirname$@`
$(SUBDIRS):
$(MAKE)-C$@all
gdbtools:
$(MAKE)-Ctools/gdb||exit1
dependdep:
@fordirin$(SUBDIRS);do$(MAKE)-C$$dir.depend;done
tags:
ctags-w`find$(SUBDIRS)include\
lib_genericboard/$(BOARDDIR)cpu/$(CPU)lib_$(ARCH)\
fs/cramfsfs/fatfs/fdosfs/jffs2\
netdiskrtcdttdriversdrivers/sk98lincommon\
\(-nameCVS-prune\)-o\(-name'*.[ch]'-print\)`
etags:
etags-a`find$(SUBDIRS)include\
lib_genericboard/$(BOARDDIR)cpu/$(CPU)lib_$(ARCH)\
fs/cramfsfs/fatfs/fdosfs/jffs2\
netdiskrtcdttdriversdrivers/sk98lincommon\
\(-nameCVS-prune\)-o\(-name'*.[ch]'-print\)`
System.map:
u-boot
@$(NM)$<|\
grep-v'\(compiled\)\|\(\.o$$\)\|\([aUw]\)\|\(\.\.ng$$\)\|\(LASH[RL]DI\)'|\
sort>System.map
第二部分移植初步(仅仅是选择一个合适的模板编译)
u-boot在lpc2294上的移植
我们的cpu以s3c44b0这个cpu为模板,以board目录下的dave作为我们的移植模板,具体是这样的.
假设当前目录是在u-boot-1.1.4下的话
第一步:
#cdboard
#cp-rdavelpc22xx(移植lpc22xx系列的开发板)
#cdlpc22xx
#mvB2lpc2294(我们的板子名lpc2294)
#cdlpc2294
#mvB2.clpc2294.c
修改Makefile及lpc2294.c,主要是B2改成wx20.
第二步:
增加配置文件:
#cdinclude/configs
#cpB2.hlpc2294.h
修改u-boot-1.1.4目录下的Makefile文件,增加lpc2294_config.
wx20_config:
unconfig
@./mkconfig$(@:
_config=)armlpclpc2294lpc22xx
[注:
前面的数字是文件行号,以下一样].
将board/wx目录下和wx20.h文件中的B2改成wx20或WX20.
第三步:
cdcpu
cp-rs3c44b0lpc
修改u-boot-1.1.4/board/lpc22xx/lpc2294目录下的u-boot.lds文件
主要是把cpu/s3c44b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uboot114 移植 分析