??本分析采用的不是官方u-boot,而是采用九鼎移植之后的u-boot,原u-boot版本为1.3.4。
??u-boot是我目前接触的除了无人机飞控外最复杂的软件系统。所有类似于这种的大型开源项目,软件一定是采用makefile或者cmake进行组织,我之前一直极力避开makefile的学习,导致我根本没有办法好好参与一个开源项目。
| 目录名 | 存放文件的作用 |
|---|---|
| api | 平台无关接口,具体可参看README |
| api_example | |
| board | u-boot支持的开发板,board-vendor-board三级结构 |
| common | 主要是cmd相关 |
| cpu | SoC相关的,用于串口中断等Soc内部外设初始化,start.S也在其中 |
| disk | |
| doc | |
| drivers | 主要是开发板上必须用到的一些驱动,如网卡驱动、Inand/SD卡、NandFlash等的驱动,来自于linux源码 |
| examples | |
| fs | filesystem,文件系统。这个也是从linux源代码中移植过来的。 |
| include | |
| lib_xxx | 架构相关的库文件 |
| libfdt | 设备树相关,与内核传参有关 |
| nand_spl | |
| net | 网络相关 |
| onenandxxx | |
| post | |
| sd_fusing | 实现了烧录uboot镜像到SD卡的代码 |
| tools | |
| 文件名 | 文件作用 |
|---|---|
| .gitignore | |
| arm_config.mk | |
| Changelog | |
| config.mk | |
| COPYING | 版权声明,GPL许可证 |
| CREDITS | 鸣谢 |
| image_split | 分割uboot.bin到BL1的 |
| MAINTAINERS | 维护者 |
| MAKEALL | 帮助编译uboot、 |
| Makefile | 主makefile |
| mk | 快速编译脚本 |
| mkconfig | 主要的配置脚本 |
| mkmovi | 和iNand/SD卡启动有关的脚本 |
| README | |
| rules.mk | makefile规则 |
??u-boot的使用需要经过两个阶段。
config
??首先需要到u-boot根目录下执行make x210_sd_config,如果出现Configuring for x210_sd board...,说明配置完成。
make
??直接make编译,编译前需要注意工具链的设置是否正确。
??一般分为两个方面。一部分为编译环境中有没有安装正确的编译链工具。另一方面为检查makefile文件中编译器的设置是否正确。
??多核电脑可以使用make -jx,x为核心数,使编译加快。
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION = 0nism
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h??version_autogenerated.h为编译时生成
HOSTARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/ -e s/powerpc/ppc/ -e s/ppc64/ppc/ -e s/macppc/ppc/)
HOSTOS := $(shell uname -s | tr ‘[:upper:]‘ ‘[:lower:]‘ | sed -e ‘s/\(cygwin\).*/cygwin/‘)??uname -m用于了解主机的架构
??uname -s用于了解主机的操作系统
# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif??使用make -s即可静默编译
??u-boot的编译的obj文件可以选择原地编译或者输出至特定目录。
??第一种可以make O=/tmp/build all。第二种可以设置环境变量export BUILD_DIR=/tmp/build然后再make。O=的优先级高于BUILD_DIR。
??配置过程中生成的重要配置文件,包含许多编译所需要的宏。
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
# ARCH arm
# CPU s5pc11x
# BOARD x210
# VENDOR samsung
# SOC s5pc110??决定交叉编译工具链前缀,前缀加后缀的结合就可以用来定义各种工具链中的工具。
ifeq ($(ARCH),arm)
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif??载入其他相关配置。
??# 执行根目录下MKCONFIG配置,传入6个参数,第一个参数为x210_sd。
x210_sd_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk| define | description | attribute |
|---|---|---|
| VERSION | 1 | |
| PATCHLEVEL | 3 | |
| SUBLEVEL | 4 | |
| EXTRAVERSION | 0nism | |
| U_BOOT_VERSION | $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION) | |
| VERSION_FILE | $(obj)include/version_autogenerated.h | |
| XECHO | 静默编译 | |
| HOSTARCH | 环境变量 | |
| HOSTOS | 环境变量 | |
| BUILD_DIR | ||
| OBJTREE | $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR)) | 环境变量 |
| SRCTREE | $(CURDIR) | 环境变量 |
| TOPDIR | $(SRCTREE) | 环境变量 |
| LNDIR | $(OBJTREE) | |
| MKCONFIG | $(SRCTREE)/mkconfig | 环境变量 |
| REMOTE_BUILD | 是否远程编译 | 环境变量 |
| obj | 环境变量 | |
| src | 环境变量 | |
| $(obj)include/config.mk | 宏集合 | 配置中生成 |
| ARCH | arm | 环境变量 |
| CPU | s5pc11x | 环境变量 |
| BOARD | x210 | 环境变量 |
| VENDOR | samsung | 环境变量 |
| SOC | s5pc110 | 环境变量 |
| CROSS_COMPILE | 确定交叉编译工具链前缀 | 环境变量 |
| $(TOPDIR)/config.mk | 配置集合 | 配置中生成 |
| OBJS | ||
| LIBS | ||
| LIBBOARD | ||
??该文件被主makefile预先包含,用于提供交叉编译工具链名称位置以及参数。还包含一些简单的编译规则。
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
LDR = $(CROSS_COMPILE)ldr
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB = $(CROSS_COMPILE)RANLIB# sinclude = -include 表示未找到文件不停止执行
# autoconf.mk是配置时自动生成的
sinclude $(OBJTREE)/include/autoconf.mk
ifdef ARCH
sinclude $(TOPDIR)/$(ARCH)_config.mk # include architecture dependend rules
endif
ifdef CPU
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # include CPU specific rules
endif
ifdef SOC
sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # include SoC specific rules
endif
ifdef VENDOR
BOARDDIR = $(VENDOR)/$(BOARD)
else
BOARDDIR = $(BOARD)
endif
ifdef BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
endif# 定义CONFIG_NAND_U_BOOT宏,链接名为u-boot-nand.lds,否则为u-boot.lds
ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif
endif# line 159-161
ifneq ($(TEXT_BASE),)
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif
# line 202-204
ifneq ($(TEXT_BASE),)
LDFLAGS += -Ttext $(TEXT_BASE)
endif??其他部分为简单的编译规则,例如原地编译规则等。还有编译器与预编译器参数设置。
??当输入make x210_sd_config时,就会按照主makefile文件分析的一样,执行mkconfig。
??从makefile中可以知道,传入了6个参数
$(@:_config=) arm s5pc11x x210 samsung s5pc110| arg | description |
|---|---|
| $1 | x210_sd,是将x210_sd_config的后半部分去掉 |
| $2 | arm |
| $3 | s5pc11x |
| $4 | x210 |
| $5 | samsumg |
| $6 | s5pc110 |
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1??大于四,小于六
??第一个链接为./include/asm
./inlcude/asm-arm
??第二个链接为./include/asm-arm/arch
./include/arch-s5pc110
??第三个链接为./include/regs.h
./include/s5pc110.h
??删除第二个
??第四个链接为./include/asm-arm/arch
./include/asm-arm/arch-s5pc11x
??第五个链接为./include/asm-arm/proc
./include/asm-arm/proc-armv
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mkif [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h??创建include/config.h 内容为
"/* Automatically generated - do not edit */"和#include <configs/$1.h>
原文:https://www.cnblogs.com/0nism/p/12380549.html