您的位置:首页 > 其它

uboot 编译过程

2012-02-23 17:18 204 查看
—— 百度了一下,觉得不错,非常适合我这个linux/android菜鸟 感谢原创作者,原文地址
http://redboot.blogbus.com/tag/%E9%85%8D%E7%BD%AE/

现在介绍一下u-boot的编译过程,这里用的uboot版本是U-Boot 2008.10,硬件用smdk2410,这个板子用得比较普遍,uboot已经有对其的支持。通过我们对编译过程和代码的了解,我们也容易用uboot支持我们自己需要的硬件。

编译命令非常简单:

make smdk2410_config (生成配置)

make all (生成最终文件)

当然,更好的做法是把编译出的文件生成到另外一个目录,并make clean如:

export BUILD_DIR=../tmp

make distclean

make smdk2410_config

make all

现在,我们可以来看看Makefile,u-boot的Makefile文件非常大。但是,其结构却并不复杂。

u-boot已经支持了很多硬件,前半部分是共用部分,编译出最终的uboot可执行文件。

而后半部分,是为各种不同的硬件进行配置,每种硬件有一个目标,每个的做法都非常类似,我们用到的是:

smdk2410_config : unconfig

@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

这里的 MKCONFIG := $(SRCTREE)/mkconfig

实际上是调用脚本mkconfig,而这个脚本做的工作简单如下:

建立config.mk文件

echo "ARCH = $2" > config.mk

echo "CPU = $3" >> config.mk

echo "BOARD = $4" >> config.mk

echo "VENDOR = $5" >> config.mk

echo "SOC = $6" >> config.mk

建立config.h

echo "#include <configs/$1.h>" >>config.h



在这里$1-$6的值分别是:smdk2410 arm arm920t smdk2410 NULL s3c24x0

而执行了 make smdk2410_config 之后,就生成了相应的config.mk,config.h两个文件。

在config.mk文件中,定义了相应硬件信息 : ARCH CPU BOARD VENDOR SOC

在config.h文件中,包含了相应硬件的头文件smdk2410.h ,位于include\configs目录下。

如果新建自己的硬件项目,那么也需要建立相应的头文件在这个地方。

这样,uboot的配置已经生成,下一次介绍make all的过程。



接着上次,这次介绍make all的过程。

首先,介绍一下生成的config.mk 和 config.h如何使用,得到正确配置的。

config.mk直接被include到Makefile来,并使用其定义如下:

include $(obj)include/config.mk

export ARCH CPU BOARD VENDOR SOC

这样可以直接选择需要编译的模块,例如:

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

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

LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a

config.h被include/common.h所包含,而它有包含了相应硬件的头文件。

common.h <--- config.h <--- smdk2410.h

除了在源程序中,使用这些头文件的定义之外,uboot还有一个脚本通过解析common.h以及其包含的所有头文件信息,来生成配置信息如下形式:

CONFIG_BAUDRATE=115200

CONFIG_NETMASK="255.255.255.0"

CONFIG_DRIVER_CS8900=y

CONFIG_ARM920T=y

CONFIG_RTC_S3C24X0=y

CONFIG_CMD_ELF=y

而头文件的定义的形式如下,对比可以看出脚本的工作原理。

#define CONFIG_BAUDRATE 115200

#define CONFIG_NETMASK 255.255.255.0

#define CONFIG_DRIVER_CS8900 1 /* we have a CS8900 on-board */

#define CONFIG_ARM920T 1 /* This is an ARM920T Core */

#define CONFIG_RTC_S3C24X0 1

#define CONFIG_CMD_ELF

通过这样,uboot可以自动得到一个模块选择的配置功能。如果我们需要添加什么定义或者功能,也可以在相应的头文件中加入定义实现。

现在,配置已经得到,就看最后的编译流程。

编译分为五大部分,分别如下:

1. $(SUBDIRS) 工具,例子等,包括目录:tools examples api_examples

2. $(OBJS) 启动模块 cpu/arm920t/start.o

3. $(LIBBOARD) 板子支持模块 board/smdk2410/libsmdk2410.a

4. $(LIBS) 其他模块,有诸如以下模块:

cpu/arm920t/libarm920t.a

cpu/arm920t/s3c24x0/libs3c24x0.a

lib_arm/libarm.a

fs/jffs2/libjffs2.a

fs/yaffs2/libyaffs2.a

net/libnet.a

disk/libdisk.a

drivers/bios_emulator/libatibiosemu.a

drivers/mtd/libmtd.a

drivers/net/libnet.a

drivers/net/phy/libphy.a

drivers/net/sk98lin/libsk98lin.a

drivers/pci/libpci.a

common/libcommon.a /

5. $(LDSCRIPT) 链接脚本

编译完成这五部分,链接成elf格式的u-boot文件,最后通过objcopy -O binary命令将elf格式转换成为raw binary格式的文件u-boot.bin就可以烧到板子上使用了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: