TI OMAP平台BSP学习笔记之 - UBOOT(1)

本文详细介绍了TI OMAP平台上的Bootloader,特别是UBoot的编译过程,包括SPL(Secondary Program Loader)和UBoot的编译步骤。文章探讨了配置、编译、SPL编译以及UBoot编译的细节,如Kbuild编译系统、Makefile配置和编译目标。此外,还概述了启动流程,涉及ROM代码、SPL、UBoot及最终加载的操作系统。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Bootloader 和 TI Uboot

    Bootloader的一种,用来引导系统,通常HLOS如LINUX,WINDOWS等系统的镜像保存在硬盘、EMMC等介质中,Bootloader的主要功能是为这些系统准备硬件环境,然后将HLOS系统加载到RAM中,最后把HLOS给运行起来。通常在IC、特别是嵌入式IC复位后,它会跳转到片内ROM去运行特定的固化代码(也可能是上电后从特定的地址运行,这时需要在该地址上放上可执行的器件,如NORFLASH),在固化代码中做基本的硬件初始化之后它要决定下一步的运行,即从哪里拿到镜像,在哪里运行;通常来讲下一步要运行的镜像保存在flash当中,有些IC可能内置动态RAM,有些则可能不具备(需要外部的RAM),因此Uboot将bootloader过程分为两个SPL和Uboot两个部分,SPL是可选的(Secondary Program Loader),便于开发者自己选择。对于TI板子(AM57xx),它的启动过程是 片内ROM -> SPL(TI改成MLO) -> UBOOT -> HLOS(Linux,Android等)。

2. 编译

    首先介绍UBOOT的编译,最新的UBOOT采用和Kernel类似的Kbuild编译系统,它是基于make的一套编译系统。编译方法首先make config,然后make target,即我们常说的先配置再编译。对于make系统来讲,两个编译命令运行的位置一样(UBOOT根目录),所以它们的入口文件的入口都是顶层Makefile文件,在顶层Makefile中会处理环境,变量,引入Kbuild的其它模块,定义UBOOT的libs和依赖,最后根据编译的对象生成不同的结果;对于config来说,需要收集config文件和KCONFIG文件,生成.config.h文件等,最终的目的是将我们定义的config引入到源文件(.h文件)和编译target的mk文件中(.mk),后面将会分析到;而对于编译target来说,由于前面编译config的时候已经引入了不同的编译控制变量(如宏控),所以编译的结果也是不同的,如编译哪个平台、哪些源文件等等。通常我们在移植工作中的编译部分的工作也遵循这个思路。

    在TI SDK中使能SPL,所以编译时会编译出2个镜像,一个是SPL(u-boot-spl-dtb.bin),会重新处理成MLO镜像;另一个是u-boot的镜像。对于SPL,它的编译入口会从顶层Makefile跳转到子Makefile中 scripts/Makefile.spl,原理类似,都是lib- -> libs- -> buildin.o -> image,期间会使用script中定义的基本函数或者变量,我们先列出后面用到的几个以便后面查阅。

build变量通过scripts/Kbuild.include引入:

###
# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.build obj=
# Usage:
# $(Q)$(MAKE) $(build)=dir
build := -f $(srctree)/scripts/Makefile.build obj

    TODO: add more details if any。

2.2 config编译

  依赖关系如下, 比如编译am57xx_evm_config时,匹配的是%config,%是Makefile中的通配符。

config: scripts_basic outputmakefile FORCE
	$(Q)$(MAKE) $(build)=scripts/kconfig $@

%config: scripts_basic outputmakefile FORCE
	$(Q)$(MAKE) $(build)=scripts/kconfig $@

     config编译依赖依赖scripts_basic,还有outputmakefile。结合上一节中的几个变量定义,scripts_basic的编译命令变成:

$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.build obj=scripts/basic,指定了makefile文件和obj,由于没有指定目标,所以默认的目标是Makefile.build中第一个目标__build:

# Basic helpers built in scripts/
PHONY += scripts_basic
scripts_basic:
	$(Q)$(MAKE) $(build)=scripts/basic
	$(Q)rm -f .tmp_quiet_recordmcount

    这个__build目标为

__build: $(if $(KBUILD_BUILTIN),$(builtin-target) $(lib-target) $(extra-y)) \
	 $(if $(KBUILD_MODULES),$(obj-m) $(modorder-target)) \
	 $(subdir-ym) $(always)
	@:

回到开头查看Makefile.build文件,需要首先包含一些脚本:

  1. 如果include/config/auto.conf存在,则包含之。编译config时这个文件不存在,但在后面编译uboot的时候需要包含该文件,其中定义了宏控。
  2. $(prefix)/include/autoconf.mk如果存在,则包含之。关于prefix的赋值几个if的解释如下,首先赋值tpl,如果obj的路径以tpl开始(这里是scripts/basic,为否)则第一个if不成立,此时prefix为tpl,同理prefix也可能为spl和.;此时src是去除了前缀的路径名。所以这里是包含scripts/basic/include/autoconf.mk
  3. 包含scripts/Makefile.uncmd_spl,该文件和spl有关,该文件通过宏控CONFIG_SPL_BUILD来控制,所以对uboot来讲,没有定义该宏控,问题也不大。
  4. 包含scripts/Kbuild.include,该文件中定义了很多基础函数。
  5. 如果$(src)/Kbuild存在,则包含之; 如果不存在则包含$(src)/Makefile, 关于$(src)请看第2点。这里因为obj=scripts/basic,所以查找的是该目录下的这两个文件。
# Modified for U-Boot
prefix := tpl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := spl
src := $(patsubst $(prefix)/%,%,$(obj))
ifeq ($(obj),$(src))
prefix := .
endif
endif

...
# Read auto.conf if it exists, otherwise ignore
# Modified for U-Boot
-include include/config/auto.conf
-include $(prefix)/include/autoconf.mk
include scripts/Makefile.uncmd_spl

include scripts/Kbuild.include

# For backward compatibility check that these variables do not change
save-cflags := $(CFLAGS)

# The filename Kbuild has precedence over Makefile
kbuild-dir := $(if $(filter /%,$(src)),$(src),$(srctree)/$(src))
kbuild-file := $(if $(wildcard $(kbuild-dir)/Kbuild),$(kbuild-dir)/Kbuild,$(kbuild-dir)/Makefile)
include $(kbuild-file)

在script/basic/Makefile文件,定义了fixdep目标并加入到always

hostprogs-y	:= fixdep
always		:= $(hostprogs-y)

# fixdep is needed to compile other host programs
$(addprefix $(obj)/,$(filter-out fixdep,$(always))): $(obj)/fixdep

    再次回到Makfefile.build, 增加一些编译的flag,包含Makefile.lib。这个makefile.lib的作用就是收集-y,-m变量;我们在Makefile.build中定义这些变量并将其都设置为空,同时在该

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值