uboot 版本号生成过程
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"\n' \
"$(U_BOOT_VERSION)" "$${localvers}" ; \
printf '#define U_BOOT_VERSION "U-Boot %s%s"\n' \
"$(U_BOOT_VERSION)" "$${localvers}" ; \
) > $@.tmp
@( printf '#define CC_VERSION_STRING "%s"\n' \
'$(shell $(CC) --version | head -n 1)' )>> $@.tmp
@( printf '#define LD_VERSION_STRING "%s"\n' \
'$(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机制的不熟悉,只能用这个方法来作为权宜之计了。
uboot 版本号生成过程的更多相关文章
- uboot dm9000驱动故障
手头有一块6410开发板,已经有别人提供的uboot代码(基于2011.06),但是在检测dm9000时显示下面的输出: Net: No ethernet found. 当然其他网络命令例如ping等 ...
- 嵌入式Linux驱动学习之路(五)u-boot启动流程分析
这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加 ...
- 嵌入式Linux驱动学习之路(四)u-boot编译分析
u-boot编译分析 在配置完成后,执行make开始编译.这里打开Makefile. 首先在目标all前有一句话首先检查是否有include/config.mk文件来判断是否成功配置过. ifeq ( ...
- tiny210——uboot移植Makefile文章分析
这东西已经写,我们没有时间发布,如今,终于有时间稍微长送记录汇总uboot学习过程.具体了.以后忘了也能够再温习回来嘛有些特殊字符显示得乱掉了 Makefile追踪技巧: 技巧1:能够先从编译目标開始 ...
- U-Boot Makefile分析(5)主控Makefile分析
这次分析源码根目录下的Makefile,它负责读入配置过的信息,通过OBJS.LIBS等变量设置能够参与镜像链接的目标文件,设定编译的目标等等. HOSTARCH := $(shell uname - ...
- 【Bootloader】探究bootloader,分析u-boot源码
Preface 之前也发表过关于<Bootloader启动过程分析>的文章,但是内容表达得比较抽象,大多是文字叙述,所以这里从系统和代码的角度来深入分析bootloader的启动过程. 工 ...
- imx6 uboot启动流程分析
参考http://blog.csdn.net/skyflying2012/article/details/25804209 这里以imx6平台为例,分析uboot启动流程对于任何程序,入口函数是在链接 ...
- uboot 2013.01 代码简析(3)第二阶段初始化
u-boot第二阶段初始化内容的入口函数是_main,_main位于arch/arm/lib/crt0.S文件中: _main函数中先为调用board_init_f准备初始化环境(设置栈指针sp和并给 ...
- mt7620 uboot
我本机装的是64位Ubuntu, SDK 里提供的 buildroot-gcc342 是32位的,无法直接运行,需要先安装 gcc-multilib. sudo apt-get install gcc ...
随机推荐
- Objective-c官方文档翻译 类的定义
类是对象的蓝图. 一个类是描述了对象的行为和属性.例如NSString的一个实例.他的类提供了各种的方法来转化和表示他的内部字符的表示. 每个类的实例都包含了这个类的属性和行为.例如每个NSSt ...
- Docker 使用指南 (五)—— Dockerfile 详解
版权声明:本文由田飞雨原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/97 来源:腾云阁 https://www.qclou ...
- 【BZOJ2554】Color 概率神题
[BZOJ2554]Color Description 有n个球排成一列,每个球都有一个颜色,用A-Z的大写字母来表示,我们每次随机选出两个球ball1,ball2,使得后者染上前者的颜色,求期望操作 ...
- 【BZOJ1901】Zju2112 Dynamic Rankings 主席树+树状数组
[BZOJ1901]Zju2112 Dynamic Rankings Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j ...
- {Azure} 常用链接
https://azure.microsoft.com/zh-cn/documentation/scenarios/web-app/
- ios Quartz 各种绘制图形用法
摘要: CoreGraphics的功能非常强大,可以绘制各种图形:今天学习一下怎么绘制简单的点线面,记录学习. 一.导入coreGraphics.framework 二.绘制图形 1.绘制矩形 // ...
- 将web项目打成war包部署在tomcat步骤
将web项目打成war包部署在tomcat步骤 1.将自己的项目打成war包. 2.将打包好的war复制到${tomcat.home}/webapps项目下. 3.在${tomcat.hom}/con ...
- 利用burpsuite实现重放攻击
1.什么是重放攻击? 顾名思义,重复的会话请求就是重放攻击.可能是因为用户重复发起请求,也可能是因为请求被攻击者获取,然后重新发给服务器. 附上详细的解释:http://blog.csdn.net/k ...
- web框架们~Django~Flask~Tornado
1.web框架本质 2.Django 3.Flask 4.Tornado
- Day19 客户关系系统实战
day19 今日内容 Service事务 客户关系管理系统 Service事务 在Service中使用ThreadLocal来完成事务,为将来学习Spring事务打基础! 1 DAO中的事务 ...