uboot的移植之配置及编译过程详解5

/***********************************************************************************
    分析对象:源码主Makefile中进行配置时的一个重要的脚本:mkconfig(MKCONFIG)
    源码来源:以朱有鹏课程中的uboot-samsung-dev为分析对象
    作者:cryil先森
    时间:2018.11月下旬

文末附有uboot的源码链接
***********************************************************************************/    

***mkcongfig具体的功能:
    1.确定了开发板的一些名称信息,
    2.创建了相关头文件的链接。
    3.根据具体板子的信息,在根目录下创建config.mk文件,
    注:mkconfig是uboot的链接脚本。


    
***Makefile中和mkconfig有关的东西:

smdkv210onenand_config : unconfig
	@$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110
	@echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/smdkc110/config.mk
	@echo "CONFIG_ONENAND_U_BOOT = y" >> $(obj)include/config.mk

   分析: $# = 6$(@:_config=) :将_config用等号后面的内容替换掉,即得到了smdkv210onenand

    makefile给mkconfig传入的6个参数:$(@:_config=) arm s5pc11x smdkc110 samsung s5pc110  

    $1=smdkv210onenand
    $2: arm 
    $3:s5pc11x 
    $4:smdkc110 
    $5:samsung 
    $6:s5pc110        


***mkconfig的具体分析:

while [ $# -gt 0 ] ; do
		case "$1" in
		--) shift ; break ;;
		-a) shift ; APPEND=yes ;;
		-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
		*)  break ;;
		esac
	done


  注: $1=smdkv210onenand  则均不能匹配,直至*通配符,退出while循环。
        
 

   [ "${BOARD_NAME}" ] || BOARD_NAME="$1"  

注:查询BOARD_NAME是否有值,没有的话赋值为$1(smdkv210onenand) 

    [ $# -lt 4 ] && exit 1
    [ $# -gt 6 ] && exit 1


    注:规定了传入参数的个数要求,$#必须大于4小于6  即传入的参数必须4~6

    **33~118行:创建符号链接。
    符号链接文件是我们整个配置过程的核心,这些符号链接文件(文件夹)的主要作用是给头文件包含等过程提供指向性链接,是的uboot的有可移植性。
    uboot的移植原理:在uboot之中有很多彼此平行的代码,各自属于各自不同的架构/CPU/开发板,我们在具体到某个开发板的编译时用符号连接的方式提供一个具体名字的文件夹供编译器使用。就可以在配置过程中通过配置使用不同的文件,就可以正确的包含正确的文件。

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

 1.进行一个简单的判断,然后创建了连个文件夹include和include2

   并在进行判断之后最终在include目录下创建asm文件,指向sam-arm  

注:此时有一个重要的信息:我们所在的目录是根目录下的/include 目录下,之后的操作如果路径发生的变化自己一定要记住,这关乎文件的位置,十分的重要。

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


    判断$6是否为空,然后在对应的路径下创建连接文件

   在本文分析的情况下(一般都是这样的)在include/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc110  

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

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

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

# 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

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

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

    一系列与板子直接相关的判断信息,通过与传入mkconfig的六个参数的比较,创建与自己板子相匹配的链接文件。
    在本次分析里:在include目录下创建一个reg.h文件,指向include/s5pc110.h文件    

  并在include/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc11x  (覆盖了2中的符号链接)  
  

if [ "$2" = "arm" ] ; then
	rm -f asm-$2/proc
	ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi

  对$2进行判断,然后在inlude目录下创建了proc文件,指向 include/asm-$2/procproc-armv   


    注:在将来的代码之中头文件的包含将用到这些链接文件。

  

  echo "ARCH   = $2" >  config.mk
    echo "CPU    = $3" >> config.mk
    echo "BOARD  = $4" >> config.mk


    在include目录下创建了config.mk文件。
    注:>:检查目录,如果文件不存在则创建,然后在文件内追加>之前的内容。
        >>:在文件内的尾行追加>>之前的内容
 
    
  

 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


    简单的判断之后在include目录下下创建一个<config/smdkc110onenand.h>文件。                                              <config/smdkc110onenand.h>文件是我们移植是最重要的文件,
    涉及我们对开发板的宏定义配置文件。
    注:<config/smdkc110onenand.h>是针对smdkc110onenand板子的头文件。
    这些<config/*****.h>文件会被用来生成一个autoconfig.mk文件,而这个生成的文件会被主Makefile引用,指导整个编译过程,这里面的宏定义会影响我们对uboot中大部分.c文件的条件编译的选择,从而实现可移植性。

uboot的源码:

https://pan.baidu.com/s/1uoHGGgpQCMRa5kkagQOA8Q

提取码:n0r4

END...............  
    

猜你喜欢

转载自blog.csdn.net/qq_41464499/article/details/84331598