历史上的今天
返回首页

历史上的今天

今天是: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

推荐阅读

史海拾趣

ELANTEC (Renesas )公司的发展小趣事

作为一家半导体公司,技术突破和创新是ELANTEC发展的核心动力。在移动通信领域,ELANTEC不断推出具有创新性的产品和技术,如低功耗、高性能的移动通信芯片等。此外,在汽车电子、工业控制等领域,ELANTEC也取得了多项技术突破,为客户提供了更加优质的产品和服务。

CET Technology公司的发展小趣事

随着数字化转型的深入,CET Technology紧跟时代步伐,成功研发出数字化安全生产管控平台。该平台通过整合配电、给水、电梯、消防、空调、安防等各系统,建立统一的安全物联感知平台,实现对安全生产各要素的在线监测。利用3D可视化技术,关键信息得以直观呈现,为企业的安全生产管理提供了有力支持。此外,CET还引入了AI技术,对安全风险进行精准预测,助力企业防范和应对各类安全事件。

Honeywell公司的发展小趣事

背景:进入20世纪后,霍尼韦尔在恒温器领域的技术不断成熟,同时,另一家名为霍尼韦尔供暖专业公司的企业也在加热器领域取得了显著成就。

发展:1927年,明尼阿波利斯热调节器公司与霍尼韦尔供暖专业公司合并,创立了明尼阿波利斯-霍尼韦尔调节器公司。这次合并不仅增强了公司的技术实力,还拓展了业务范围,使公司成为当时最大的高品质珠宝钟表生产商(尽管这与电子行业的直接关联较小,但反映了公司扩张的雄心)。

关键事件:合并后,公司继续深耕工业自动化领域,并收购了布朗仪器公司,进一步巩固了在全球工业控制器和指示器市场的领导地位。

Empro Technology Corp公司的发展小趣事

Empro Technology Corp成立于2005年,由一群热衷于电子技术的工程师创立。在初创阶段,公司专注于研发高效能、低功耗的半导体芯片。经过数年的不懈努力,公司成功推出了一款具有颠覆性技术的芯片产品,其性能远超当时市场上的同类产品,迅速获得了市场的认可。

蜂鸟无线公司的发展小趣事
如电钻、电锯等电动工具,通过PWM调速电路可以实现转速的精确控制,提高工作效率和安全性。
Churod Electronics Co Ltd公司的发展小趣事

随着公司规模的扩大,中汇瑞德意识到,要想在激烈的市场竞争中保持领先地位,必须不断进行科技创新。于是,公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。在研发团队的努力下,公司成功开发出了多款具有自主知识产权的新型继电器产品,不仅提高了产品的性能和质量,还降低了生产成本,赢得了客户的广泛好评。

问答坊 | AI 解惑

典型的嵌入式系统组成

嵌入式系统是专用计算机应用系统,它具有一般计算机组成的共性,也是由硬件和软件组成。 图1-1完整地描述了嵌入式系统的软硬件各部分的组成结构。 2.1 嵌入式系统的硬件基本结构 嵌入式系统的硬件架构如图1-1下半部分所示,是以嵌入式处 ...…

查看全部问答>

求助。。。STC下载器的制作资料

哪位朋友有STC单片机的下载器资料。我想制作一个下载器啊。谢谢啦 急急。。。。。。。。有的话 希望大家传个电路图上来看看 [ 本帖最后由 08221034 于 2010-6-1 20:54 编辑 ]…

查看全部问答>

Nboot下载eboot有问题

一块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  ...…

查看全部问答>

CDMA模块在arm开发板上拨号上网难题

在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…

查看全部问答>

请教斑竹和大虾怎么看HEX文件?

@FFFE B2 F3 @FFE4 E6 F7 @FFF0 02 F9 2A F7 q 在HEX文件的最后中断向量表中,怎么能够看出具体的程序入口在哪里?比如说上电复位的程序入口是b2f3…

查看全部问答>

求大神看看这个msp430的终端程序

/*采用2*3键盘中的key0来实现键盘引起的中断程序,以此来验证中断*/#include<msp430x54x.h> void sys_init()    //初始化{  P1DIR &=0XFE;   //p1.0为输入  P1OUT |=BIT0;   //p1.0输出高电平 ...…

查看全部问答>

整流后的滤波电容不加电阻是不是可以等效成一个电压源?

如题,整流后的滤波电容不加电阻是不是可以等效成一个电压源?…

查看全部问答>