uboot的文件框架
2、uboot的配置
首先肯定是先对uboot进行配置,因为这个UBOOT支持很多的的板子和芯片,所以首先肯定是先设定一下参数
TQ2416_config : unconfig
@$(MKCONFIG) $(@:_config=) arm s3c24xx TQ2416 EmbedSky s3c2416
@echo "RAM_TEXT = 0xC3E00000" > $(obj)board/EmbedSky/TQ2416/config.tmp
# @echo "#undef CONFIG_TQ2416_128MB" > $(obj)include/ddr_mem.h
这行这一行相当于是执行 。
./mkconfig TQ2416 arm s3c24xx TQ2416 EmbedSky s3c2416
mkconfig的用法是:
./mkconfig target(目标) architecture(架构) CPU board vendor soc
执行这个命令的结果是:
1)、开发板BOARD_NAME等于$1
2)、创建平台的的头文件链接 例如:
ln -s asm-$2 asm
ln -s arch-$6 asm-$2/arch
ln -s proc-armv asm-$2/proc
3)、创建顶层makefile包含的文件include/config.mk
ARCH =$2
CPU =$3
BOARD =$4
VENDOR=$5
SOC=$6
4)、创建开发板相关的头文件include/config.h
#include <configs/$1.h>
3、顶层config,mk对交叉编译器的选择
CROSS_COMPILE ?= arm-linux-
4,Uboot顶层makefile的编译链接过程
OBJS = cpu/$(CPU)/start.o
OBJS := $(addprefix $(obj),$(OBJS))
LIBS = lib_generic/libgeneric.a
LIBS += lib_generic/lzma/liblzma.a
LIBS += lib_generic/lzo/liblzo.a
LIBS += $(shell if [ -f board/$(VENDOR)/common/Makefile ]; then echo \
"board/$(VENDOR)/common/lib$(VENDOR).a"; fi)
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
以上的编译都是带有$(CPU)等这些变量,这些就是前面执行mkconfig而确定的。上面的OBJS 和 LIBS所代表的.o和.a就是uboot 的构成,他们是通过下面的语句编译得到的
$(OBJS): depend
$(MAKE) -C cpu/$(CPU) $(if $(REMOTE_BUILD),$@,$(notdir $@))
$(LIBS): depend $(SUBDIRS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
$(LIBBOARD): depend $(LIBS)
$(MAKE) -C $(dir $(subst $(obj),,$@))
$(SUBDIRS): depend
$(MAKE) -C $@ all
再进行编译链接的时候,是通过uboot.lds来指定编译顺序的。它是根据变量
TEXT_BASE来确定基地址
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/s3c24xx/start.o (.text)
cpu/s3c24xx/s3c2416/cpu_init.o (.text)
board/EmbedSky/TQ2416/lowlevel_init.o (.text)
cpu/s3c24xx/mmu_table.module (.text)
cpu/s3c24xx/nand_cp.o (.text)
cpu/s3c24xx/movi.module (.text)
*(.text)
lib_arm/div0.o
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
.mmudata : { *(.mmudata) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}