,要求在U-Boot里加点功能,使之启动的时候能对这几个芯片进行初始化,并提供U-Boot命令,方便动态调试。
有经验的同事给我操作一下,进入U-Boot源码目录,然后执行:
$ make at91sam9263ek_config
我有一点不解,执行这个命令是在干嘛?于是我用vi打开Makefile文件,查找到“at91sam9263”这个关键字。
at91sam9263ek_config : unconfig
@./mkconfig $(@:_config=) arm arm9263ejs at91sam9263ek NULL at91sam9263x
当执行 "make at91sam9263ek_config"时,make就会去找到Makefile文件里的at91sam9263ke_config这个目标,然后执行下面的语句。
我们可以看到,make调用了mkconfig并带了6个参数。这6个参数分别是干什么用的呢?
$(@:_config=) ——其传换后的值就是at91sam9263ek,就是将目标名去掉了后面的"_config"得来。
arm ——指定平台,除了arm,还i386,mps,PowerPC等等,平台之后的区别在于CPU的指令不一样,CPU架构也不一样。
arm9263ejs ——具体的芯片型号,因为每个CPU芯片所带的功能模块有差异。
at91sam9263ek ——主板型号,因为很多主板有特殊的芯片组,实现特殊的功能。
NULL ——不知道干什么用的
at91sam9263x ——也不知道干什么用的。
这个mkconfig后面所带的参数决定了我们编译的时候编译哪些文件、怎么编译。那么我们来看一下这个mkconfig脚本文件是怎么实现的。
(1)检查参数里有没有"-a"或"-n"的,设置APPEND与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
如果有"-a"那么APPEND=yes,这个参数后面会用到。"-n",那么BOARD_NAME=??
这里没有"-a"与"-n"参数
(2)如果没有设置BOARD_NAME,那么就默认为第一个参数
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
$1==>$(@:_config=)==>at91sam9263ek
这后BOARD_NAME没有启多大的作用,可以不用关心它。
(3)检查参数的个数是否符合要求
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
如果不满足 4<=$#<=6,那么就退出。
(4)创建src/include/asm符号链接文件
if [ "$SRCTREE" != "$OBJTREE" ] ; then
...
else
cd ./include
rm -f asm
ln -s asm-$2 asm
fi
跟据$2的值,这里是"arm",创建asm-arm的符号文件asm。这样只要访问这个src/include/asm就是访src/include/asm_arm。
(5)创建src/include/asm/arch符号链接文件
rm -f asm-$2/arch
if [ -z "$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
由于第4步已经将src/include/asm指定为src/include/asm-arm了。
那么这里根据$3或$6来决定那么arch-??文件链接为src/include/asm/arch。
(6)写src/include/config.mk文件
echo "ARCH = $2" > config.mk
echo "CPU = $3" >> config.mk
echo "BOARD = $4" >> config.mk
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
将平台、CPU型号、主板型号写入config.mk文件,执行完后config.mk文件中就会有:
ARCH = arm
CPU = <span style="font-family: Courier New;">arm9263ejs</span> BOARD = <span style="font-family: Courier New;">at91sam9263ek</span>
(7)在src/include/config.h文件中插入文件包含语句
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "#include <configs/$1.h>" >>config.h
将"#include <configs/$1.h>"追加到config.h文件中。如果APPEND!=yes,那么将会覆盖原来config.h文件中有的内容。
在src/include/configs目录下有很多头文件,这里会根据$1的值从中抽取一个。
这样,通过mkconfig命令的执行就准备到了4个文件:
- src/include/asm
- src/include/asm/arch
- src/include/config.mk
- src/include/config.h
在编译U-Boot目标时,就会根据这几个文件进行编译。
对应的文件目录会被编译:
- src/cpu/$CPU
- src/board/$BOARD