历史上的今天
今天是:2024年12月17日(星期二)
2020年12月17日 | TQ210 —— S5PV210 uboot顶层Makefile分析
2020-12-17 来源:eefocus
#
# (C) Copyright 2000-2008
# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
#
# See file CREDITS for list of people who contributed to this
# project.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundatio; either version 2 of
# the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
# MA 02111-1307 USA
#
##################################################################################
# U_BOOT_VERSION = 1.3.4
# 从2008年10月,发行版的名称的含义发生了变化,从数字版本号变为使用时间戳作为版本号,
# 使用发布年份和月份确定发布的版本号(VERSION和PATCHLEVEL),
# (SUBLEVEL和EXTRAVERSION)表示候选发布版或修复bug了的稳定版本
# 指定时间信息头文件和版本信息头文件
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
##################################################################################################################
# HOSTARCH这个变量的赋值,是通过执行一套shell程序来完成的,其中$(shell xxx)的语法就是在shell中执行xxx的命令.
# 这里的'|'就是linux中的管道处理符,''就是换行的连接符,表示下一行与本行是同行程序处理. uname -m,得到机器硬件名。
# sed -e允许在同一行里执行多条命令,就是表示后面跟的是一串命令脚本,s/abc/def/的命令表达式,
# 就是表示要从标准输入中,查找到内容为abc的,然后替换成def。例如电脑使用Intel Core2系列的CPU,因此"uname –m"
# 输出"i686"。 "i686"可以匹配命令"sed -e s/i.86/i386/"中的"i.86",因此在执行Makefile时,HOSTARCH将被设置成"i386" 。
# 这样执行这一套程序下来,就知道了机器的硬件体系了。
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/)
##########################################################################################
# "uname –s"输出主机内核名字,因此"uname –s"结果是"Linux"。
# "tr '[:upper:]' '[:lower:]'"作用是将标准输入中的所有大写字母转换为响应的小写字母。
# 结果是将HOSTOS = "linux"
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' |
sed -e 's/(cygwin).*/cygwin/')
#########################################################################
# export等价于C中的extern,即变量全局可用,这样这些变量将设置成环境变量
# export的作用就是将自定义变量转成环境变量【环境变量就是在哪里都能用】
export HOSTARCH HOSTOS
# Deal with colliding definitions from tcsh etc.
# 定义生产厂家名称
VENDOR=
#########################################################################
# Allow for silent builds
################################################################################
# 检查是否禁止在编译过程中向终端输出信息,findstring函数检查MAKEFLAGS是否为参数s
# 如编译uboot时,输入make -s,则MAKEFLAGS = s,执行XECHO = echo,即输出编译信息
# 否则XECHO = :,不输出编译信息
ifeq (,$(findstring s,$(MAKEFLAGS)))
XECHO = echo
else
XECHO = :
endif
#########################################################################
#
# U-boot build supports producing a object files to the separate external
# directory. Two use cases are supported:
#
# 1) Add O= to the make command line
# 'make O=/tmp/build all'
#
# 2) Set environement variable BUILD_DIR to point to the desired location
# 'export BUILD_DIR=/tmp/build'
# 'make'
#
# The second approach can also be used with a MAKEALL script
# 'export BUILD_DIR=/tmp/build'
# './MAKEALL'
#
# Command line 'O=' setting overrides BUILD_DIR environent variable.
#
# When none of the above methods is used the local build is performed and
# the object files are placed in the source directory.
#
#########################################################################
# U-boot支持定义源码及生成的目标文件存放的目录的功能。有两种方法可以实现:
# 1)指定编译参数 O=目录,例如:make O= /tmp/build all
# 2)设置环境变量BUILD_DIR,该变量指定目录并设置为设置为环境变量
# 例如:export BUILD_DIR=/tmp/build 然后 make
# 第二种方法同样可以用在一个 MAKEALL脚本
# 例如:export BUILD_DIR=/tmp/build 然后执行之 ./MAKEALL
# 命令行参数的设置会覆盖到 BUILD_DIR这一环境变量
# 如果不指定任何目录,则编译生成的目标文件存放在源代码的顶层目录下
#
# 如果参数O不为空(即使用了O参数),则利用函数origin返回的参数O的来源
# 函数$( origin, variable) 输出的结果是一个字符串,输出结果由变量variable定义的方式决定,
# 若variable在命令行中定义过,则origin函数返回值为"command line"。
# 假若在命令行中执行了“export BUILD_DIR=/tmp/build”的命令,则“$(origin O)”值为“command line”,
# 而BUILD_DIR被设置为“/tmp/build”。
ifdef O
ifeq ("$(origin O)", "command line")
BUILD_DIR := $(O)
endif
endif
#########################################################################
# 如果BUILD_DIR不为空,则将BUILD_DIR路径保存到saved-output中
ifneq ($(BUILD_DIR),)
saved-output := $(BUILD_DIR)
# Attempt to create a output directory.
# 如果BUILD_DIR不存在,则创建BUILD_DIR目录
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
# Verify if it was successful.
###############################################################################
# 执行cd命令进入BUILD_DIR目录,然后执行pwd命令得到当前目录路径【防止创建失败】
# if(a, b, c) —— 判断a的真假,为真执行b,为假执行c(类似三目运算符)
# 这段意思是如果BUILD_DIR创建成功,则什么不做,失败则返回error这段错误代码
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd)
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
endif # ifneq ($(BUILD_DIR),)
#########################################################################
# 普通的变量赋值,OBJTREE和LNDIR存放生成文件的目录,SRCTREE和TOPDIR为源码
# 目录,CURDIR变量指示当前的工作目录【uboot顶层目录】
# export将这些变量设置成环境变量
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
TOPDIR := $(SRCTREE)
LNDIR := $(OBJTREE)
export TOPDIR SRCTREE OBJTREE
#########################################################################
# MKCONFIG指向源码根目录下的mkconfig脚本文件,并设置为设置为环境变量
MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
#################################################################################
# 如果存放生成文件的目录和源码目录相同则REMOTE_BUILD = 1,并设置为设置为环境变量
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.
# $(obj)和$(src)在config.mk中有定义,但是在包含config.mk之前主Makefile在执行某些目标
# 如unconfig, clean, clobber, distclean, etc等的时候同样需要$(obj)和$(src)
#
# 如果OBJTREE和SRCTREE不同目录,则指定obj和src为OBJTREE和SRCTREE目录,
# obj:编译文件的输出目录,src:uboot代码顶层目录
# 作为编译输出文件的存放目录,一般OBJTREE和SRCTREE是相同的路径,否则obj和src为空
# 设置obj和src为环境变量
ifneq ($(OBJTREE),$(SRCTREE))
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src
# Make sure CDPATH settings don't interfere
# 撤销CDPATH为环境变量,设置其为文件私有,为了防止冲突
unexport CDPATH
#########################################################################
# 如果ARCH等价于powerpc,则ARCH等于ppc
ifeq ($(ARCH),powerpc)
ARCH = ppc
endif
##################################################################################################
# 检查include目录下是否存在config.mk文件,【wildcard函数是取匹配模式的文件名】
# 如果include下存在config.mk文件,则$(wildcard $(obj)include/config.mk)就会
# 返回$(obj)include/config.mk,如果不存在config.mk文件,则返回值为空。
# include目录下是否存在config.mk文件。
# 为什么要检查config.mk存在与否呢?原因是:我们在编译U-boot前必须配置目标板的信息,也就是要执行
# make xxx_config,xxx为目标板的名称,执行了这一步,会在$(obj)include/中生成一个config.mk
# 文件,里边一般记录有5个变量信息,这是U-boot必须获得的信息,没有它们U-boot就不能编译,会跳转到该
# ifeq的else分支执行,也就是提示错,else分支在文件尾部。
# 信息:System not configured - see README
# make ***[all] error 1
# 所以如果没有make xxx_config,直接make是编译不过去的,通过这样的判断U-boot就知道你是否已经做过
# make xxx_config这一步了。
ifeq ($(obj)include/config.mk,$(wildcard $(obj)include/config.mk))
# load ARCH, BOARD, and CPU configuration
########################################################################################
# 加载$(obj)include/config.mk,设置ARCH CPU BOARD VENDOR SOC5为环境变量
# ARCH = 目标板的CPU架构 CPU = 具体使用的CPU型号 BOARD = 目标板名称 SOC = 芯片名称
# TQ210【三星S5pv210】:ARCH=arm CPU=S5pv210 BOARD=TQ210 SOC= Cortex A8
include $(obj)include/config.mk
export ARCH CPU BOARD VENDOR SOC
#####################################################################################################
# 判断如果宿主机的架构和目标板的架构是同一种架构,则CROSS_COMPILE为空,也即采用宿主机默认的交叉编译链
# 通常我们将目标板使用的交叉工具链安装好以后,在宿主机中设置环境变量,指定开发板使用的交叉编译链
# 如果不采用设置环境变量的方法,则应该在使用make的时候指定工具链,例如:make CROSS_COMPILE=arm-linux-
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/arm-2009q3-4.4.1/bin/arm-none-linux-gnueabi-
#CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
#CROSS_COMPILE = /usr/local/arm/4.5.1/bin/arm-none-linux-gnueabi-
endif
ifeq ($(ARCH),i386)
CROSS_COMPILE = i386-linux-
endif
ifeq ($(ARCH),mips)
CROSS_COMPILE = mips_4KC-
endif
ifeq ($(ARCH),nios)
CROSS_COMPILE = nios-elf-
endif
ifeq ($(ARCH),nios2)
CROSS_COMPILE = nios2-elf-
endif
ifeq ($(ARCH),m68k)
CROSS_COMPILE = m68k-elf-
endif
ifeq ($(ARCH),microblaze)
CROSS_COMPILE = mb-
endif
ifeq ($(ARCH),blackfin)
CROSS_COMPILE = bfin-uclinux-
endif
ifeq ($(ARCH),avr32)
CROSS_COMPILE = avr32-linux-
endif
ifeq ($(ARCH),sh)
CROSS_COMPILE = sh4-linux-
endif
ifeq ($(ARCH),sparc)
CROSS_COMPILE = sparc-elf-
endif # sparc
endif # HOSTARCH,ARCH
endif # CROSS_COMPILE
export CROSS_COMPILE
# load other configuration
# 加载顶层目录的config.mk文件
include $(TOPDIR)/config.mk
史海拾趣
|
嵌入式系统是专用计算机应用系统,它具有一般计算机组成的共性,也是由硬件和软件组成。 图1-1完整地描述了嵌入式系统的软硬件各部分的组成结构。 2.1 嵌入式系统的硬件基本结构 嵌入式系统的硬件架构如图1-1下半部分所示,是以嵌入式处 ...… 查看全部问答> |
|
哪位朋友有STC单片机的下载器资料。我想制作一个下载器啊。谢谢啦 急急。。。。。。。。有的话 希望大家传个电路图上来看看 [ 本帖最后由 08221034 于 2010-6-1 20:54 编辑 ]… 查看全部问答> |
|
一块2440开发板烧写了NBoot,然后通过串口下载Eboot.nb0, void ComDownload() { int i,tmp; unsigned short checkSum=0,dnCS; unsigned long &nb ...… 查看全部问答> |
|
arm-elf-gcc在arm上的一个bug,如何绕开这个bug? 经过多次测试,发现arm-elf-gcc编译器在格式带有浮点参数的字符串的时候会导致CPU(无论是arm9还是arm7)跑飞,gcc版本号为arm-elf-gcc 4.1.1,编译的批处理文件内容如下: path=c:\\windows;c:\\windows\\system32;E:\\GNUARM\\bin arm-elf-as ...… 查看全部问答> |
|
在PC的linux下可以通过该cdma无线网卡上网,移植到开发板就不行了,已经移植了pppd和chat以及pppoe到了开发板,内核编译进了ppp,放在了bin目录下,编写了脚本文件放在了/etc/ppp目录下,开发板启动后输入pppd,有乱麻出现,但是如果运行 pppd cal ...… 查看全部问答> |
|
请仙人指路! LPC1114 与外部flash SST25配置的相关问题 我是这样配置SPI的: void SPIInit() { uint8 i; //LPC_SYSCON->PRESETCTRL &= (0x01… 查看全部问答> |
|
@FFFE B2 F3 @FFE4 E6 F7 @FFF0 02 F9 2A F7 q 在HEX文件的最后中断向量表中,怎么能够看出具体的程序入口在哪里?比如说上电复位的程序入口是b2f3… 查看全部问答> |
|
/*采用2*3键盘中的key0来实现键盘引起的中断程序,以此来验证中断*/#include<msp430x54x.h> void sys_init() //初始化{ P1DIR &=0XFE; //p1.0为输入 P1OUT |=BIT0; //p1.0输出高电平 ...… 查看全部问答> |




