zoukankan      html  css  js  c++  java
  • uboot2010.03 配置编译目标分析 .

    转载自:http://blog.csdn.net/yyttiao/article/details/7899008
     
    该系列教程会根据uboot的编译过程进程分析,如何编译,那么将会如何分析这些流程
    此处我还没有增加6410的支持,先看6400 的过程,因为还没有到增加的地方,分析完整个流程之后,会写如何移植uboot到s3c6410的。知道了工作的流程,再去移植会事半功倍的。

    拿到uboot首先会修改编译的目标:

    make smdk6400_config

    对执行如下的目标
    1. #########################################################################  
    2. ## ARM1176 Systems   
    3. #########################################################################  
    4. smdk6400_noUSB_config   \  
    5. smdk6400_config :   unconfig  
    6.     @mkdir -p $(obj)include $(obj)board/samsung/smdk6400  
    7.     @mkdir -p $(obj)nand_spl/board/samsung/smdk6400  
    8.     @echo "#define CONFIG_NAND_U_BOOT" > $(obj)include/config.h  
    9.     @if [ -z "$(findstring smdk6400_noUSB_config,$@)" ]; then    \  
    10.         echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\  
    11.         $(MKCONFIG) $(@:_config=) arm arm1176 smdk6400 samsung s3c64xx;  \  
    12.     else     \  
    13.         echo "RAM_TEXT = 0xc7e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\  
    14.         $(MKCONFIG) $(@:_noUSB_config=) arm arm1176 smdk6400 samsung s3c64xx;   \  
    15.     fi  
    16.     @echo "CONFIG_NAND_U_BOOT = y" >> $(obj)include/config.mk  

    这里主要看的是如下2句
    1. echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\  
    2. $(MKCONFIG) $(@:_config=) arm arm1176 smdk6400 samsung s3c64xx;  \  
    首先会将RAM_TEXT = 0x57e00000 写入到$(obj)board/samsung/smdk6400/config.tmp 这个文件内
    $(obj) 是目标的编译生成的路劲或者是当前UBOOT的目录,这就要看你有没有指定编译目录了

    重点分析$(MKCONFIG) $(@:_config=) arm arm1176 smdk6400 samsung s3c64xx; \
    会调用$(MKCONFIG) 而 MKCONFIG := $(SRCTREE)/mkconfig
    也就是说最终会变成如下形式
    mkconfig smdk6400 arm arm1176 smdk6400 samsung s3c64xx

    下面就得进入mkconfig的代码内进行分析。。记录上面的参数,请大家打开对应的文件,一步步的看着然后分析
    1. #!/bin/sh -e   
    2.   
    3. # Script to create header files and links to configure  
    4. # U-Boot for a specific board.   
    5. #   
    6. # Parameters: Target Architecture CPU Board [VENDOR] [SOC]  
    7. #   
    8. # (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>  
    9. #  
    这里有一句说明了参数的意思Parameters: Target Architecture CPU Board [VENDOR] [SOC]
    对应我们传递进来的参数看到为:
    Parameters:
    1:Target = smdk6400
    2:Architecture = arm
    3:CPU = arm1176
    4:Board = smdk6400
    5:[VENDOR] = samsung
    6:[SOC] = s3c64xx

    1. APPEND=no   # Default: Create new config file  
    2. BOARD_NAME=""   # Name to print in make output  
    3. TARGETS=""  
    4.   
    5. while [ $# -gt 0 ] ; do  
    6.     case "$1" in  
    7.         --) shift ; break ;;  
    8.         -a) shift ; APPEND=yes ;;  
    9.         -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;  
    10.         -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;  
    11.         *) break ;;  
    12.     esac  
    13. done  
    这里显示没有没有特殊的标志,所以就不需要了
    1. "${BOARD_NAME}" ] || BOARD_NAME="$1"  
    2.   
    3. [ $# -lt 4 ] && exit 1  
    4. [ $# -gt 6 ] && exit 1  
    5.   
    6. if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then  
    7.     echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2  
    8.     exit 1  
    9. fi  
    10.   
    11. echo "Configuring for ${BOARD_NAME} board..."  
    12. /*这句就是我们看到的配置信息了*/  

    下面开始创建针对目标平台的连接目录了。uboot是这么编译的,将选中的平台相关的文件夹,通过软连接的方式,到一个指定的目录
    那么编译的时候,就只要去这个统一的指定目录下找,就能针对不同的平台编译了。具体看下下面的建立过程
    1. #   
    2. # Create link to architecture specific headers  
    3. #   
    4. /* 这里表示目标目录跟源码目录不一致,建立相应的目录,由于我没有指定目标目录,所以执行else部分 */  
    5. if [ "$SRCTREE" != "$OBJTREE" ] ; then  
    6.     mkdir -p ${OBJTREE}/include  
    7.     mkdir -p ${OBJTREE}/include2  
    8.     cd ${OBJTREE}/include2  
    9.     rm -f asm  
    10.     ln -s ${SRCTREE}/include/asm-$2 asm  
    11.     LNPREFIX="../../include2/asm/"  
    12.     cd ../include  
    13.     rm -rf asm-$2  
    14.     rm -f asm  
    15.     mkdir asm-$2  
    16.     ln -s asm-$2 asm  
    17. else  
    18.     cd ./include  
    19.     /* 删除asm目录 */  
    20.     rm -f asm  
    21.     /*  
    22.      * 建立asm指向对应的目录,根据我上面标的,$2就是 2:Architecture = arm  
    23.      * 所以这里就是 ln -s asm-arm asm 
    24.      */  
    25.     ln -s asm-$2 asm  
    26. fi  
    27.   
    28. /* 
    29. * 这里开始建立arch目录,有了上面的asm目录建立,这里就简单多了 
    30. * 删除 rm -f asm-arm/arch 
    31. */  
    32. rm -f asm-$2/arch  
    33.   
    34. if [ -z "$6" -o "$6" = "NULL" ] ; then  
    35.     ln -s ${LNPREFIX}arch-$3 asm-$2/arch  
    36. else  
    37.     /* 
    38.      * ln -s arch-s3c64xx asm-arm/arch 
    39.      */  
    40.     ln -s ${LNPREFIX}arch-$6 asm-$2/arch  
    41. fi  
    42.   
    43. /* 如果是arm平台,需要多建立一个proc目录 */  
    44. if [ "$2" = "arm" ] ; then  
    45.     rm -f asm-$2/proc  
    46.     ln -s ${LNPREFIX}proc-armv asm-$2/proc  
    47. fi  
    48.   
    49. #   
    50. # Create include file for Make   
    51. #   
    52. /* 
    53. * 这里为make编译的时候创建一些环境变量,写入到config.mk文件 
    54. */  
    55. echo "ARCH = $2" > config.mk  
    56. echo "CPU = $3" >> config.mk  
    57. echo "BOARD = $4" >> config.mk  
    58.   
    59. "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk  
    60.   
    61. "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk  
    62.   
    63. # Assign board directory to BOARDIR variable  
    64. if [ -z "$5" -o "$5" = "NULL" ] ; then  
    65.     BOARDDIR=$4  
    66. else  
    67.     BOARDDIR=$5/$4  
    68. fi  
    69.   
    70. #   
    71. # Create board specific header file  
    72. #   
    73. /* 
    74. * 开始创建特殊的头文件,被好多文件加载的 
    75. * APPEND = no,于是创建了新的config.h 
    76. */  
    77. if [ "$APPEND" = "yes" ]    # Append to existing config file  
    78. then  
    79.     echo >> config.h  
    80. else  
    81.     > config.h    # Create new config file  
    82. fi  
    83.   
    84. /* 写入如下信息到该新建的头文件内 */  
    85. echo "/* Automatically generated - do not edit */" >>config.h  
    86.   
    87. for i in ${TARGETS} ; do  
    88.     echo "#define CONFIG_MK_${i} 1" >>config.h ;  
    89. done  
    90.   
    91. cat << EOF >> config.h  
    92. #define CONFIG_BOARDDIR board/$BOARDDIR  
    93. #include <config_defaults.h>  
    94. /* 这里需要注意的是,$1 对应的是smdk6400 正好指定了 include/config/smdk6400.h 配置头文件,也就是为什么移植需要该这个头文件,否则找不到的原因 */  
    95. #include <configs/$1.h>   
    96. #include <asm/config.h>   
    97. EOF  
    98.   
    99. exit 0  

    整个配置过程就结束了。下面进行总结下

    1:在Makefile中将RAM_TEXT = 0x57e00000 写入board/samsung/smdk6400/config.tmp 中
       这个地址在最终会变成 TEXT_BASE 可以在board/samsung/smdk6400/config.mk 中看到
       echo "RAM_TEXT = 0x57e00000" >> $(obj)board/samsung/smdk6400/config.tmp;\

    2:创建软连接到目标生成的工作目录下,不指定就是在uboot的源码目录下
       ln -s asm-$2 asm
       ln -s ${LNPREFIX}arch-$6 asm-$2/arch
       ln -s ${LNPREFIX}proc-armv asm-$2/proc

    3:创建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

    4:创建头文件,指向配置的头文件 include/config.h
       cat << EOF >> config.h
       #define CONFIG_BOARDDIR board/$BOARDDIR
       #include <config_defaults.h>
       #include <configs/$1.h>
       #include <asm/config.h>
       EOF
  • 相关阅读:
    149. Max Points on a Line(js)
    148. Sort List(js)
    147. Insertion Sort List(js)
    146. LRU Cache(js)
    145. Binary Tree Postorder Traversal(js)
    144. Binary Tree Preorder Traversal(js)
    143. Reorder List(js)
    142. Linked List Cycle II(js)
    141. Linked List Cycle(js)
    140. Word Break II(js)
  • 原文地址:https://www.cnblogs.com/start530/p/3834391.html
Copyright © 2011-2022 走看看