===分析uboot的配置过程(mkconfig脚本)===
uboot怎么配置?我们在终端上执行make NAME_config时的运行过程解析!
我们执行make x210_sd_config时会运行makefile的这两行程序,先分析下
第二行:echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
就是讲链接地址写入到 $(obj)board/samsung/x210/config.mk文件中。@是静默编译
其实有些板子的配置第二行时也可以这样做,进入 $(obj)board/samsung/x210/文件夹
手工创建 config.mk文件 写入TEXT_BASE = 0xc3e00000。
接着我们来分析第一行命令,这个其实就是运行uboot根目录下的mkconfig文件,
并传入6个参数:$(@:_config=) arm s5pc11x x210 samsung s5pc110
$1:$(@:_config=) :去掉目标x210_sd_config中的_config字符串也就是 x210_sd
$2:arm
$3:s5pc11x
$4:x210
$5:samsung
$6:s5pc110
然后开始运行mkconfig····
以上这段shell脚本主要的功能是打印板子的名字
echo "Configuring for ${BOARD_NAME} board..." ${BOARD_NAME} = $1 = x210_sd
所以在配置是会打印出 Configuring for x210_sd board... 如图:
继续看脚本,下面的的工作主要是创建符号链接:
#
# 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
#我们是默认编译运行这里
#创建符号链接1:arm -> asm-arm
cd ./include
rm -f asm
ln -s asm-$2 asm
fi
rm -f asm-$2/arch
if [ -z "$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
#创建符号链接“2”(后面会被删除 所以这个不算):
#asm-arm/arch -> arch-s5pc110
ln -s ${LNPREFIX}arch-$6 asm-$2/archfi
#不执行
# create link for s3c24xx SoCif [ "$3" = "s3c24xx" ] ; thenrm -f regs.hln -s $6.h regs.hrm -f asm-$2/archln -s arch-$3 asm-$2/archfi
#不执行
# create link for s3c64xx SoCif [ "$3" = "s3c64xx" ] ; thenrm -f regs.hln -s $6.h regs.hrm -f asm-$2/archln -s arch-$3 asm-$2/archfi
#不执行
# create link for s5pc1xx SoCif [ "$3" = "s5pc1xx" ] ; then rm -f regs.h ln -s $6.h regs.h rm -f asm-$2/arch ln -s arch-$3 asm-$2/archfi# create link for s5pc11x SoCif [ "$3" = "s5pc11x" ] ; then
#创建符号链接2:regs.h -> s5pc110.h
rm -f regs.h ln -s $6.h regs.h
#删除上面创建的链接“2” 创建下面新的(算打补丁吧 不直接该上面的)
#创建符号链接3:asm-arm/arch -> arch-s5pc11x
rm -f asm-$2/arch ln -s arch-$3 asm-$2/archfi
#不执行
# create link for s5p64xx SoCif [ "$3" = "s5p64xx" ] ; thenrm -f regs.hln -s $6.h regs.hrm -f asm-$2/archln -s arch-$3 asm-$2/archfi
#不执行
# create link for s5p644x SoCif [ "$3" = "s5p644x" ] ; thenrm -f regs.hln -s $6.h regs.hrm -f asm-$2/archln -s arch-$3 asm-$2/archfiif [ "$2" = "arm" ] ; then
#创建符号链接4:asm-arm/proc ->proc-armv
rm -f asm-$2/procln -s ${LNPREFIX}proc-armv asm-$2/procfi# create link for s3c64xx-mp SoCif [ "$3" = "s3c64xx-mp" ] ; thenrm -f regs.hln -s $6.h regs.hrm -f asm-$2/archln -s arch-$3 asm-$2/archfi
SO!!为虾米要创建这些符号链接呢??
因为为了移植不同的开发板SOC,比如源码中你在#include<asm/xxx.h>时,
其实兼容了所以版本板子的asm-soc/xxx.h 不是吗~~~
最后分析最后一段的shell脚本:(主要是生成include/config.mk文件和生成配置头文件include/config.h)
注意:此时的路径是在include下,所以上面生成的config.mk和config.h是在include下的:
config.mk的生成:
生成目的:在主makefile中要调用它。
生成内容:如下图:
config.h的生成:
生成目的:其实是为了更好的移植性,和上面做的符号链接类似:(config.h就是为了包含$1.h )
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
生成内容:如下图:
<configs/x210_sd.h>,这个头文件是我们移植x210开发板时,对开发板的宏定义配置文件。
这个文件是我们移植x210时最主要的文件。
x210_sd.h文件会被用来生成一个autoconf.mk文件,这个文件会被主Makefile引入,指导整
个编译过程。这里面的这些宏定义会影响我们对uboot中大部分.c文件中一些条件编译的选择。
从而实现最终的可移植性。