其中imxdownload是烧录文件 u-boot*这些文件是编译产生的
重点关心如下:
1、arch文件夹
此文件夹存放与架构相关的文件,如下图所示:
从图
31.1.3
可以看出有很多架构,比如
arm
、
avr32
、
m68k
等,我们现在用的是
ARM
芯
片,所以只需要关心
arm
文件夹即可,打开
arm
文件夹里面内容如图
31.1.4
所示:
armv7
这个文件夹里面的文件都是跟 ARMV7
架构有关的,是我们分析
uboot
启动源码的时候需要重点关注的
2
、
board
文件夹
board
文件夹就是和具体的板子有关的,打开此文件夹,里面全是不同的板子,毫无疑问正点原子的开发板肯定也在里面(
正点原子添加的
)
,
borad
文件夹里面有个名为“
freescale
”的文件夹。
使用
freescale
芯片的板子都放到此文件夹中,
I.MX
系列以前属于
freescale
,只是freescale 后来被
NXP
收购了。打开此
freescale
文件夹,在里面找到和
mx6u(I.MX6UL/ULL)
有关的文件夹。
mx6ullevk
是
NXP官方的I.MX6ULL
开发板,正点原子的
ALPHA
开发板就是在这个基础上开发的,因此
mx6ullevk也是正点原子的开发板。我们后面移植 uboot
到时候就是参考
NXP 官方的开发板,也就是要参考
mx6ullevk
这个文件夹来定义我们的板子。
3
、
configs
文件夹
此文件夹为
uboot
配置文件,
uboot
是可配置的,但是你要是自己从头开始一个一个项目的配置,那就太麻烦了,因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能,这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig
”,
xxx
表示开发板名字,这些
defconfig
文件都存放在
configs文件夹,因此,NXP
官方开发板和正点原子的开发板配置文件肯定也在这个文件夹中
这
6
个文件就是正点原子
I.MX6U-ALPHA
开发板所对应的
uboot
默认配置文件。我们只关心 mx6ull_14x14_ddr512_emmc_defconfig
和
mx6ull_14x14_ddr256_nand_defconfig这两个文件,分别是正点原子 I.MX6ULL EMMC
核心板和
NAND
核心板的配置文件。使用 “make xxx_defconfig
”命令即可配置
uboot
make mx6ull_14x14_ddr512_emmc_defconfig
上述命令就是配置正点原子的 I.MX6ULL EMMC 核心板所使用的 uboot。 在编译 uboot 之前一定要使用 defconfig 来配置 uboot! 在 mx6ull_alientek_emmc.sh 中就有下面这一句:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_
defconfig
4
、
.u-boot.xxx_cmd
文件
.u-boot.xxx_cmd
是一系列的文件,这些文件都是编译生成的,都是一些命令文件,比如文
件
.u-boot.bin.cmd
,看名字应该是和
u-boot.bin
有关的,此文件的内容如下:
.u-boot.bin.cmd
里面定义了一个变量:
cmd_u-boot.bin
,此变量的值为“
cp u-boot-nodtb.bin
u-boot.bin
”,也就是拷贝一份
u-boot-nodtb.bin
文件,并且重命名为
u-boot.bin
,这个就是
u-boot.bin的来源,来自于文件 u-boot-nodtb.bin
。
那 么
u-boot-nodtb.bin
是怎么来的呢?文件
.u-boot-nodtb.bin.cmd
就是用于生成
u
boot.nodtb.bin
的,此文件内容如下:
这里用到了
arm-linux-gnueabihf-objcopy
,使用
objcopy
将
ELF
格式的
u-boot
文件转换为二
进制的
u-boot-nodtb.bin
文件。
文件
u-boot
是
ELF
格式的文件,文件
.u-boot.cmd
用于生成
u-boot
,文件内容如下:
.u-boot.cmd
使用到了
arm-linux-gnueabihf-ld.bfd
,也就是链接工具,使用
ld.bfd
将各个
built
in.o
文件链接在一起就形成了
u-boot
文件。
uboot
在编译的时候会将同一个目录中的所有
.c
文件
都编译在一起,并命名为
built-in.o
,相当于将众多的
.c
文件对应的
.o
文件集合在一起,这个就
是
u-boot
文件的来源。
如果我们要用
NXP 提供的 MFGTools 工具向开发板烧写 uboot
,此时烧写的是
u-boot.imx
文件,而不是
u-boot.bin
文件。
u-boot.imx
是在
u-boot.bin
文件的头部添加了
IVT、DCD 等信息。 这个工作是由文件.u-boot.imx.cmd
来完成的,此文件内容如下:
可以看出,这里用到了工具
tools/mkimage
,而
IVT
、
DCD
等数据保存在了文件
board/freescale/mx6ullevk/imximage-ddr512.cfg.cfgtmp
中
(
如 果 是
NAND
核 心 板 的 话 就 是
imximage-ddr256.cfg.cfgtmp)
,工具
mkimage
就是读取文件
imximage-ddr512.cfg.cfgtmp
里面的
信息,然后将其添加到文件
u-boot.bin
的头部,最终生成
u-boot.imx
。
文件
.u-boot.lds.cmd
就是用于生成
u-boot.lds
链接脚本的,由于
.u-boot.lds.cmd
文件内容太
多,这里就不列出来了。
uboot
根目录下的
u-boot.lds
链接脚本就是来源于
arch/arm/cpu/u-boot.lds文件。
还有一些其它的
.u-boot.lds.xxx.cmd
文件,大家自行分析一下,关于
.u-boot.lds.xxx.cmd
文件
就讲解到这里。
5
、
Makefile
文件
这个是顶层
Makefile
文件,
Makefile
是支持嵌套的,也就是顶层
Makefile 可以调用子目录
中的 Makefile
文件。
Makefile
嵌套在大项目中很常见,一般大项目里面所有的源代码都不会放
到同一个目录中,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模
块目录下都有一个
Makefile
,这个
Makefile
只处理本模块的编译链接工作,这样所有的编译链
接工作就不用全部放到一个
Makefile
中,可以使得
Makefile
变得简洁明了。
uboot 源码根目录下的 Makefile 是顶层 Makefile
,他会调用其它的模块的
Makefile
文件,
比如
drivers/adc/Makefile
。当然了,顶层
Makefile 要做的工作可远不止调用子目录 Makefile 这
么简单,关于顶层
Makefile
的内容我们稍后会有详细的讲解。
6
、
u-boot.xxx
文件
u-boot.xxx
同样也是一系列文件,包括
u-boot
、
u-boot.bin
、
u-boot.cfg
、u-boot.imx、u-boot.lds、
u-boot.map
、
u-boot.srec
、
u-boot.sym
和
u-boot-nodtb.bin
,这些文件的含义如下:
u-boot
:编译出来的
ELF
格式的
uboot
镜像文件。
u-boot.bin
:编译出来的二进制格式的
uboot 可执行镜像文件。
u-boot.cfg
:
uboot
的另外一种配置文件。
u-boot.imx
:
u-boot.bin
添加头部信息以后的文件,
NXP 的 CPU
专用文件。
u-boot.lds
:链接脚本。
u-boot.map
:
uboot
映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上。
u-boot.srec
:
S-Record
格式的镜像文件。
u-boot.sym
:
uboot
符号文件。
u-boot-nodtb.bin
:和
u-boot.bin
一样,
u-boot.bin
就是
u-boot-nodtb.bin
的复制文件。
7
、
.config
文件
可以看出
.config
文件中都是以“
CONFIG_
”开始的配置项,这些配置项就是
Makefile
中的变量,因此后面都跟有相应的值,uboot
的顶层
Makefile
或子
Makefile
会调用这些变量值。
在
.config
中会有大量的变量值为‘
y
’,这些为‘
y
’的变量一般用于控制某项功能是否使能,为‘y
’的话就表示功能使能,比如:
CONFIG_CMD_BOOTM=y
如果使能了
bootd
这个命令的话,
CONFIG_CMD_BOOTM
就为‘
y
’。在
cmd/Makefile
中有如下代码:
在示例代码
31.1.6
中,有如下所示一行代码:
obj-$(CONFIG_CMD_BOOTM) += bootm.o
CONFIG_CMD_BOOTM=y
,将其展开就是:
obj-y += bootm.o
也就是给
obj-y
追加了一个“
bootm.o
”,
obj-y
包含着所有要编译的文件对应的
.o
文件,这里表示需要编译文件 cmd/bootm.c
。相当于通过“
CONFIG_CMD_BOOTD=y”来使能 bootm
这个命令,进而编译 cmd/bootm.c
这个文件,这个文件实现了命令
bootm
。在
uboot 和 Linux
内核中都是采用这种方法来选择使能某个功能,编译对应的源码文件。
8、README
文件描述了
uboot
的详细信息,包括
uboot
该如何编译、
uboot
中各文件夹的含义、相应的命令等等。建议大家详细的阅读此文件,可以进一步增加对 uboot
的认识。
关于
uboot
根目录中的文件和文件夹的含义就讲解到这里,接下来就要开始分析
uboot
的
启动流程了。
U-Boot
顶层
Makefile
分析
在阅读
uboot
源码之前,肯定是要先看一下顶层
Makefile
,分析
gcc
版本代码的时候一定是先从顶层 Makefile
开始的,然后再是子
Makefile
,这样通过层层分析
Makefile
即可了解整个工程的组织结构。顶层 Makefile
也就是
uboot
根目录下的
Makefile
文件,由于顶层
Makefile
文件内容比较多,所以我们将其分开来看。
1、
版本号
顶层
Makefile
一开始是版本号,内容如下
(
为了方便分析,顶层
Makefile
代码段前段行号采用 Makefile
中的行号,因为
uboot
会更新,因此行号可能会与你所看的顶层
Makefile
有所不同)
:
VERSION
是主版本号,
PATCHLEVEL
是补丁版本号,
SUBLEVEL
是次版本号,这三个一
起构成了
uboot
的版本号,比如当前的
uboot
版本号就是“
2016.03
”。
EXTRAVERSION
是附加
版本信息,
NAME
是和名字有关的,一般不使用这两个。
2、
MAKEFLAGS
变量
make 是支持递归调用的,也就是在
Makefile
中使用“
make
”命令来执行其他的
Makefile
文件,一般都是子目录中的
Makefile
文件。假如在当前目录下存在一个“
subdir
”子目录,这个
子目录中又有其对应的
Makefile
文件,那么这个工程在编译的时候其主目录中的
Makefile
就可
以调用子目录中的
Makefile
,以此来完成所有子目录的编译。主目录的
Makefile
可以使用如下
代码来编译这个子目录:
$(MAKE) -C subdir
$(MAKE)
就是调用“
make
”命令,
-C
指定子目录。有时候我们需要向子
make
传递变量,
这个时候使用“
export
”来导出要传递给子
make
的变量即可,如果不希望哪个变量传递给子
make
的话就使用“
unexport
”来声明不导出
:
export VARIABLE …… //导出变量给子 make 。
unexport VARIABLE…… //不导出变量给子 make。
有两个特殊的变量:“SHELL
”和“MAKEFLAGS
”,这两个变量除非使用“
unexport
”声明,否则的话在整个make
的执行过程中,它们的值始终自动的传递给子
make
。在
uboot
的主
Makefile
中有如下代码:
上述代码使用“
+=
”来给变量
MAKEFLAGS
追加了一些值,“
-rR
”表示禁止使用内置的隐含规则和变量定义,“--include-dir
”指明搜索路径,
”$(CURDIR)”
表示当前目录。
3、命令输出
uboot 默认编译是不会在终端中显示完整的命令,都是短命令
在终端中输出短命令虽然看起来很清爽,但是不利于分析
uboot
的编译过程。可以通过设置变量“V=1
“来实现完整的命令输出,这个在调试
uboot
的时候很有用。
顶层 Makefile 中控制命令输出的代码如下:
上述代码中先使用
ifeq
来判断
"$(origin V)"
和
"command line"
是否相等。这里用到了
Makefile中函数 origin
,
origin
和其他的函数不一样,它不操作变量的值,
origin
用于告诉你变量是哪来的,语法为:
$(origin <variable>)
variable
是变量名,
origin
函数的返回值就是变量来源,因此
$(origin V)
就是变量
V
的来源。
如果变量
V
是在命令行定义的那么它的来源就是
"command line"
,这样
"$(origin V)"
和
"command
line"
就相等了。当这两个相等的时候变量
KBUILD_VERBOSE
就等于
V
的值,比如在命令行中
输 入 “
V=1
“ 的 话 那 么
KBUILD_VERBOSE=1
。 如 果 没 有 在 命 令 行 输 入
V
的 话
KBUILD_VERBOSE=0
。
第
80
行判断
KBUILD_VERBOSE
是否为
1
,如果
KBUILD_VERBOSE
为
1
的话变量
quiet
和
Q
都为空,如果
KBUILD_VERBOSE=0
的话变量
quiet
为“
quiet_
“,变量
Q
为“
@
”
,
综上
所述:
V=1 的话
:
KBUILD_VERBOSE=1
quiet= 空 。
Q= 空。
V=0 或者命令行不定义
V
的话:
KBUILD_VERBOSE=0
quiet= quiet_。
Q= @。
Makefile
中会用到变量
quiet
和
Q
来控制编译的时候是否在终端输出完整的命令,在顶层
Makefile
中有很多如下所示的命令:
$(Q)$(MAKE) $(build)=tools
如果 V=0
的话上述命令展开就是“
@ make $(build)=tools
”,
make
在执行的时候默认会在终
端输出命令,但是在命令前面加上“
@
”就不会在终端输出命令了。当
V=1
的时候
Q
就为空,
上述命令就是“
make $(build)=tools
”,因此在
make
执行的过程,命令会被完整的输出在终端上。
有些命令会有两个版本,比如:
quiet_cmd_sym ?= SYM $@
cmd_sym ?= $(OBJDUMP) -t $< > $@
sym
命令分为“
quiet_cmd_sym
”和“
cmd_sym
”两个版本,这两个命令的功能都是一样的,
区别在于
make
执行的时候输出的命令不同。
quiet_cmd_xxx
命令输出信息少,也就是短命令,
而
cmd_xxx
命令输出信息多,也就是完整的命令。
如果变量
quiet
为空的话,整个命令都会输出。
如果变量
quiet
为“
quiet_
”的话,仅输出短版本。
如果变量
quiet
为“
silent_
”的话,整个命令都不会输出。
4、
静默输出
上一小节讲了,设置
V=0
或者在命令行中不定义
V
的话,编译
uboot
的时候终端中显示的短命令,但是还是会有命令输出,有时候我们在编译 uboot
的时候不需要输出命令,这个时候就可以使用 uboot
的静默输出功能。编译的时候使用“
make -s
”即可实现静默输出,顶层
Makefile中相应的代码如下:
第
91
行判断当前正在使用的编译器版本号是否为
4.x
,判断
$(filter 4.%,$(MAKE_VERSION))
和“ ”
(
空
)
是否相等,如果不相等的话就成立,执行里面的语句。也就是说
$(filter
4.%,$(MAKE_VERSION))
不为空的话条件就成立,这里用到了
Makefile
中的
filter
函数,这是
个过滤函数,函数格式如下:
$(filter <pattern...>,<text>)
filter
函数表示以
pattern
模式过滤
text
字符串中的单词,仅保留符合模式
pattern
的单词,
可以有多个模式。函数返回值就是符合
pattern
的字符串。因此
$(filter 4.%,$(MAKE_VERSION))
的含义就是在字符串“
MAKE_VERSION
”中找出符合“
4.%
”的字符
(%
为通配符
)
,
MAKE_VERSION
是
make
工具的版本号,
ubuntu16.04
里面默认自带的
make
工具版本号为
4.1
,
大家可以输入“
make -v
”查看。因此
$(filter 4.%,$(MAKE_VERSION))
不为空,条件成立,执行
92~94
行的语句。
第
92
行也是一个判断语句,如果
$(filter %s ,$(firstword x$(MAKEFLAGS)))
不为空的话条件
成立,变量
quiet
等于“
silent_
”。这里也用到了函数
filter
,在
$(firstword x$(MAKEFLAGS)))
中
过滤出符合“
%s
”的单词。到了函数
firstword
,函数
firstword
是获取首单词,函数格式如下:
$(firstword <text>)
firstword
函数用于取出
text
字符串中的第一个单词,函数的返回值就是获取到的单词。当
使用“
make -s
”编译的时候,“
-s
”会作为
MAKEFLAGS
变量的一部分传递给
Makefile
。在顶
层
Makfile
中添加如图
所示的代码:
两行代码用于输出
$(firstword x$(MAKEFLAGS))
的结果,最后修改文件 mx6ull_alientek_emmc.sh,在里面加入“
-s
”选项,结果如图
修改完成以后执行
mx6ull_alientek_emmc.sh
,结果如图
从图 31.3.4.3
可以看出第一个单词是“
xrRs
”,将
$(filter %s ,$(firstword x$(MAKEFLAGS)))
展开就是
$(filter %s, xrRs)
,而
$(filter %s, xrRs)
的返回值肯定不为空,条件成立,
quiet=silent_
。
第
101
行使用 export
导出变量
quiet
、
Q
和
KBUILD_VERBOSE
。
5、
设置编译结果输出目录
uboot
可以将编译出来的目标文件输出到单独的目录中,在
make
的时候使用“
O
”来指定
输出目录,比如“
make O=out”就是设置目标文件输出到 out
目录中。这么做是为了将源文件
和编译产生的文件分开,当然也可以不指定
O
参数,不指定的话源文件和编译产生的文件都在
同一个目录内,一般我们不指定
O
参数。顶层
Makefile
中相关的代码如下:
第 124
行判断“
O
”是否来自于命令行,如果来自命令行的话条件成立,
KBUILD_OUTPUT
就为
$(O)
,因此变量
KBUILD_OUTPUT
就是输出目录。
第 135
行判断
KBUILD_OUTPUT
是否为空。
第 139
行调用
mkdir
命令,创建
KBUILD_OUTPUT
目录,并且将创建成功以后的绝对路
径赋值给
KBUILD_OUTPUT
。至此,通过
O
指定的输出目录就存在了。
6、代码检查
uboot
支持代码检查,使用命令“
make C=1
”使能代码检查,检查那些需要重新编译的文件。“make C=2
”用于检查所有的源码文件,顶层
Makefile
中的代码如下:
第
176
行判断
C
是否来源于命令行,如果
C
来源于命令行,那就将
C
赋值给变量
KBUILD_CHECKSRC
,如果命令行没有
C
的话
KBUILD_CHECKSRC
就为
0
。
7、模块编译
在
uboot
中允许单独编译某个模块,使用命令“
make M=dir
”即可,旧语法“
make SUBDIRS=dir”也是支持的。顶层
Makefile
中的代码如下:
第 186
行 判 断 是 否 定 义 了
SUBDIRS
, 如 果 定 义 了
SUBDIRS
,变量
KBUILD_EXTMOD=SUBDIRS
,这里是为了支持老语法“
make SUBIDRS=dir
”
第 190
行判断是否在命令行定义了
M
,如果定义了的话
KBUILD_EXTMOD=$(M)
。
第 197
行判断
KBUILD_EXTMOD
时为空,如果为空的话目标
_all
依赖
all
,因此要先编译
出
all
。否则的话默认目标
_all
依赖
modules
,要先编译出
modules
,也就是编译模块。一般情况
下我们不会在
uboot
中编译模块,所以此处会编译
all
这个目标。
第 203
行判断
KBUILD_SRC
是否为空,如果为空的话就设置变量
srctree
为当前目录,即
srctree
为“
.
”,一般不设置
KBUILD_SRC
。
第 214
行设置变量
objtree
为当前目录。
第 215
和
216
行分别设置变量
src
和
obj
,都为当前目录。
第 218
行设置
VPATH
。
第 220
行导出变量
scrtree
、
objtree
和
VPATH
。
8、
获取主机架构和系统
接下来顶层
Makefile
会获取主机架构和系统,也就是我们电脑的架构和系统,代码如下:
第 227
行定义了一个变量
HOSTARCH
,用于保存主机架构,这里调用
shell
命令“uname -m
”获取架构名称,结果如图
31.3.8.1
所示:
9、
设置目标架构、交叉编译器和配置文件
编 译
uboot
的 时 候 需 要 设 置 目 标 板 架 构 和 交 叉 编 译 器 ,“
make ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf-
”就是用于设置
ARCH
和
CROSS_COMPILE
,在顶层
Makefile
中代码如下:
第
245
行判断
HOSTARCH
和
ARCH
这两个变量是否相等,主机架构
(
变量
HOSTARCH)
是
x86_64
,而我们编译的是
ARM
版本
uboot
,肯定不相等,所以
CROSS_COMPILE= arm-linux
gnueabihf-
。从示例代码
31.3.9.1
可以看出,每次编译
uboot
的时候都要在
make
命令后面设置
ARCH
和
CROSS_COMPILE
,使用起来很麻烦,可以直接修改顶层
Makefile
,在里面加入
ARCH
和
CROSS_COMPILE
的定义
直接在顶层
Makefile
里面定义
ARCH
和
CROSS_COMPILE
,这样就不用每次编译的时候都要在 make
命令后面定义
ARCH
和
CROSS_COMPILE
。
继续回到示例代码
中,第
249
行定义变量
KCONFIG_CONFIG
,
uboot
是可以配置的,这里设置配置文件为.config
,
.config
默认是没有的,需要使用命令“
make xxx_defconfig
”对 uboot
进行配置,配置完成以后就会在
uboot
根目录下生成
.config
。默认情况下
.config
和xxx_defconfig 内容是一样的,因为
.config
就是从
xxx_defconfig
复制过来的。如果后续自行调整了 uboot
的一些配置参数,那么这些新的配置参数就添加到了
.config
中,而不是
xxx_defconfig
。
相当于
xxx_defconfig
只是一些初始配置,而
.config
里面的才是实时有效的配置。
10、调用 scripts/Kbuild.include
主
Makefile
会调用文件
scripts/Kbuild.include
这个文件,顶层
Makefile
中代码如下:
使用“
include
”包含了文件
scripts/Kbuild.include
,此文件里面定义了很多变量。
在
uboot
的编译过程中会用到
scripts/Kbuild.include
中的这些变量,后面用到的时候再分析。
11、交叉编译工具变量设置
上面我们只是设置了
CROSS_COMPILE
的名字,但是交叉编译器其他的工具还没有设置, 顶层 Makefile
中相关代码如下:
12、
导出其他变量
接下来在顶层
Makefile
会导出很多变量,代码如下:
这些变量中大部分都已经在前面定义了,我们重点来看一下下面这几个变量:
ARCH CPU BOARD VENDOR SOC CPUDIR BOARDDIR
这
7
个变量在顶层
Makefile
是找不到的,说明这
7
个变量是在其他文件里面定义的,先来
看一下这
7
个变量都是什么内容,在顶层
Makefile
中输入如图
所示的内容:
修改好顶层
Makefile
以后执行如下命令:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mytest
可以看到这
7
个变量的值,这
7
个变量是从哪里来的呢?在
uboot
根目录下有个文件叫做 config.mk
,这
7
个变量就是在
config.mk
里面定义的,打开
config.mk
内容。
第 25 行 定 义 变 量 ARCH , 值 为 $(CONFIG_SYS_ARCH:"%"=%) , 也 就 是 提 取
CONFIG_SYS_ARCH 里面双引号“”之间的内容。比如 CONFIG_SYS_ARCH=“arm”的话,
ARCH=arm。
第 26 行定义变量 CPU,值为$(CONFIG_SYS_CPU:"%"=%)。
第 32 行定义变量 BOARD,值为(CONFIG_SYS_BOARD:"%"=%)。
第 34 行定义变量 VENDOR,值为$(CONFIG_SYS_VENDOR:"%"=%)。
第 37 行定义变量 SOC,值为$(CONFIG_SYS_SOC:"%"=%)。
第 44 行定义变量 CPUDIR,值为 arch/$(ARCH)/cpu$(if $(CPU),/$(CPU),)。
第 46 行 sinclude 和 include 的功能类似,在 Makefile 中都是读取指定文件内容,这里读取
文件$(srctree)/arch/$(ARCH)/config.mk 的内容。sinclude 读取的文件如果不存在的话不会报错。
第 47 行读取文件$(srctree)/$(CPUDIR)/config.mk 的内容。
第 50 行读取文件$(srctree)/$(CPUDIR)/$(SOC)/config.mk 的内容。
第 54 行定义变量 BOARDDIR ,如果定义了 VENDOR 那 么
BOARDDIR=$(VENDOR)/$(BOARD),否则的 BOARDDIR=$(BOARD)。
第 60 行读取文件$(srctree)/board/$(BOARDDIR)/config.mk。
接下来需要找到 CONFIG_SYS_ARCH、CONFIG_SYS_CPU、CONFIG_SYS_BOARD、
CONFIG_SYS_VENDOR 和 CONFIG_SYS_SOC 这 5 个变量的值。这 5 个变量在 uboot 根目录
下的.config 文件中有定义,定义如下:
CONFIG_SYS_ARCH 里面双引号“”之间的内容。比如 CONFIG_SYS_ARCH=“arm”的话,
ARCH=arm。
第 26 行定义变量 CPU,值为$(CONFIG_SYS_CPU:"%"=%)。
第 32 行定义变量 BOARD,值为(CONFIG_SYS_BOARD:"%"=%)。
第 34 行定义变量 VENDOR,值为$(CONFIG_SYS_VENDOR:"%"=%)。
第 37 行定义变量 SOC,值为$(CONFIG_SYS_SOC:"%"=%)。
第 44 行定义变量 CPUDIR,值为 arch/$(ARCH)/cpu$(if $(CPU),/$(CPU),)。
第 46 行 sinclude 和 include 的功能类似,在 Makefile 中都是读取指定文件内容,这里读取
文件$(srctree)/arch/$(ARCH)/config.mk 的内容。sinclude 读取的文件如果不存在的话不会报错。
第 47 行读取文件$(srctree)/$(CPUDIR)/config.mk 的内容。
第 50 行读取文件$(srctree)/$(CPUDIR)/$(SOC)/config.mk 的内容。
第 54 行定义变量 BOARDDIR ,如果定义了 VENDOR 那 么
BOARDDIR=$(VENDOR)/$(BOARD),否则的 BOARDDIR=$(BOARD)。
第 60 行读取文件$(srctree)/board/$(BOARDDIR)/config.mk。
接下来需要找到 CONFIG_SYS_ARCH、CONFIG_SYS_CPU、CONFIG_SYS_BOARD、
CONFIG_SYS_VENDOR 和 CONFIG_SYS_SOC 这 5 个变量的值。这 5 个变量在 uboot 根目录
下的.config 文件中有定义,定义如下: