嵌入式开发(s5pv210)——u-boot的顶层makefile分析(代码片段)

代二毛 代二毛     2023-01-18     687

关键词:

前言

本文分析的是u-boot的主Makefile以及主Makefile调用到的一些关键文件,此Makefile可能和你手里的u-boot的Makefile不一样,这是正常的,但是从逻辑上都是一样的,无非就是把同样功能的脚本放在了不同的位置或者子Makefile中。我手里的u-boot目录结构可以参考《嵌入式开发(S5PV210)——u-boot的不同来源和目录结构》

1、uboot的版本

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

解析U_BOOT_VERSION变量保存的是uboot版本号,这个变量最终会写到version_autogenerated.h文件里保存U_BOOT_VERSION由四个变量构成,可以理解成四级版本号,VERSION是主版本号,PATCHLEVEL(patch level:补丁等级)是次版本号,SUBLEVEL(sub level:次一级的等级)是再次版本号,EXTRAVERSION(extra version:额外的版本号)可以自己定义。VERSION_FILE变量记录的是保存uboot版本号文件的路径,$(obj)和编译方式有关,并且是在后面脚本里给obj赋值的:如果是原地编译则$(obj)为空;如果是单独输出文件夹编译,则$(obj)等于指定的文件夹路径;

2、主机的CPU架构和操作系统

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

解析HOSTARCH 是主机的架构,HOSTOS是主机的操作系统,再用export导出到其他文件使用。嵌入式设备的开发是在PC机或者服务器上写代码并编译,这里的主机指的就是PC机或者服务器。
(1)HOSTARCH

shell uname -m:执行uname -m得到电脑类型,比如我英特尔的电脑得到就是i686;
sed -e s/i.86/i386/:用i386去替换前面的字符,其中点号是通配符,执行该条命令后i386就会替换掉i686;
余下的语句:都是和前一句一样的字符替换;

(2) HOSTOS:

shell uname -s:执行uname -s得到当前机器的操作系统,比如我的就是PC机上安装虚拟机,操作系统是Linux;
tr ‘[:upper:]’ ‘[:lower:]’ | sed -e ‘s/(cygwin).*/cygwin/’:前字符转的大写转换成小写,执行完此语句得到linux;

3、静默编译

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

静默编译就是编译过程中不要输出相关打印的信息到控制台,在编译的时候加上-s开启静默编译(make -s)。
ifeq (,$(findstring s,$(MAKEFLAGS))):查找是否在编译的时候指定s标志,没有找到则XECHO=echo,会输出信息;如果没有找到则XECHO=:,不会输出信息;总体上就是通过条件编译来控制是否输出。

4、原地编译和单独输出文件夹编译(OBJTREE、SRCTREE、TOPDIR、CURDIR)

参考博客《Makefile的两种编译方法——原地编译和单独输出文件夹编译》

5、调用顶层mkconfig文件

MKCONFIG	:= $(SRCTREE)/mkconfig
export MKCONFIG

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

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

解析:在执行命令(make x210_sd_config)进行配置uboot时,会去调用mkconfig文件,mkconfig脚本会去生成/include/config.mk文件并输入内容。具体细节参考《嵌入式开发(S5PV210)——u-boot的顶层mkconfig文件分析》

6、ARCH 和 CROSS_COMPILE

ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),$(ARCH))
	CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
	CROSS_COMPILE = ppc_8xx-
endif
ifeq ($(ARCH),arm)
	CROSS_COMPILE = arm-linux-
endif
ifeq ($(ARCH),i386)
	CROSS_COMPILE = i386-linux-
endif

ARCH变量是Soc的结构名称,比如arm代表arm架构;CROSS_COMPILE变量是交叉工具编译链。上面的脚本就是通过架构来选择合适的交叉工具编译链。

7、调用顶层config.mk

参考博客《嵌入式开发(S5PV210)——u-boot的顶层config.mk分析》

8、链接脚本分析

参考博客:《嵌入式开发(S5PV210)——u-boot的链接脚本分析》

9、总结:

上面所分析的主要从逻辑层面进行理解,可能你手里uboot的目录结构和我这里的完全不一样,我这里讲的文件的路径和文件名字也和你手里的uboot不一样,但是逻辑上和功能上都是一样的,该有的功能都会有。

嵌入式开发(s5pv210)——u-boot的顶层config.mk分析(代码片段)

1、config.mk的作用config.mk的作用是配置uboot编译的,比如配置交叉编译工具链,链接地址,编译选项,指定头文件路径等,但是config.mk的配置是建立在顶层mkconfig、主Makefile等配置之上的。2、config.mk的调用#loadothe... 查看详情

嵌入式开发(s5pv210)——u-boot的链接脚本分析(代码片段)

1、脚本内容OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")/*OUTPUT_FORMAT("elf32-arm","elf32-arm","elf32-arm")*/OUTPUT_ARCH(arm)ENTRY(_s 查看详情

嵌入式开发(s5pv210)——u-boot的不同来源和目录结构

1、u-boot的不同来源和联系uboot的来源大致有三个途径:uboot官网下载、Soc厂商提供、开发板厂商提供。假设某个厂商推出新的Soc,Soc厂商的工程师会去uboot的官网下载uboot,然后把此款Soc的开发板的uboot移植上去并开源&... 查看详情

