U-boot(二):主Makefile

本文主要探讨210的主Makefile。

Makefile

uboot版本号:

VERSION:主板本号

PATCHLEVEL:次版本号

SUBLEVEL:再次版本号

EXTRAVERSION:附加信息

VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h

root@kaxi-virtual-machine:~/qt_x210v3s_160307/uboot# cat include/version_autogenerated.h 
#define U_BOOT_VERSION "U-Boot 1.3.4"

宿主机参数

HOSTARCH:宿主机架构

HOSTOS:宿主机系统

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/')

export  HOSTARCH HOSTOS

静默编译

make -s

# Allow for silent builds
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif

指定编译结果路径

O参数(优先级高)

        make O=/tmp/build distclean
        make O=/tmp/build NAME_config
        make O=/tmp/build all

设置环境变量

        export BUILD_DIR=/tmp/build
        make distclean
        make NAME_config
        make all

OBJTREE:默认当前目录,O参数可指定输出目录

SRCTREE: 源码目录(uboot一级目录)

ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif

ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)

# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})

# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)

OBJTREE         := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE         := $(CURDIR)
TOPDIR          := $(SRCTREE)
LNDIR           := $(OBJTREE)
export  TOPDIR SRCTREE OBJTREE

MKCONFIG        := $(SRCTREE)/mkconfig
export MKCONFIG

ifneq ($(OBJTREE),$(SRCTREE))
REMOTE_BUILD    := 1
export REMOTE_BUILD
endif

# $(obj) and (src) are defined in config.mk but here in main Makefile
# we also need them before config.mk is included which is the case for
# some targets like unconfig, clean, clobber, distclean, etc.
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src

# Make sure CDPATH settings don't interfere
unexport CDPATH

开发板配置

ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))

# load ARCH, BOARD, and CPU configuration
include $(obj)include/config.mk
export  ARCH CPU BOARD VENDOR SOC

make x210_sd_config(调用mkconfig脚本) ==> include/config.mk

x210_nand_config :      unconfig
        @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
        @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

root@kaxi-virtual-machine:~/qt_x210v3s_160307/uboot# cat include/config.mk
ARCH   = arm
CPU    = s5pc11x
BOARD  = x210
VENDOR = samsung
SOC    = s5pc110

编译工具链

CROSS_COMPILE:工具链(可外部定义:路径(/usr/local/arm/arm-2009q3/bin/)+工具链标签(arm-none-linux-gnueabi-))

$(TOPDIR)/config.mk(94-107定义完整工具链:路径+工具链标签+gcc)

#
# Include the make variables (CC, etc...)
#
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

Makefile(291)开始编译目标

unconfig目标可多次配置

x210_nand_config :      unconfig
        @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
        @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

解析config.mk

$(TOPDIR)/config.mk(uboot/config.mk)

加载宏(开发板配置)(112)

# Load generated board configuration
sinclude $(OBJTREE)/include/autoconf.mk

文件指导uboot编译过程,包含CONFIG_xxx宏它由源码目录inlcude/configs/xxx.h头文件生成(其他开发板)

210使用include/configs/x210_sd.h

加载链接脚本(142-149,board/samsung/x210/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

定义链接脚本地址(156-158,board/samsung/x210/config.mk)

ifneq ($(TEXT_BASE),)
CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
endif

root@kaxi-virtual-machine:~/qt_x210v3s_160307/uboot# cat board/samsung/x210/config.mk
TEXT_BASE = 0xc3e00000

TEXT_BASE是uboot链接地址由于启用虚拟地址映射,C3E00000地址等于0x23E00000

自动推导规则(239-256)

ifndef REMOTE_BUILD

%.s:    %.S
        $(CPP) $(AFLAGS) -o $@ $<
%.o:    %.S
        $(CC) $(AFLAGS) -c -o $@ $<
%.o:    %.c
        $(CC) $(CFLAGS) -c -o $@ $<

else

$(obj)%.s:      %.S
        $(CPP) $(AFLAGS) -o $@ $<
$(obj)%.o:      %.S
        $(CC) $(AFLAGS) -c -o $@ $<
$(obj)%.o:      %.c
        $(CC) $(CFLAGS) -c -o $@ $<
endif

解析mkconfig(uboot/mkconfig)

x210_nand_config :      unconfig
        @$(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
        @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk

6个参数 :$(@:_config=) arm s5pc11x x210 samsung s5pc110

$1: x210_sd

$2: arm

$3: s5pc11x

$4: x210

$5: samsumg

$6: s5pc110

$# = 6

BOARD_NAME=x210_sd

创建符号链接(33-118,便于移植)

uboot/include:asm -> asm-arm

uboot/inlcude/asm-arm:arch->arch-s5pc11x

uboot/include:regs.h->s5pc110.h

uboot/include/asm-arm:proc->proc-armv

创建include/config.mk文件用于主Makefile配置开发板(123-129)

#
# Create include file for Make
#
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.mk

默认追加#include <configs/x210_sd.h>(开发板配置宏)到include/config.h(134-141)

...

APPEND=no       # Default: Create new config file

...

#
# Create board specific header file
#
if [ "$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

链接脚本(uboot/board/samsung/x210/u-boot.lds)

ENTRY(_start)程序入口地址

指定链接地址:-Ttext 0x00000000;(优先级高),链接脚本SECTIONS中定义. = 0x00000000

uboot链接地址用-Ttext指定(make x210_sd_config ==> uboot/board/samsung/x210/config.mk(定义TEXT_BASE))

链接脚本*(.text)前部分为前16KB(基础的初始化)其余为16KB之后,便于烧录,

链接脚本除.text .data .rodata .bss段还有自定义段(.u_boot_cmd)

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
        . = 0x00000000;

        . = ALIGN(4);
        .text      :
        {
          cpu/s5pc11x/start.o   (.text)
          cpu/s5pc11x/s5pc110/cpu_init.o        (.text)
          board/samsung/x210/lowlevel_init.o    (.text)
          cpu/s5pc11x/onenand_cp.o      (.text)                 
          cpu/s5pc11x/nand_cp.o (.text)                     
          cpu/s5pc11x/movi.o (.text) 
          common/secure_boot.o (.text) 
          common/ace_sha1.o (.text)
          cpu/s5pc11x/pmic.o (.text)
          *(.text)
        }

        . = 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 = .;
}
相关推荐
南城花随雪。14 分钟前
单片机:实现驱动超声波(附带源码)
单片机·嵌入式硬件
yutian06069 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
析木不会编程12 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
枯无穷肉16 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名67716 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件
嵌入式大圣16 小时前
单片机UDP数据透传
单片机·嵌入式硬件·udp
云山工作室17 小时前
基于单片机的视力保护及身姿矫正器设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
嵌入式-老费17 小时前
基于海思soc的智能产品开发(mcu读保护的设置)
单片机·嵌入式硬件
liyinuo201719 小时前
嵌入式(单片机方向)面试题总结
嵌入式硬件·设计模式·面试·设计规范
艺术家天选19 小时前
STM32点亮LED灯
stm32·单片机·嵌入式硬件