1.u-boot简介
uboot的全称是Universal Boot Loader,是一个遵循GPL的开源软件,是一个裸机代码,可以看做是一个裸机综合例程。
uboot起到的作用就是在芯片上电以后,uboot会初始化DDR等外设,然后将Linux内核从flash拷贝到DDR中,最后启动Linux内核,简而言之,是起到一个引导的作用。
uboot官方的源码是给半导体厂商准备的,半导体厂商会下载uboot源码然后将自己相应的芯片移植进去。也就是说这个uboot相当于是为这家厂商定制的,由他们自己维护。
我们使用的板子一般不是半导体厂商的评估板,都是参考官方开发板进行了相应的修改。所以对于uboot也需要进行相应的修改以适应开发板。
种类 | 名称 |
---|---|
uboot官方的uboot代码 | 由uboot官方维护的版本,更新快,基本包含所有常用芯片 |
半导体厂商的uboot代码 | 半导体厂商维护的一个uboot,专门针对自家芯片,在对自家芯片的支持上比uboot官方好 |
开发板厂商的uboot代码 | 开发板厂商在半导体厂商提供的uboot基础上加入对自家开发板的支持 |
2.u-boot顶层Makefile分析
在阅读uboot源码之前,需要先查看一下uboot根目录下的Makefile文件,即顶层Makefile文件,以下按Makefile文件内容顺序分析。(以三星x210开发板官方uboot为例)。
2.1版本号
顶层Makefile一开始是版本号。
VERSION = 1
PATCHLEVEL = 3
SUBLEVEL = 4
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
(1)uboot的版本号分3个级别:
- VERSION:主板本号
- PATCHLEVEL:次版本号
- SUBLEVEL:再次版本号
- EXTRAVERSION:另外附加的版本信息
这4个用.分隔开共同构成了最终的版本号。
(2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号。
(3)include/version_autogenerated.h文件是编译过程中自动生成的一个文件,所以源目录中没有,但是编译过后的uboot中就有了。它里面的内容是一个宏定义,宏定义的值内容就是我们在Makefile中配置的uboot的版本号。
(4)验证方法:自己修改主Makefile中几个Version有关的变量,然后重新编译uboot,然后烧录到SD卡中,从SD卡启动,然后去看启动时uboot打印出来的版本信息,看看变化是不是和自己的分析一致。
2.2HOSTARCH和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
(1)直接在shell中执行uname -m得到i686,得到的值其实你当前执行这个命令的电脑的CPU的版本号。
(2)shell中的|叫做管道,管道的作用就是把管道前面一个运算式的输出作为后面一个的输入再去做处理,最终的输出才是我们整个式子的输出。
(3)HOSTARCH这个名字:HOST是主机,就是当前在做开发用的这台电脑就叫主机;ARCH是architecture(架构)的缩写,表示CPU的架构。所以HOSTARCH就表示主机的CPU的架构。
(4)这两个环境变量是主机的操作系统和主机的CPU架构,得出后保存备用,后面自然会用到。
2.3静默输出
ifeq (,$(findstring s,$(MAKEFLAGS))