嵌入式开发(s5pv210)——u-boot中如何确定启动方式(代码片段)

1、嵌入式设备确认启动方式设备确认启动方式分为硬件方式和软件方式,硬件方式是通过芯片某几个引脚的高低电平来决定启动方式;软件方式就是通过代码设置来决定启动方式。(1)硬件方式:比如S5PV210芯片,... 查看详情

嵌入式开发(s5pv210)——u-boot的头文件包含问题(代码片段)

前言uboot和kernel的头文件包含比一般的程序更复杂,将头文件的路径用链接来表示,这样的用意是为了程序的可移植性。uboot是高度可移植的,不同的配置和编译指令可以编译出不同Soc和开发板的程序,其中源码是... 查看详情

嵌入式开发(s5pv210)——u-boot中开启mmu(代码片段)

1、MMU介绍在uboot阶段并不是必须要开启MMU(内存管理单元),在没开启MMU前使用的是物理地址,开启MMU后使用的是虚拟地址。MMU就是在物理内存和应用程序之间添加了一个层次,专门用来管理内存,这样写应用程序... 查看详情

嵌入式开发(s5pv210)——u-boot启动过程中三次设置栈(代码片段)

1、多次设置栈的原因无论是汇编代码还是C语言代码,当涉及函数嵌套调用时都需要用栈来保存函数返回地址,所以必须设置栈。多次设置栈的原因是,uboot不同的启动阶段可用的内存空间是不同的。最开始只有IRAM可... 查看详情

第一章之s5pv210启动顺序

我所使用的开发板是:友善之臂smart210,cpu为s5pv210.u-boot版本是:u-boot-2012-101,首先在u-boot中配置相对应的开发板的配置文件#makes5p_goni_config2,设事先编译好的交叉编译器放在Makefile中添加上去,打开Makefile在67行补充CROSS_COMPILE?=arm-linux-... 查看详情

嵌入式开发综述

0、嵌入式系统开发流程:   1、S5PV210内部结构图2、S5PV210系统启动三阶段正解     根据S5PV210芯片手册第6章所述S5PV210consistsof64KBROMand96KBSRAMasinternalmemory(意思210芯片有两块片上内存,ROM:64KB,SRAM:96KB),并... 查看详情

嵌入式开发(s5pv210)——lcd显示器

LCD介绍1.LCD(LiquidCrystalDisplay)俗称液晶,这种材料的一大特点就是在电信号的驱动下液晶分子进行旋转,旋转会影响透光性,不同的透光性会透过不同的颜色的光,于是我们便看到显示屏上五颜六色的画面。2.LCD是... 查看详情

嵌入式开发(s5pv210)——adc和触摸屏

1、ADC介绍ADC(analogdigitalconverter)就是AD转换,把模拟量转换为数字量。CPU本身是数字的、离散的,而外部世界却是模拟的、连续的,所以外界的信息是不能直接被计算机进行处理,需要先将模拟量转换为数字量... 查看详情

s5pv210移植minigui3.0.12

...包,在MiniGui官网可以下载http://www.minigui.org/zhcn/【已放在嵌入式软件组资料共享文件夹】---------------- 查看详情

嵌入式s5pv210的启动流程

S5PV210的启动流程S5PV210上电后执行iROM中的固化代码,即BL0(Bootloader0)。这个代码是厂家出厂前烧写好的,不提供源代码,但提供相应的功能说明,比如进行一些时钟初始化、设备控制器初始化和启动相关... 查看详情

在s5pv210的开发板上使用串口收发信息

 参考学习教程:周立功嵌入式Linux开发教程-(上册) 材料:首先准备一个安装好Linux的开发板  使用 xshell工具连接开发板 ,winscp工具连接开发板 , 准备一个Ubuntu 32位,装上交叉编译链。。使用下... 查看详情

在s5pv210的开发板上点亮一个led灯

 参考学习教程:周立功嵌入式Linux开发教程-(上册) 材料:首先准备一个安装好Linux的开发板  使用 xshell工具连接开发板 ,winscp工具连接开发板 , 准备一个Ubuntu 32位,装上交叉编译链。。使用下... 查看详情

tiny210(s5pv210)移植u-boot(基于2014.4版本号)——移植u-boot.bin(打印串口控制台)

...信息打印。在上节。我们看到调用relocate_code重定位。在u-boot的帮助文档doc/README.arm-relocation中对重定位有说明。u-boot为了生成位置无关码,在链接时指定了-pie选项,这个选项在u-boot-2014.04/arch/arm/config.mk中指定: 查看详情

s5pv210开发板连接虚拟机的网络设置(代码片段)

1、前言用PC机进行嵌入式设备开发,会在pc机上安装虚拟机来运行linux系统,其中就涉及到开发板和虚拟机的通信问题。本文介绍的就是如何正确的设置网络,开发板通过有线网络与虚拟机通信。如果不知道如何设置... 查看详情

嵌入式专题:s5pv210-mpeg4编码

我想说不台的平台,如tiny210和x210。它们的头文件是有稍微区别的。我这个是x210下的代码。但都须要注意的是NV12T与NV12的问题,默认要求输入的图片是NV12T,经过调整之后,能够同意用NV12。即便如此。NV12格式的图片也不好拿... 查看详情