S5PV210-uboot解析(一)-mkconfig分析

mkconfig分析
首先要注意一点,mkconfig文件是用来配置主Makefile中的一些参数的,但mkconfig文件本身并不是Makefile,Makefile文件只有文件名为Makefile或makefile以及后缀名为.mk的文件才是Makefile文件。mkconfig文件是一个shell脚本。
在主Makefile的后半段有对uboot的配置相关的命令,如下:

x210_sd_config : unconfig
@ $(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110
@echo "TEXT_BASE = 0xc3e00000" > $(obj) board/samsung/x210/config.mk

编译uboot时先执行make x210_sd_config 进行配置,这段代码中依赖unconfig是一个伪目标,执行的动作是清除配置文件。

回到x210_sd_config中,执行的第一行命令 @ $(MKCONFIG) $(@:_config=) arm s5pc11x x210 samsung s5pc110 作用就是向MKCONFIG中传递6个参数。这里有两点需要注意,一个是Makefile命令直接是一个文件名,经过测试发现Makefile命令为文件名会直接执行文件内的命令。第二个是对变量 $(@:_config=) 的理解,括号内的 ":"表示替换,即将$@变量里的_config赋值为空。在这里就是将变量x210_sd_config转换为x210_sd。$@变量经过测试@在括号内外都表示$@变量,没有变化。第二行打印链接地址到config.mk中。

之后再看mkconfig文件:

#!/bin/sh -e
 
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters:  Target  Architecture  CPU  Board [VENDOR] [SOC]
#
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
#

最开始配置了shell的-e参数,man手册查询-e参数的解释为errexit:If not interactive, exit immediately if any untested command fails.
然后通过注释了解到mkconfig文件的作用就是创建头文件并且链接至指定板子的uboot配置文件中。随后指出接受的参数有6个,分别是 目标、架构、CPU、板子、厂家、SoC

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"
 
$#  -lt 4 ] && exit 1
$#  -gt 6 ] && exit 1
 
echo   "Configuring for ${BOARD_NAME} board..."

接下来的定义两个变量,APPEND用来判断是否附加文件,默认no直接创建配置文件。BOARD_NAME保存板子名字。
while循环根据传递的参数执行相应命令,一般没有额外的参数,直接break跳出循环。
接着判断BOARD_NAME是否有值,如果没有就赋值为$1第一个参数的值。
接下来两个判断,如果参数个数小于4或者大于6就返回错误。

#
# 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
     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
     ln  -s   ${LNPREFIX}arch- $6   asm- $2 /arch
fi

创建链接到具体架构的配置文件,if内的内容是源码目录和目标目录不同时的操作,单独输出文件夹编译时作用,略过不看。else是原地编译时的操作。
先进入./include,然后先清除asm然后链接asm-arm到asm。接着的if当$6(s5pc110)为空或为”NULL"时进行链接,这里$6是不为空的,所以链接了 ln  -s   ${LNPREFIX}arch- $6   asm- $2 /arch 。(变量${LNPREFIX}在输出文件夹选项看到有赋值,而原地编译分支是没有赋值的,为空。)但是从实际编译uboot得到的文件可以看出这里实际并没有执行,随后在脚本后面的内容中发现对这个操作进行了更正。 还要注意的是这里进入./include后没有cd ..出来,之后的操作都是在include目录下的操作。

……
# create link for s5pc11x SoC
if [  "$3"   "s5pc11x"   ] ; then
         rm   -f   regs. h
         ln  -s   $6 . h   regs. h
         rm   -f   asm- $2 /arch
         ln  -s   arch- $3   asm- $2 /arch
fi

这里看出删除了   asm- $2 /arch 也就是之前的符号链接文件,重新链接了 ln  -s   arch- $3   asm- $2 /arch

#
# Create include file for Make
#
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
#
# 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 <configs/$1.h>"   >>config. h
 
exit 0

最后将参数输出到config.mk文件中还有创建指定板子型号的头文件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值