• 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机制的不熟悉,只能用这个方法来作为权宜之计了。

  • 相关阅读:
    1988-B. 有序集合
    1987-A. 集训队选拔
    1964-NP
    1963-带妹子去看电影
    1962-Fibonacci
    1961-计算机基础知识大赛 2 (new)
    TCP/IP协议详解 卷一:协议 18章、TCP连接的建立与终止
    3、剑指offer--从尾到头打印链表
    2、剑指offer--替换空格
    1、剑指offer--二维数组中查找
  • 原文地址:https://www.cnblogs.com/qiaoqiao2003/p/3756669.html
Copyright © 2020-2023  润新知