专注于嵌入式和图像处理
分类: 嵌入式
2011-12-07 21:39:09
U-Boot配置
命令:make
如:make smdk2410_config
在U-Boot顶层目录Makefile中有:
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
同一Makefile中找到unconfig<伪目标>的规则:
unconfig:
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp
由于目录下没有一个叫unconfig 的文件存在,所以和unconfig 相关的这条规则总是得到处理,也就是其中的rm命令总是得到执行,该命令的目的是删除一些配置编译过程中产生的文件<可能是以前配置编译时产生的>。在这些文件中,与本文讨论密切相关的是前面两个,以及后面两个。前面两个是用第一条命令来配置UBoot的过程中产生的,后面则是用第二条命令来编译UBoot的过程中产生的。这条规则先把他们全部删除。注意rm命令前面的@符号是取消该命令执行时的回显。
执行完对依赖unconfig的处理,GNU Make 回到对 smdk2410_config 的处理。它接下来执行命令:@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
在这条命令中,$(MKCONFIG) 指代的就是UBoot 根目录下的 mkconfig 脚本,因为你可以在同一Makefile中找到该变量的定义:
SRCTREE := $(CURDIR)
... ...
... ...
MKCONFIG := $(SRCTREE)/mkconfig
export MKCONFIG
其中 $(SRCTREE) 指代的就是UBoot 根目录。另外在上面的命令中,$(@:_config=) 的部分实际上是处理自动变量$@,也就是第一次 make 的目标 smdk2410_config,这里将其中"_config"的部分用空来代替。去掉"_config"的部分后,剩余的 smdk2410 也就是三星参考板的名称。所以make smdk2410_config命令也就是执行如下命令:
./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0
在mkconfig脚本开头能看到如下代码:
# Parameters: Target Architecture CPU Board [VENDOR] [SOC]
执行 mkconfig 脚本,并传之以所在的目录名称,s3c24x0是对应的SOC芯片名称。有人对arm920和s3c24x0两者所指东西混淆不清,我自己在平时为方便起见也经常混用这两个词,有时候也将它们统称为CPU。但实际上,更精确的说法认为arm920t是arm9类型的CPU核,而s3c2410则是用该核搭配另外一些外设做在一块芯片内形成的SOC芯片。由于三星本身出了很多使用arm920tCPU核的芯片,如s3c2400、s3c2410以及s3c2440,所以在UBoot代码中,用s3c24x0来统称这一类SOC芯片。
现在分析mkconfig脚本的作用,以smdk2410为参考板,它主要做四件事:
1.确定开发板名称BOARD_NAME,相关代码如下:
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
while [ $# -gt 0 ] ; do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
对于./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0 命令,没有--、-a、-n等符号,所以while直接跳出,执行最后一行后,BOARD_NAME等于第一个参数即smdk2410。
2.在include目录下制作一些与平台/开发板相关的头文件软链接。代码如下:
#
# Create link to architecture specific headers
#
if [ "$SRCTREE" != "$OBJTREE" ] ; then
mkdir -p ${OBJTREE}/include
mkdir -p ${OBJTREE}/include2
cd ${OBJTREE}/include2
rm -f asm
ln -s ${SRCTREE}/include/asm-$2 asm
LNPREFIX="../../include2/asm/"
cd ../include
rm -rf asm-$2
rm -f asm
mkdir asm-$2
ln -s asm-$2 asm
else
cd ./include #切换到include目录
rm -f asm
ln -s asm-$2 asm #$2=arm 创建该目录下asm-arm的软链接asm
fi
rm -f asm-$2/arch #删除可能以前创建的asm-arm/arch
if [ -z "$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch #LNPREFIX为空
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc #删除可能以前创建的asm-arm/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc #创建proc-armv软链接asm-arm/proc
fi
3. 在include目录下创建顶层Makefile要包含的文件include/config.mk,参见代码:
#
# Create include file for Make
#
echo "ARCH = $2" > config.mk #创建config.mk文件
echo "CPU = $3" >> config.mk #追加到config.mk文件中
echo "BOARD = $4" >> config.mk
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
创建的config.mk文件的内容如下:
ARCH =arm
CPU = arm920t
BOARD = smdk2410
SOC = s3c24x0
4. 在include目录下制作产生特定于smdk2410参考板的头文件 include/config.h,参见代码:
#
# Create board specific header file
#
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include
APPEND维持原值”no”,所以config.h被重新建立,它的内容如下:
/* Automatically generated - do not edit */
#include