zoukankan      html  css  js  c++  java
  • uboot 版本号生成过程

    uboot版本号貌似与实际开发不相关,但是我现在遇到一个bug与版本号关联密切。

    这个bug与《uboot dm9000驱动故障》基本上是一样的,但是在上一篇博文中我没有详细说明。

    bug发生现象:

    将svn仓库代码通过git-svn下载到本地,然后编译,生成的u-boot-nand.bin通过sd卡烧写到开发板,然后重启开发板,

    但是仅仅会重复显示如下信息:

    U-Boot 2011.06-00000-gccc7fce-svn222 (May 28 2014 - 09:55:33)Hwgw6410
    
    
    CPU:     S3C6400@533MHz
             Fclk = 533MHz, Hclk = 133MHz, Pclk = 66MHz (SYNC Mode) 
    Board: HWGW6410
    DRAM:  128 MiB

    之后如果在代码中任意一个源代码文件中添加一个空白字符并保存,然后编译,再通过sd卡烧写,重启开发板后

    就能够正常执行uboot所有功能。

    这两次生成的u-boot-nand.bin文件大小仅仅相差4个字节(分别为381708和381712个字节)

    而这两个版本生成的u-boot-nand.bin惟一的差别就是版本号字符串这个地方不一样,本地编辑文件后未上传到svn仓库时,

    其生成的uboot字符串前面这一部分内容如下:

    U-Boot 2011.06-00000-gccc7fce-dirty-svn222 

    仅仅是字符串中多了-dirty这几个字符。

    整个u-boot字符串生成过程如下。

    在Makefile中:

    $(VERSION_FILE):
            @( localvers='$(shell $(TOPDIR)/tools/setlocalversion $(TOPDIR))' ; 
               printf '#define PLAIN_VERSION "%s%s"
    ' 
                "$(U_BOOT_VERSION)" "$${localvers}" ; 
               printf '#define U_BOOT_VERSION "U-Boot %s%s"
    ' 
                "$(U_BOOT_VERSION)" "$${localvers}" ; 
            ) > $@.tmp
            @( printf '#define CC_VERSION_STRING "%s"
    ' 
             '$(shell $(CC) --version | head -n 1)' )>>  $@.tmp
            @( printf '#define LD_VERSION_STRING "%s"
    ' 
             '$(shell $(LD) -v | head -n 1)' )>>  $@.tmp
            @cmp -s $@ $@.tmp && rm -f $@.tmp || mv -f $@.tmp $@

    Makefile中调用tools/setlocalversion生成localvers,然后根据将U_BOOT_VERSION和localvers串接起来生成PLAIN_VERSION和新的U_BOOT_BESION.

    tools/setlocalversion代码如下:

    #!/bin/sh
    # Print additional version information for non-release trees.
    
    usage() {
        echo "Usage: $0 [srctree]" >&2
        exit 1
    }
    
    cd "${1:-.}" || usage
    
    # Check for git and a git repo.
    if head=`git rev-parse --verify HEAD 2>/dev/null`; then
        # Do we have an untagged version?
        if git name-rev --tags HEAD | 
           grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then
                (git describe || git describe --tags || git describe --all --long) 
                    2>/dev/null | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
        fi
    
        # Are there uncommitted changes?
        git update-index --refresh --unmerged > /dev/null
        if git diff-index --name-only HEAD | grep -v "^scripts/package" 
            | read dummy; then
            printf '%s' -dirty
        fi
    
        # Is this git on svn?
        if git config --get svn-remote.svn.url >/dev/null; then
            printf -- '-svn%s' "`git svn find-rev $head`"
        fi
    fi
    
    # Check for svn and a svn repo.
    if rev=`svn info 2>/dev/null` ; then
        rev=`echo "${rev}" | grep '^Revision' | awk '{print $NF}'`
        printf -- '-svn%s' $rev
    fi
    
    # Check for any localversion-* files
    printf '%s' "`cat localversion-* 2>/dev/null`"

    在setlocalversion文件中根据svn和git的不同,生成不同的版本号字符串,详细过程可以自己分析。

    得到U_BOOT_VERSION后,在arch/arm/lib/board.c中有下面的代码:

    const char version_string[] =
         U_BOOT_VERSION" (" U_BOOT_DATE " - " U_BOOT_TIME ")"CONFIG_IDENT_STRING;

    该代码将U_BOOT_VERSION 以及日期时间以及CONFIG_IDENT_STRING都串接在一起就得到uboot版本号字符串。

    我的bug修改方式是将Makefile中PLAIN_VERSION和U_BOOT_VERSION中的localvers删除掉,然后将include/configs/*6410*.h中的

    CONFIG_IDENT_STRING字符串中添加一些内容,凑到以前能够成功的长度就可以了。

    这个修改方法是有点挫的,但是因为对整个uboot机制的不熟悉,只能用这个方法来作为权宜之计了。

  • 相关阅读:
    UVa 1151 Buy or Build【最小生成树】
    UVa 216 Getting in Line【枚举排列】
    UVa 729 The Hamming Distance Problem【枚举排列】
    HDU 5214 Movie【贪心】
    HDU 5223 GCD
    POJ 1144 Network【割顶】
    UVa 11025 The broken pedometer【枚举子集】
    HDU 2515 Yanghee 的算术【找规律】
    Java基本语法
    Java环境变量,jdk和jre的区别,面向对象语言编程
  • 原文地址:https://www.cnblogs.com/qiaoqiao2003/p/3756669.html
Copyright © 2011-2022 走看看