WINCE系统eboot在从SD卡读取stepldr.nb0时检测版本信息
先来看《VS2005控制台程序修改nb0文件》
http://blog.csdn.net/loongembedded/article/details/29797783
接下来我们要实现的是如何在eboot从SD卡读取stepldr.nb0的时候检查stepldr的版本信息,根据版本信息来决定是否继续升级。
在实现过程中有两种方式,这两种方式的思路都是一样的,只是实现过程中一些具体细节的差别而已,先描述公共的实现部分:
1. 结构体IMG_CHECK_VERSION
<span style="font-size:14px;">typedef struct_IMG_CHECK_VERSION_ { char ImageVersion[VERSION_LEN]; }IMG_CHECK_VERSION,*PIMG_CHECK_VERSION;</span>
ImageVersion记录了版本信息,这个信息是由环境变量传递进来的。
2. CheckImageVersion函数
此函数主要负责比较要升级的stepldr.nb0中的版本信息和当前在运行的stepldr.nb0版本信息对比。
<span style="font-size:14px;">BOOLCheckImageVersion(char *pCheckStr, char *pBuf) { IMG_CHECK_VERSION ImgChk; memcpy((PBYTE)&ImgChk,pBuf,sizeof(IMG_CHECK_VERSION)); if(strlen(pCheckStr) !=strlen(ImgChk.ImageVersion)) { return FALSE; } if(strcmp(ImgChk.ImageVersion,pCheckStr)< 0) { return FALSE; } return TRUE; } </span>
调用的代码如下:
CheckImageVersion(BSP_NBOOT_VERSION,((PBYTE)g_pDownPt- sizeof(IMG_CHECK_VERSION)))
这里第1个参数BSP_NBOOT_VERSION在sources.cmn和.bat文件有相关的定义
(1) 在sources.cmn文件定义如下:
!IF "$(BSP_C5000_SLC)" =="1"
CDEFINES=$(CDEFINES)-DBSP_NBOOT_VERSION=\"$(BSP_NBOOT_VERSION)\"
!ENDIF
(2) bat文件定义如下:
if /i"%BSP_C5000_SLC%"=="1" set BSP_NBOOT_VERSION=3.50
BSP_NBOOT_VERSION的定义还有另外一种办法,直接在sources.cmn文件中定义,如下:
!IF"$(BSP_C5000_SLC)" == "1"
CDEFINES=$(CDEFINES)-DBSP_NBOOT_VERSION=350
!ENDIF
调用的代码改为
<span style="font-size:14px;">char NbootVersion[VERSION_LEN] ; FormatString( NbootVersion, "%d.%d",BSP_NBOOT_VERSION/100, BSP_NBOOT_VERSION%100); CheckImageVersion(NbootVersion,((PBYTE)g_pDownPt - sizeof(IMG_CHECK_VERSION))); </span>
这里要注意如果BSP_NBOOT_VERSION=3.50,
FormatString( NbootVersion, "%d",BSP_NBOOT_VERSION); NbootVersion输出的0而不是3.50,不知道为什么,所以只能改为BSP_NBOOT_VERSION=350,但这种处理方式和我们定义的版本信息不是很一致,所以还是采用第1种。
3. makefile.inc文件
为了在编译的时候自动根据环境变量BSP_NBOOT_VERSION的值来自动在stepldr.nb0最后添加版本信息,我们需要在stepldr\makefile.inc文件中增加下面的内容
copy $(_PLATFORMROOT)\$(_TGTPLAT)\target\$(_TGTCPU)\$(WINCEDEBUG)\Stepldr.*$(_FLATRELEASEDIR)
call $(_TARGETPLATROOT)\Files\AddVersion.exe $(_FLATRELEASEDIR)\"Stepldr.nb0" $(BSP_NBOOT_VERSION)