【转】解析u-boot基于I.MX51

    技术2022-05-20  62

    原文地址: http://blog.sina.com.cn/s/blog_70b546060100lpva.html

     

    目录说明: u-boot 顶层目录 (TOPLEVEL) ~/myandroid/bootable/bootable/uboot-imx

           我们在编译过程中,在 ubuntu 命令行,使用的是如下命令:

    $ cd ~/myandroid/bootable/bootable/uboot-imx

    $ make mx51_bbg_android_config

    $ make uImage

           编译完成后,在 ~/myandroid/bootable/bootable/uboot-imx 目录中,就得到了 u-boot.bin 这个我们所需要的二进制文件。

           我们要分析的是,当 make mx51_bbg_android_config 这个命令执行时,内部都经过了那些过程,有哪些关键的相关文件参与编译。

           make mx51_bbg_android_config 执行时,以下过程会发生:

    一、执行顶层Makefile 文件中的“目标”

           这可以从 Makefile 文件中查到。

    第一步(第一段代码):

    mx51_bbg_android_config    /

    mx51_bbg_mfg_config /

    mx51_bbg_config         : unconfig

           @$(MKCONFIG) $(@:_config=) arm arm_cortexa8 mx51_bbg freescale mx51

           从这段代码中,可以看到,编译时执行以下 3 个命令,会是同样的效果:

    1 $ make mx51_bbg_android_config

    2 $ make mx51_bbg_mfg_config

    3 $ mx51_bbg_config

           上述三个不同的执行方式,其结果,都会去找 unconfig 所对应的代码段。

    第二步(第二段代码):

    unconfig:

           @rm -f $(obj)include/config.h $(obj)include/config.mk /

                  $(obj)board*/config.tmp /

                  $(obj)include/autoconf.mk $(obj)include/autoconf.mk.dep

           这段脚本代码,其作用很明显是为了删除上一次编译产生的所有文件,为本次编译进一次 clean 操作。

           Makefile 文件中,第一段代码位置在注释为“ ARM1136 Systems ”,大约第 3248 行前后,本来 I.MX51 arm_cortexa8 CPU 核,不知道为什么 U-BOOT 的编写者,把 I.MX51 对应的目标放在了这里。

           第二段代码的位置在 Makefile 文件开头不远的地方,大约 493 行前后的位置。

    第三部(执行第一段代码最后一句命令)

           在执行完 unconfig 目标对应的清理工作后,再回来执行第一段代码的最后一句:

           @$(MKCONFIG) $(@:_config=) arm arm_cortexa8 mx51_bbg freescale mx51

    稍微解释一下:

    MKCONFIG 变量的值,是指向顶层目录的 ./mkconfig 脚本文件。紧跟其后面的是 6 个要传给 ./mkconfig 脚本文件的参数,其中 $(@:_config=) 的值应该是“ mx51_bbg_android ”,其他 5 个分别对应着变量 ARCH CPU BOARD VENDOR SOC

           由此可以看出,当 make 解析这句代码时,其实就是在终端里执行这样的命令:

    $ ./mkconfig mx51_bbg_android arm arm_cortexa8 mx51_bbg freescale mx51

           即,给 mkconfig 脚本运行时带上 6 个参数。

    二、执行./mkconfig 命令

           从上面的分析,可以知道,现在开始执行:

           $ ./mkconfig mx51_bbg_android arm arm_cortexa8 mx51_bbg freescale mx51

           此时, mkconfig 脚本文件,究竟做了那些工作呢,我们就有必要对 mkconfig 这个可执行脚本进行重点分析一下,用 Source Insight 打开顶层目录的 mkconfig 文件,从头开始看它所做的工作:

    * mkconfig 文件内容

    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>

    #

    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

           首先,注意到上面的: Parameters 这一行,文档中做了解释,就是要接收后面的 6 个参数进来。“ # ”是注释用的。

           开头的注释,说明了该文件的作用:让 u-boot 为特定的板卡,创建 .H 头文件和 config 配置文件。

           上面的 2 个变量 APPEND BOARD_NAME ,有英文做了注释,很清楚。接下来,是一段循环语句和分支语句构成的脚本代码,进行如下解释:

    1 )“$# ”,在脚本规则中,表示命令行参数的数量。

           如果 $ ./mkconfig mx51_bbg_android arm arm_cortexa8 mx51_bbg freescale mx51 这条命令执行时,那么有: $0 =./mkconfig $1 = mx51_bbg_android$2=arm$3 = arm_cortexa8

    $4=mx51_bbg $5=freescale $6=mx51

           这样,就形成了一个线性参数表,类似一个数组:

           $1 , $2 , $3 , $4 , $5 , $6 (注意: $0 不在这个参数表里)

    2 )“gt” 表示大于的意思

        [ $# -gt 0 ] 表示参数的数量大于0 时。(每循环一次,做减1 操作)

    3 )“shift ”做的动作。

           Shift 是一个命令,它的前面 --) -a) -n) 等字符串,是 case 的比较条件。如果条件满足,比如 $1 = -a ,那么执行 -a) shift ; APPEND=yes ;; 这句话,首先 shift 把参数表中的 $1 删除,把后面的挨个往前移动,原来的 $2 变成了现在的 $1 ,然后,把 APPEND 变量修改为 yes ,这样循环判断并移动,直到循环条件不成立为止。

           显然,我们所执行的参数中,没有上面的 -- -a -n 等参数,那么,进入循环后,会执行 *)break;; 语句,直接终止循环,继续往下执行。

     

    [ "${BOARD_NAME}" ] || BOARD_NAME="$1"    # BOARD_NAME 赋值,不再是空

     

    [ $# -lt 4 ] && exit 1     # 参数数量 <4 时,退出

    [ $# -gt 6 ] && exit 1    # 参数数量 >6 时,退出

     

    echo "Configuring for ${BOARD_NAME} board..."  # 终端显示的内容

     

           运行至此, BOARD_NAME 的值应为 mx51_bbg_android ,并且在终端上会显示:

           Configuring for mx51_bbg_android board...


    最新回复(0)