微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > uboot移植详解

uboot移植详解

时间:11-13 来源:互联网 点击:

g.mk))#config.mk存在

all:

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

sinclude$(obj)include/autoconf.mk

……

else #config.mk不存在

……

@echo"Systemnotconfigured-seeREADME">&2

@exit1

……

endif #config.mk

若include/config.mk文件存在,则$(wildcard$(obj)include/config.mk)命令执行的结果是“$(obj)include/config.mk”展开的字符串,否则结果为空。由于include/config.mk是“make_config”命令执行过程生成的,若从没有执行过“make_config”命令则include/config.mk必然不存在。因此Make就执行else分支的代码,在输出“Systemnotconfigured-seeREADME”的信息后就返回了。

117 include$(obj)include/config.mk

118 export ARCHCPUBOARDVENDORSOC

119

127 ifeq($(HOSTARCH),arm)

128 CROSS_COMPILE=arm-linux-

127 endif

163 #loadotherconfiguration

164 include$(TOPDIR)/config.mk

第117和164行用于包含其他的config.mk文件,第117行所包含的文件就是在上面的配置过程中制造出来的include/config.mk文件,其中定义了ARCH、CPU、BOARD、SOC等4个变量的值为arm、arm920t、TX2440、s3c24x0。第164行包含顶层的config.mk文件,它根据上面4个变量的值确定了编译器、编译选项。其中对我们理解编译过程有帮助的是BOARDDIR、LDFLAGS的值

#U-Bootobjects....orderisimportant(i.e.startmustbefirst)

169 OBJS=cpu/$(CPU)/start.o

LIBS+=cpu/$(CPU)/lib$(CPU).a

ifdefSOC

LIBS+=cpu/$(CPU)/$(SOC)/lib$(SOC).a

endif

ifeq($(CPU),ixp)

LIBS+=cpu/ixp/npe/libnpe.a

endif

LIBS+=lib_$(ARCH)/lib$(ARCH).a

LIBS+=fs/cramfs/libcramfs.afs/fat/libfat.afs/fdos/libfdos.afs/jffs2/libjffs2.a\

fs/reiserfs/libreiserfs.afs/ext2/libext2fs.afs/yaffs2/libyaffs2.a\

fs/ubifs/libubifs.a

……

LIBS+=common/libcommon.a

LIBS+=libfdt/libfdt.a

LIBS+=api/libapi.a

LIBS+=post/libpost.a

LIBS:=$(addprefix$(obj),$(LIBS))

LIBS变量指明了U-Boot需要的库文件,包括平台/开发板相关的目录、通用目录下相应的库,都通过相应的子目录编译得到的。

OBJS、LIBS所代表的.o、.a文件就是U-Boot的构成,他们通过如下命令由相应的源文件或相应的子目录下的文件编译得到

268 $(OBJS):
269 $(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))

271 $(LIBS):
272 $(MAKE) -C $(dir $(subst $(obj),,$@))

274 $(SUBDIRS):
275$(MAKE) -C $@ all

第268、269两行的规则表示,对于OBJS中的每个成员,都将进入cpu/$(cpu)目录编译他们。现在OBJS为cpu/arm920t/start.o,它将由cpu/arm920t/start.s编译得到。第271、272两行规则表示,对于LIBS中的每个成员,都将进入相应的子目录执行“make”命令。这些子目录中的Makefile,结构相似,他们将Makefile中指定的文件编译、链接成一个库文件。

当所有的OBJS、LIBS所表示的.o、.a文件都生成后就剩下链接了,这对用Makefile中如下代码

245 $(obj)u-boot.srec:$(obj)u-boot
246 $(OBJCOPY) ${OBJCFLAGS} -O srec $< $@

248 $(obj)u-boot.bin:$(obj)u-boot
249$(OBJCOPY) ${OBJCFLAGS} -O binary $< $@

251 $(obj)u-boot.img:$(obj)u-boot.bin
./tools/mkimage -A $(ARCH) -T firmware -C none \
- a $(TEXT_BASE) -e 0 \
-n $(shell sed -n -e s/.*U_BOOT_VERSION//p $(VERSION_FILE) | \
sed -e s/"[ ]*$$/ for $(BOARD) board"/) \
-d $< $@

263 $(obj)u-boot.dis:$(obj)u-boot
254 $(OBJDUMP) -d $< > $@

265 $(obj)u-boot:depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e s/.*\(__u_boot_cmd_.*\)/-u\1/p|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
266 --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
267 -Map u-boot.map -o u-boot

263到267的规则链接到ELF格式的U-Boot,最后转换为二进制格式的U-Boot.bin、S-Record格式的U-Boot.srec。LDFLAGS确定了连接的方式。(前面有提到)。

分析完这些对移植的整体轮廓应该有了一个认识,了解其原理了。具体要修改什么就要根据实际需要了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top