📄 update.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : update.c
Desc : 定义 系统升级相关的 底层操作和接口.
Author : huangsl
Date : 2007-11-14
Notes : 安装类型:
1.在没有任何系统的情况下 的安装 -- 此时安装程序没有任何系统接口和资源澹(包括字库).
此种情况下,无须用户干预.
2.系统正常运行下的升级 安装.
安装模式:
通过脚本和PC工具生产安装固件,然后有专门的安装程序来执行该固件.
相关工作:
1.两种情况下的文件结构安排.
2.安装接口 扩展性问题--跨版本安装.
3.安装固件如何生成--脚本生成还是模块生成.
4.如果安装过程中断电,如何保证安全性.
$Log: update.c,v $
Revision 1.7 2008/07/01 11:59:26 HSL
为保证升级稳定,升级过程中关闭 TIMER 和 UDC中断,升级时采用手工刷屏.
Revision 1.6 2008/06/19 04:43:27 Administrator
代码整理!
Revision 1.5 2008/05/28 12:54:30 HJ
注册表更新
Revision 1.4 2008/05/28 01:46:42 HSL
增加 PC仿真下 SETUP模拟的支持.
Revision 1.3 2008/05/26 03:33:13 HSL
修改SETUP工程的BUG.
Revision 1.2 2008/05/20 07:44:49 HSL
根据PC仿真根改部分文件,增加部分WCHAR接口,根据状态栏进行相应修改.
Revision 1.8 2008/01/07 12:52:19 Huangshilin
no message
Revision 1.1.1.1 2007/12/21 02:35:44 Lingzhaojun
12.21
Revision 1.6 2007/12/11 07:01:42 Lingzhaojun
提交固件升级方案一
Revision 1.5 2007/12/10 09:28:51 Lingzhaojun
no message
Revision 1.4 2007/12/07 10:41:42 Lingzhaojun
提交固件升级初步版本
Revision 1.3 2007/12/06 03:24:57 Lingzhaojun
提交固件升级一部分UI程序
Revision 1.2 2007/11/26 14:34:48 Huangxinyu
提交黄世林的修改
Revision 1.1 2007/11/23 08:04:12 Huangshilin
增加安装接口.
Revision 1.4 2007/11/05 09:53:49 Huangshilin
增加GUI接口,增加应用资源互斥控制.
* huangsl 2007-09-19 for rk27.
*
*********************************************************************/
#include "include.h"
#include "lib\process\rkbin.h"
#include "setup\setup.h"
char *filename[100];
#define FileCopySize 1024 /*文件缓冲buf大小*/
UINT8 CopyBuf[FileCopySize];
/*****************************************************************************/
INT8U *gUpdateHeadBuffer; //头部指针.
MY_FILE *gUpdateFile; //文件指针.
INT32U gSetupFwOffset; //071211, setup fw size;
INT16U gUpdateSecondTime = 0;
//版本信息数据.
PRK_SWVERSION gpSetupVersion; //系统 版本信息.
PSWVERSION_REGKEY gpSetupSwVersion; //平台版本 信息.
PHWVERSION_REGKEY gpSetupHwVersion; // 硬件 版本信息.
INT8U *gpSetupSwSerialString; //序列号版本信息.
char gpSetupSwSerial[28]; //序列号版本信息.
/*****************************************************************************/
//EXTERN
extern char *gpDvlpSerialString;
extern char gSetupDefaultFwFileName[];
extern PHWVERSION_REGKEY gpProcHwSerial;
//extern INT32U ISetupFsOper( INT32U offSet , MY_FILE* file );
extern INT32U ISetupGetFwOffset(MY_FILE* inputFile);
extern void SetupDelayMs(INT32U ms);
extern INT32U ISetupProcessItem(MY_FILE *file , PRK_SETUPITEM_STR pItem);
/*****************************************************************************/
//TRUE: 版本匹配, FALSE:版本 不匹配.
BOOLEAN IUpdateCheckVersion(PRK_SWVERSION pRkVer , PSWVERSION_REGKEY pDvlpVer ,
PHWVERSION_REGKEY pHwSerial , char* pSwSerial)
{
// 软件序列号不相等.
if (strcmp((char*)pSwSerial , gpDvlpSerialString))
return FALSE;
//检测 硬件序列号.
if (pHwSerial->Size != gpProcHwSerial->Size ||
memcmp(pHwSerial->RkHw , gpProcHwSerial->RkHw , 16))
return FALSE;
//软件序列号检测
//提供平台的时候,序列号对外开放.
if (pRkVer->Rk != gpSwVersion->Rk ||
pRkVer->RkChip != gpSwVersion->RkChip ||
// pRkVer->RkKnlMajor > gpSwVersion->RkKnlMajor ||
(pRkVer->RkKnlMajor & 1) //||
// pRkVer->RkKnlMinor > gpSwVersion->RkKnlMinor
)
{
return FALSE;
}
//开发商维护的 版本信息检测
if (
// gpDvlpVersion->VerMajor < pDvlpVer->VerMajor ||
// gpDvlpVersion->VerMinor < pDvlpVer->VerMinor ||
WCstrcmp(gpDvlpVersion->DvlpName , pDvlpVer->DvlpName) ||
WCstrcmp(gpDvlpVersion->ManufacturerName , pDvlpVer->ManufacturerName))
return FALSE;
return TRUE;
}
INT32U IUpdateGetVersion(PRK_SETUPITEM_STR pItem , MY_FILE *file)
{
INT32U rs = 0 ;
if (file == NULL)
return 1;
gpSetupVersion = (PRK_SWVERSION)MALLOC(pItem->SizeOfBytes);
if (gpSetupVersion == NULL)
return 2;
FSFileSeek(file , pItem->OffsetToData , SEEK_SET);
if (FSFileRead(gpSetupVersion , pItem->SizeOfBytes , file) != pItem->SizeOfBytes)
{
rs = 3;
goto UpdateGetVersionErrorExit;
}
if (gpSetupVersion->Size != sizeof(RK_SWVERSION))
{
rs = 4;
goto UpdateGetVersionErrorExit;
}
gpSetupSwVersion = (PSWVERSION_REGKEY)((char*)gpSetupVersion + gpSetupVersion->Size);
if (gpSetupSwVersion->Size != sizeof(SWVERSION_REGKEY))
{
rs = 5;
goto UpdateGetVersionErrorExit;
}
gpSetupHwVersion = (PHWVERSION_REGKEY)((char*)gpSetupSwVersion + gpSetupSwVersion->Size);
if (gpSetupHwVersion->Size != sizeof(HWVERSION_REGKEY))
{
rs = 6;
goto UpdateGetVersionErrorExit;
}
gpSetupSwSerialString = (INT8U*)((char*)gpSetupHwVersion + gpSetupHwVersion->Size);
if (PCRkvGetDvlpVersion((char*)gpSetupSwSerialString , (char*)gpSetupSwSerial, 28) == 0)
{
rs = 7;
goto UpdateGetVersionErrorExit;
}
//CHECK VERSION.
if (!IUpdateCheckVersion(gpSetupVersion, gpSetupSwVersion, gpSetupHwVersion, gpSetupSwSerial))
{
rs = 8;
goto UpdateGetVersionErrorExit;
}
return rs; //OK!
UpdateGetVersionErrorExit:
FREE(gpSetupVersion);
gpSetupVersion = NULL;
return rs;
}
/*****************************************************************************/
#if 1 // 操作 回调函数,可能和 窗口相关.
INT32U IUpdateVersionHandler(PRK_SETUPITEM_STR pItem , MY_FILE *file , WINDOW *win)
{
if (IUpdateGetVersion(pItem , file))
{
WINDOW *pDialog =
WindowCreateDilog(win , WS_FULLSCREEN | WES_DilogOK | WS_NOTIFYPARENTCLOSED,
WID_UpdateErrDialog , 0, 0, LCD_W, LCD_H,
SID_AVI, 0, NULL, NULL, NULL);
WindowInvalidateWindow(pDialog);
LCD_Update_WT();
return 100;
}
return 0;
}
#endif
/*****************************************************************************/
/*****************************************************************************/
#if 0
//外部函数.
#endif
/*********************************************************************************
Name : UpdateGetFirstAction
Desc : 取得升级 信息的第一个操作.
Param :
// fwFile : 文件路径。
Err: 用于返回错误代码.
Return : NULL:失败,其他 为 升级操作的数据.
Global : 无.
Note :
Author : HUANGSL
Log :
* 071222 huangsl 为了方便维护,固件名称 有内部提供,不需要 外部输入.
*********************************************************************************/
void *UpdateGetFirstAction(INT32U *Err) //char* fwFile ,
{
PIMAGE_RESBIN_DIRECTORY ph;
// INT32U size;
// PKNL_SECINFO pSec;
PRK_SETUPITEM_STR pSetupItem;
char *fwFile;
fwFile = gpSysConfig->UpdateFWFileName;
#ifdef BOARD
if (gpSysConfig->UpdateFWFileName[0] == 0)
#else
if (1)
#endif
{
fwFile = gSetupDefaultFwFileName;
}
else
{
char *onlyName;
char name83[12];
MY_FILE *setupNameFile;
setupNameFile = FSFileOpen("C:\\APPDATA\\SETUPNAM.DAT", "rb");
if (setupNameFile == NULL)
{
onlyName = strchr(gpSysConfig->UpdateFWFileName , '\\');
if (onlyName)
onlyName++;
else
onlyName = gpSysConfig->UpdateFWFileName;
FS_FAT_MakeRealname(name83, onlyName);
setupNameFile = FSFileOpen("C:\\APPDATA\\SETUPNAM.DAT", "wb");
if (setupNameFile == NULL)
{
*Err = 1;
return NULL;
}
FSFileWrite(name83 , 12 , setupNameFile);
FSFileClose(setupNameFile);
}
else
{
FSFileClose(setupNameFile);
}
}
gUpdateFile = FSFileOpen(fwFile , "rb");
if (gUpdateFile == NULL)
{
TR("Open file[%s] Failed!" , fwFile);
*Err = 2;
return NULL;
}
// 071211,huangsl,由于现在采用 安装 来进行升级,因此,头部为 安装固件信息.
//071222,huangsl,增加 CRC校验.利用 统一的接口函数来获取 OFFSET.
gSetupFwOffset = ISetupGetFwOffset(gUpdateFile);
if (gSetupFwOffset == (INT32U) - 1)
{
TR("GET FW OFFSET Failed!" , RKUD_HEAD_MAX);
goto UpdateGetFirstActError;
}
gUpdateHeadBuffer = (INT8U*)MALLOC(RKUD_HEAD_MAX);
if (gUpdateHeadBuffer == NULL)
{
TR("GET FW OFFSET Failed!" , RKUD_HEAD_MAX);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -