uboot 版本号生成过程

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

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

bug发生现象:

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

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

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

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

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

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

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

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

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

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

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

在Makefile中:

  1. $(VERSION_FILE):
  2. @( localvers='$(shell $(TOPDIR)/tools/setlocalversion $(TOPDIR))' ; \
  3. printf '#define PLAIN_VERSION "%s%s"\n' \
  4. "$(U_BOOT_VERSION)" "$${localvers}" ; \
  5. printf '#define U_BOOT_VERSION "U-Boot %s%s"\n' \
  6. "$(U_BOOT_VERSION)" "$${localvers}" ; \
  7. ) > $@.tmp
  8. @( printf '#define CC_VERSION_STRING "%s"\n' \
  9. '$(shell $(CC) --version | head -n 1)' )>> $@.tmp
  10. @( printf '#define LD_VERSION_STRING "%s"\n' \
  11. '$(shell $(LD) -v | head -n 1)' )>> $@.tmp
  12. @cmp -s $@ $@.tmp && rm -f $@.tmp || mv -f $@.tmp $@

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

tools/setlocalversion代码如下:

  1. #!/bin/sh
  2. # Print additional version information for non-release trees.
  3.  
  4. usage() {
  5. echo "Usage: $0 [srctree]" >&2
  6. exit 1
  7. }
  8.  
  9. cd "${1:-.}" || usage
  10.  
  11. # Check for git and a git repo.
  12. if head=`git rev-parse --verify HEAD 2>/dev/null`; then
  13. # Do we have an untagged version?
  14. if git name-rev --tags HEAD | \
  15. grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then
  16. (git describe || git describe --tags || git describe --all --long) \
  17. 2>/dev/null | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
  18. fi
  19.  
  20. # Are there uncommitted changes?
  21. git update-index --refresh --unmerged > /dev/null
  22. if git diff-index --name-only HEAD | grep -v "^scripts/package" \
  23. | read dummy; then
  24. printf '%s' -dirty
  25. fi
  26.  
  27. # Is this git on svn?
  28. if git config --get svn-remote.svn.url >/dev/null; then
  29. printf -- '-svn%s' "`git svn find-rev $head`"
  30. fi
  31. fi
  32.  
  33. # Check for svn and a svn repo.
  34. if rev=`svn info 2>/dev/null` ; then
  35. rev=`echo "${rev}" | grep '^Revision' | awk '{print $NF}'`
  36. printf -- '-svn%s' $rev
  37. fi
  38.  
  39. # Check for any localversion-* files
  40. printf '%s' "`cat localversion-* 2>/dev/null`"

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

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

  1. const char version_string[] =
  2. 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机制的不熟悉,只能用这个方法来作为权宜之计了。

uboot 版本号生成过程的更多相关文章

  1. uboot dm9000驱动故障

    手头有一块6410开发板,已经有别人提供的uboot代码(基于2011.06),但是在检测dm9000时显示下面的输出: Net: No ethernet found. 当然其他网络命令例如ping等 ...

  2. 嵌入式Linux驱动学习之路(五)u-boot启动流程分析

    这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加 ...

  3. 嵌入式Linux驱动学习之路(四)u-boot编译分析

    u-boot编译分析 在配置完成后,执行make开始编译.这里打开Makefile. 首先在目标all前有一句话首先检查是否有include/config.mk文件来判断是否成功配置过. ifeq ( ...

  4. tiny210——uboot移植Makefile文章分析

    这东西已经写,我们没有时间发布,如今,终于有时间稍微长送记录汇总uboot学习过程.具体了.以后忘了也能够再温习回来嘛有些特殊字符显示得乱掉了 Makefile追踪技巧: 技巧1:能够先从编译目标開始 ...

  5. U-Boot Makefile分析(5)主控Makefile分析

    这次分析源码根目录下的Makefile,它负责读入配置过的信息,通过OBJS.LIBS等变量设置能够参与镜像链接的目标文件,设定编译的目标等等. HOSTARCH := $(shell uname - ...

  6. 【Bootloader】探究bootloader,分析u-boot源码

    Preface 之前也发表过关于<Bootloader启动过程分析>的文章,但是内容表达得比较抽象,大多是文字叙述,所以这里从系统和代码的角度来深入分析bootloader的启动过程. 工 ...

  7. imx6 uboot启动流程分析

    参考http://blog.csdn.net/skyflying2012/article/details/25804209 这里以imx6平台为例,分析uboot启动流程对于任何程序,入口函数是在链接 ...

  8. uboot 2013.01 代码简析(3)第二阶段初始化

    u-boot第二阶段初始化内容的入口函数是_main,_main位于arch/arm/lib/crt0.S文件中: _main函数中先为调用board_init_f准备初始化环境(设置栈指针sp和并给 ...

  9. mt7620 uboot

    我本机装的是64位Ubuntu, SDK 里提供的 buildroot-gcc342 是32位的,无法直接运行,需要先安装 gcc-multilib. sudo apt-get install gcc ...

随机推荐

  1. UEditor整合代码高亮插件SyntaxHighlighter

    1  下载UEditor : http://ueditor.baidu.com/website/download.html 下载SyntaxHighlighter :https://github.co ...

  2. LeetCode——Implement Stack using Queues

    Description: Implement the following operations of a stack using queues. push(x) -- Push element x o ...

  3. Android N 7 【 classes.dex】反编译失败:com.googlecode.d2j.DexException: not support version.

    Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. D:\Android反编译工具[全]\2016\d ...

  4. 报错 ERROR in static/js/vendor.b3f56e9e0cd56988d890.js from UglifyJs

    开发vux项目在引入 // 表单验证组件-start import zh_CN from 'vee-validate/dist/locale/zh_CN' import Validator from ...

  5. 【黑金ZYNQ7000系列原创视频教程】03.体验FPGA里的ARM——裸机helloworld实验

    黑金论坛地址: http://www.heijin.org/forum.php?mod=viewthread&tid=36637&extra=page%3D1 爱奇艺地址: http: ...

  6. MySQL命令行基本命令操作

    进入命令模式后, 显示所有数据库 show databases; 选定某个数据库 use 数据库名; 创建数据库 create database 数据库名; 删除数据库 drop table 数据库名 ...

  7. Spring容器装配Bean的三种方式

    欢迎查看Java开发之上帝之眼系列教程,如果您正在为Java后端庞大的体系所困扰,如果您正在为各种繁出不穷的技术和各种框架所迷茫,那么本系列文章将带您窥探Java庞大的体系.本系列教程希望您能站在上帝 ...

  8. 常用linq语法

    1.简单的linq语法 var ss = from r in db.Am_recProScheme select r; var ss1 = db.Am_recProScheme; string sss ...

  9. Java类集框架——List接口

    学习目标 掌握List接口与Collection接口的关系. 掌握List接口的常用子类:ArrayList.Vector. 掌握ArrayList与Vector类的区别.    Collection ...

  10. ubuntu16.04下安装pcl点云库

    安装依赖项 sudo apt-get update sudo apt-get install git build-essential linux-libc-dev sudo apt-get insta ...