【OK210试用体验】u-boot篇 -- u-boot配置过程分析 - 在线问答 - 电子技术论坛 - 最好最受欢迎电子论坛!

【OK210试用体验】u-boot篇 -- u-boot配置过程分析

【OK210试用体验】u-boot篇 -- u-boot配置过程分析


    u-boot为我们做的工作先是建好配置文件,然后再根据配置文件来编译,移植u-boot,了解其配置过程还是有重大意义的。

    分析u-boot的配置过程就是分析它的Makefile,这之中需要用到GNU make的知识,可以参考《GNU make中文手册》,shell编程语法知识等等。也可以参看《嵌入式Linux应用开发完全手册》。

   

Makefile

    在u-boot顶层的Makefile中,有 ,这里可以知道当我们输入命令
  1. make smdkc100_config
复制代码
所执行的过程。

    %_confi前面的 %是通配符,会匹所有_config 为后缀 的目标,::  Makefile的中多目标规则,可以同时配置多种板子。可以通过搜索知道MKCONFIG即是mkconfig,也就是顶层目录下的mkconfig。

    执行这条命令等于 **/mkconfig -A smdkc100。

    进入mkconfig。



mkconfig


在mkconfig的开始,传入 -A smdkc100.
  1. if [ ( $# -eq 2 ) -a ( "$1" = "-A" ) ] ; then
  2.         # Automatic mode
  3.         line=`awk '($0 !~ /^#/ && $7 ~ /^'"$2"'$/) { print $1, $2, $3, $4, $5, $6, $7, $8 }' $srctree/boards.cfg`
  4.         if [ -z "$line" ] ; then
  5.                 echo "make: *** No rule to make target `$2_config'.  Stop." >&2
  6.                 exit 1
  7.         fi

  8.         set ${line}
  9.         # add default board name if needed
  10.         [ $# = 3 ] && set ${line} ${1}
  11. fi
复制代码
   这里需要明白awk这个工具的使用。装载一篇awk常用命令文章
http://www.cnblogs.com/repository/archive/2011/05/13/2045927.html。

    这里第一个if的判断为真,参数为2,$1为’-A‘。$srctree/boards.cfg中的srctree通过搜索知道为当前目录,即**/board.cfg,在board.cfg中有Status, Arch, CPU:SPLCPU, SoC, Vendor, Board name, Target, Options, Maintainers信息。
  1. Active  arm         armv7          s5pc1xx     samsung         smdkc100            smdkc100                             -   
复制代码
这条即为我们所要的信息。  

    执行的结果:

                状态   架构  CPU   SOC     厂商       单板目标    配置目标  选项

        line=Active arm armv7 s5pc1xx samsung smdkc100 smdkc100 -

$#=8         $1    $2    $3      ....                                                  $8               

   

   

  1. while [ $# -gt 0 ] ; do
            case "$1" in
            --) shift ; break ;;
            -a) shift ; APPEND=yes ;;
            -n) shift ; BOARD_NAME="${7%_config}" ; shift ;;
            -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;
            *)  break ;;
            esac
    done
复制代码
   while中判断为真,但是 -- 、-a、-n、-t都没有符合的,所以这里没有起作用。

   
  1. [ "${BOARD_NAME}" ] || BOARD_NAME="${7%_config}"

  2. arch="$2"
  3. cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $1}'`
  4. spl_cpu=`echo $3 | awk 'BEGIN {FS = ":"} ; {print $2}'`
  5. if [ "$6" = "" ] ; then
  6.         board=
  7. elif [ "$6" = "-" ] ; then
  8.         board=${BOARD_NAME}
  9. else
  10.         board="$6"
  11. fi
  12. [ "$5" != "-" ] && vendor="$5"
  13. [ "$4" != "-" ] && soc="$4"
  14. [ $# -gt 7 ] && [ "$8" != "-" ] && {
  15.         # check if we have a board config name in the options field
  16.         # the options field mave have a board config name and a list
  17.         # of options, both separated by a colon (':'); the options are
  18.         # separated by commas (',').
  19.         #
  20.         # Check for board name
  21.         tmp="${8%:*}"
  22.         if [ "$tmp" ] ; then
  23.                 CONFIG_NAME="$tmp"
  24.         fi
  25.         # Check if we only have a colon...
  26.         if [ "${tmp}" != "$8" ] ; then
  27.                 options=${8#*:}
  28.                 TARGETS="`echo ${options} | sed 's:,: :g'` ${TARGETS}"
  29.         fi
  30. }
复制代码
   这里执行的结果为:
                CONFIG_NAME=smdkc100
                BOARD_NAME=smdkc100
                arch=arm
                cpu=armv7
                spl_cpu=空
                board=smdkc100
                vendor=samsung
                soc=s5pc1xx

     
  1. if [ "$options" ] ; then
  2.         echo "Configuring for ${BOARD_NAME} - Board: ${CONFIG_NAME}, Options: ${options}"
  3. else
  4.         echo "Configuring for ${BOARD_NAME} board..."
  5. fi
复制代码
   这里执行后就是打印出的信息:configuring for smdkc100 board...
   
  1. #
  2. # Create link to architecture specific headers
  3. #
  4. if [ -n "$KBUILD_SRC" ] ; then
  5.         mkdir -p ${objtree}/include
  6.         LNPREFIX=${srctree}/arch/${arch}/include/asm/
  7.         cd ${objtree}/include
  8.         mkdir -p asm
  9. else
  10.         cd arch/${arch}/include
  11. fi

  12. rm -f asm/arch

  13. if [ -z "${soc}" ] ; then
  14.         ln -s ${LNPREFIX}arch-${cpu} asm/arch
  15. else
  16.         ln -s ${LNPREFIX}arch-${soc} asm/arch
  17. fi

  18. if [ "${arch}" = "arm" ] ; then
  19.         rm -f asm/proc
  20.         ln -s ${LNPREFIX}proc-armv asm/proc
  21. fi

  22. if [ -z "$KBUILD_SRC" ] ; then
  23.         cd ${srctree}/include
  24. fi
复制代码
   创建架构相关头文件的链接。

  1. #
  2. # Create include file for Make
  3. #
复制代码
   同理创建include文件和单板头文件。
    在arch/cpu/include/asm下输入命令来查看是否建立好链接
  1. ll arch
  2. ll proc
复制代码
  创建好make文件后可以在跟文件夹下的include文件下查看到config.mk,里面内容为:
               
    在单板头文件创建中,目录**/include/config.h,在这个头文件 中定义了单板相关的宏,包含配置在这个头文件 中定义了单板相关的宏,包含配 configs/smdkc100.h ,我们需要针自己的单板配置这个头文件 。

make smdkc100_config做了什么?

1. 传递配置相关参数,如CPU、架构、厂商,单板目标、配置目标等
    2. 创建架构相关的头文件链接
    3. 为make创建头文件 (**/include/config.mk)
    4. 创建单板相关的头文件(**/include/config.h)

0个回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则


关闭

站长推荐上一条 /6 下一条

小黑屋|手机版|Archiver|电子发烧友 ( 湘ICP备2023018690号 )

GMT+8, 2024-12-18 19:44 , Processed in 0.559052 second(s), Total 52, Slave 36 queries .

Powered by 电子发烧友网

© 2015 bbs.elecfans.com

微信扫描
快速回复 返回顶部 返回列表