zoukankan      html  css  js  c++  java
  • uboot配置过程详解1

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

    $@--目标文件(x210_sd_config)的_config用空格来代替(=(空)),所以第一个变量就变成x210_sd

    Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
    $@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。

    以下为mkconfig的源码解释

    APPEND=no	# Default: Create new config file进来先定义2个变量 
    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

      

    // $#这里等于6 因为调用config这个配置的时候传了6个参数分别为$1= x210_sd、$2=arm、$3=s5pc11x、$4=x210、$5=samsumg、$6=s5pc110、

      $1(x210_sd)传进去用switch语句来判断是哪个case,在脚本里case 是会自动跳出的,如果加了break表示跳出while循环,且*表示任何情况。

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

      可以理解为简列的if语句,如果${BOARD_NAME}成立BOARD_NAME=“$1"就不执行,则反。其实就是看BOARD_NAME变量是否有值,如果有值就维持不变;如果无值就给他赋值为$1,实际分析结果:BOARD_NAME=x210_sd,前面刚开始定义变量就已经赋空了(BOARD_NAME="")。

    [ $# -lt 4 ] && exit 1     //if($#<4)  return 1
    [ $# -gt 6 ] && exit 1    //if($#>6)  return 1
    
    echo "Configuring for ${BOARD_NAME} board..."
    

      传参的时候只能4、5、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
    
    # 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
    
    if [ "$2" = "arm" ] ; then
        rm -f asm-$2/proc
        ln -s ${LNPREFIX}proc-armv asm-$2/proc
    fi
    
    # create link for s3c64xx-mp SoC
    if [ "$3" = "s3c64xx-mp" ] ; then
        rm -f regs.h
        ln -s $6.h regs.h
        rm -f asm-$2/arch
        ln -s arch-$3 asm-$2/arch
    fi

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

    第一个:在include目录下创建asm文件,指向asm-arm。(46-48行)
    第二个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc110
    第三个:在include目录下创建regs.h文件,指向include/s5pc110.h
    删除第二个。
    第四个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc11x
    第五个:在include/asm-arm下创建一个proc文件,指向include/asm-arm/proc-armv

    总结:一共创建了4个符号链接。这4个符号链接将来在写代码过程中,头文件包含时非常有用。譬如一个头文件包含可能是:#include <asm/xx.h>

    注意:uboot的整个配置过程,很多文件之间是有关联的(有时候这个文件是在那个文件中创建出来的;有时候这个文件被那个文件包含进去;有时候这个文件是由那个文件的内容生成的决定的)
    注意:uboot中配置和编译过程,所有的文件或者全局变量都是字符串形式的(不是指的C语言字符串的概念,指的是都是字符组成的序列)。这意味着我们整个uboot的配置过程都是字符串匹配的,所以一定要细节,注意大小写,要注意不要输错字符,因为一旦错一个最后会出现一些莫名其妙的错误,很难排查,这个是uboot移植过程中新手来说最难的地方。

  • 相关阅读:
    关于二进制补码表示法的一些备忘
    没有''结尾的字符串输出(0)
    关于malloc与字符指针的一些易错点
    centos安装tmux过程
    mac包管理器Homebrew安装命令
    windows下ThinkPHP3.2.3使用memcache缓存
    AJAX请求 $.ajaxSetup方法的使用:设置AJAX请求的默认参数选项,当程序中需要发起多个AJAX请求时,则不用再为每一个请求配置请求的参数
    Name for argument type [java.lang.String] not available
    ag grid
    Javascript 严格模式use strict详解
  • 原文地址:https://www.cnblogs.com/yygsj/p/5312979.html
Copyright © 2011-2022 走看看