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: [email protected]
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}" ; ) > [email protected]
@( printf ‘#define CC_VERSION_STRING "%s"\n‘ ‘$(shell $(CC) --version | head -n 1)‘ )>> [email protected]
@( printf ‘#define LD_VERSION_STRING "%s"\n‘ ‘$(shell $(LD) -v | head -n 1)‘ )>> [email protected]
@cmp -s [email protected] [email protected] && rm -f [email protected] || mv -f [email protected] [email protected]

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

时间: 2024-10-05 15:14:42

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

powerpc uboot链接脚本大改造

在做完了linux由arm处理器核移植到ppc处理器核的工作后,还需要进行uboot的移植,之前对uboot的分析文章都是基于arm平台,感兴趣的朋友可以看看,链接如下: http://blog.csdn.net/column/details/uboot-note.html 借这次ppc移植工作,也学习了ppc uboot的相关知识,顺道写几篇文章记录下. 工作背景是公司处理器由arm处理器核cortex A8换为ppc处理器核ppc460s,现在处于FPGA仿真验证阶段,SOC的外设控制器都没

2.4、uboot配置和编译过程详解

2.4.1.uboot主Makefile分析1 2.4.1.1.uboot version分析 (1)uboot版本号分为3个级别: VERSION:主版本号 PATCHLEVEL:次版本号 SUBLEVEL:再次版本号 EXTRAVERSION:另外附加的版本信息 这四个用.隔开共同构成了最终的版本号. (2)Makefile中版本号最终生成了一个变量U_BOOT_VERSION,这个变量记录了Makefile中配置的版本号 (3)include/version_autogenerated.h

uboot初体验-----趣谈nand设备发起的浅显理解

1 选择Uboot版本号 2 移植uboot至console正常work 3 制造uImage和使用uboot指南 4 写NFC驱动器 5 uboot从nand启动引导系统 1 选择Uboot版本号 正所谓"工欲善其事,必先利其器".假设在整个过程中可以有一套友好的软硬件开发环境整个过程就比較顺利了. 戳中痛点-- 对于选择Uboot的版本号.一般人都会选择最新版本号.可是新版本号必定会有些结构上的差异.因此在选择好版本号之后,一定要细致分析一下如今的uboot  tree.然后选择合

分析u-boot的Makefile

这里分析三星s5pv210芯片官方u-boot 先看u-boot 版本号 VERSION = 1        #主版本号PATCHLEVEL = 3 #次版本号SUBLEVEL = 4  # 修改正版本号EXTRAVERSION =   # 拓展版本号 U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)VERSION_FILE = $(obj)include/version_autogenerated.h 1

uboot移植之前的工作

1.1计算机系统的主要部件:计算机系统是有cpu来做核心进行运行的系统.典型的计算机系统有:pc机,嵌入式设备(手机.平板电脑.游戏机),单片机(家用电器). 1.2计算机系统组件部件非常多,不同的计算机系统组成部件也不同.但是所有的计算机系统运行时需要的主要核心部件都是3个东西:cpu+外部存储器(Flash/硬盘) + 内部存储器(DDR SDRAM/SDRAM/SRAM). 1.3pc机的启动过程:(1)典型的pc部署:BIOS程序部署在pc机主板上(随主板出厂时已经预制了),操作系统部署

U-boot主Makefile详尽分析

U-boot主Makefile详尽分析 主Makefile位于uboot源码的根目录下,其内容主要结构为: 1. 确定版本号及主机信息(23至48行) 2. 实现静默编译功能(48至55行) 3. 设置各种路径(56至123行) 4. 设置编译工具链(124至186行,大部分在config.mk内) 5. 设置规则(187至470行) 6. 设置与cpu相关的伪目标(480至末尾) 需要注意的是,结构顺序不代表代码执行顺序,关于代码的执行顺序以及推荐阅读顺序请移步[ U-boot配置及编译阶段流

uboot移植准备工作二

第一部分 2.3.1uboot配置编译实践 1)源头的源代码时uboot官网下载的.这个下载的源代码可能没有你当前使用的开发板的移植,甚至找不到当前开发板使用的SoC对应的移植版本. 2)SoC厂商在退出一款SoC后,厂商的工程师会去uboot官网下载一个uboot,根据自己Soc进行第一步移植,移植的目标是厂商推出的开发板.(譬如三星的S5PV210芯片厂商出的开发板就叫SMDKV210),所以三星的工程师移植的uboot是根据他们自己的SMDKV210开发板移植的. 3)具体的开发板提供商(

u-boot配置和编译过程详解

备注:分析的是OK210开发板自带的uboot_smdkv210,可能有些部分和其他版本不太一样,但是原理都类似. 编译u-boot的步骤 make forlinx_linux_config make 首先生成配置文件,然后编译源码,依次看看这些命令都干了些什么事情 配置过程 #forlinx add forlinx_linux_config : unconfig @$(MKCONFIG) $(@:_config=) arm s5pc11x smdkc110 samsung s5pc110 li

mt7620 uboot

我本机装的是64位Ubuntu, SDK 里提供的 buildroot-gcc342 是32位的,无法直接运行,需要先安装 gcc-multilib. sudo apt-get install gcc-multilib 之前一直做 ARM 开发, 对这里 MIPS 首先要了解一点它的 MMU 内存映射关系 . 在 MIPS 中, 0x8000,0000 ~ 0x9fff,ffff 和 0xa000,0000 ~ 0xbfff,ffff 这两段逻辑地址都直接映射 0x0000,0000 ~ 0x1