uboot移植(一)配置过程分析

时间:2021-03-23 16:35:33
拿到任何一个工程源码,首先是配置,然后是编译,有的需要安装,有的不需要, u-boot 也不例外,
u-boot-2014.04 源码顶层目录下的 README 文件介绍了 u-boot 的历史, 版本命名规则, 目录组织架构,
软件配置,如何添加一个新的板子等。
目录组织结构在
README Directory Hierarchy 一节有详细说明,下面列出一些常用的:
arch :存放 CPU 架构相关的文件,里面的每个目录代表一种架构。
arch/arm/cpu :存放 arm CPU 相关的文件,里面每个目录代表一种 arm cpu
board
:存放单板相关的文件
board/samsung :存放三星公司生产的单板
include/configs :存放每个单板的配置文件
软件配置在
README Software Configuration 一节有详细说明, README 告诉我们:要针对某个单
板进行配置,需要执行:
make NAME_config ,其中 NAME boards.cfg 中列出。

S5PV210 S5PC100 都是 Cortex-A8 架构,比较类似,我以 S5PC100 为例进行说明。

uboot移植(一)配置过程分析

通过执行 make smdkc100_config ,其中 smdkc100 smdkc100 这个单板的一个目标名称,因为有的
单板有多个配置目标,比如
atmel 公司的 at91sam9263ek 单板就有 5 个目标, make 命令首先会从顶层

Makefile 中搜索匹配目标 smdkc100_config,找到

uboot移植(一)配置过程分析

%_config 前面的%是通配符,会匹配所有以_config 为后缀的目标
::Makefile 的中的多目标规则,可以同时跟多个目标,举例:

uboot移植(一)配置过程分析

$(MKCONFIG)是顶层目录下的一个可执行 shell 脚本文件, $(@:_config=)会将所有目标中的后缀
_config 去掉,得到 smdkc100,然后 make 会执行命令:
u-boot-2014.04/mkconfig –A smdkc100
下面分析 mkconfig
首先定义了几个变量:
TARGETSMakefile 的目标
arch:体系架构,比如 armx86mips
cpucpu 类型,比如 arm920tarm11
board:单板名称,比如 smdk2410smdkc100
vendor:厂商名称,比如 samsungfreescale
soc:片上系统,比如 s3c2410s3c2440s5pv210
uboot移植(一)配置过程分析

如果参数个数等于 2,而且第 1 个参数等于“-A”,则执行:
line=`awk '($0 !~ /^#/ && $7 ~ /^'"$2"'$/) { print $1, $2, $3, $4, $5, $6, $7, $8 }' $srctree/boards.cfg`
awk
是一个非常强大的文本处理工具, $srctree 被替换为 u-boot-2014.04,即 u-boot 源码树目录, awk
会读取 u-boot-2014.04/boards.cfg 中的每一行,如果和前面的表达式($0 !~ /^#/ && $7 ~ /^'"$2"'$/)相匹配,
则执行
{ print $1, $2, $3, $4, $5, $6, $7, $8 }
boards.cfg 保存了各种单板的相关信息,其格式为:
# Status, Arch,  CPU:SPLCPU, SoC,      Vendor,    Board name,   Target, Options, Maintainers
################################################################################
Active     arm     armv7     s5pc1xx     samsung     smdkc100     smdc100     -     Minkyu Kang
<mk7.kang@samsung.com>
awk
在执行过程中, $0 代表当前整行, 同时将第一个字段存入$1,将第 2 个字段存入$2, 依此类推,
awk 缺省按空格分段,可以通过-F 指定分隔符。
若果当前行不以#开头,而且第 7 个字段和 mkconfig 传进来的第 2 个参数(smdkc100) 相等,则分
别将字段
1~字段 8 输出到 line 中保存,最终得到:

line=Active
$#=8
arm armv7 s5pc1xx samsung smdkc100 smdkc100 –

$1=Active
$2=arm
$3=armv7
状态
架构
CPU
$4=s5pc1xx
$5=samsung
$6=smdkc100
$7=smdkc100
$8=-
SOC
厂商
单板名称
配置目标
选项

uboot移植(一)配置过程分析

${7%_config}表示去掉${7}的后缀_config,这里${7}=smdkc100,得到
CONFIG_NAME=smdkc100
BOARD_NAME=smdkc100

uboot移植(一)配置过程分析

arch=arm
cpu=armv7
spl_cpu=

board=smdkc100
vendor=samsung

soc=s5pc1xx
uboot移植(一)配置过程分析

Configuring for smdkc100 board...
uboot移植(一)配置过程分析

创建架构相关的头文件的链接
如果
KBUILD_SRC 不为空,则进入到 arch/arm/include 目录,删除里面的 asm/arch 这个链接文件。
如果
${soc}为空,则执行 ln -s ${LNPREFIX}arch-${cpu} asm/arch,否则执行
ln -s ${LNPREFIX}arch-${soc} asm/arch, 这里 soc=s5pc1xxLNPREFIX 为空,所以会执行
ln –s arch-s5pc1xx asm/arch
这里给 u-boot-2014.04arch/arm/include/asm/arch-s5pc1xx 创建了一个软连接,如下所示:
uboot移植(一)配置过程分析

紧接着,如果${arch} = “arm”, 则删除 asm/proc,同时给 proc-armv 创建一个软链接,如下所示:
uboot移植(一)配置过程分析

如果 KBUILD_SRC 为空,则进入到 u-boot-2014.04/include,这里 KBUILD_SRC 为空,所以会进入到
u-boot-2014.04/include 目录。
uboot移植(一)配置过程分析

make 创建头文件
ARCH=arm
CPU=arm
BOARD=smdkc100
VENDOR=samsung
SOC=s5pc1xx
使用 echo 将这些信息一行一行的输出到 u-boot-2014.04/include/config.mk 中:
uboot移植(一)配置过程分析

然后给变量 BOARDDIR 赋值为 samsung/smdkc100
uboot移植(一)配置过程分析

创建单板相关的头文件
APPEND=no,所以会创建一个新的 u-boot-2014.04/include/config.h
uboot移植(一)配置过程分析

在这个头文件中定义了单板相关的宏,包含了单板的配置头文件 configs/smdkc100.h,我们需要针对
自己的单板配置这个头文件。
总结: 执行
make smdkc100_config 主要做了 3 件事:
1) 创建架构相关的头文件的链接
uboot移植(一)配置过程分析

2) make 创建头文件 u-boot-2014.04/include/config.mk
uboot移植(一)配置过程分析

3) 创建单板相关的头文件 u-boot-2014.04/include/config.h
uboot移植(一)配置过程分析