⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 update.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************/
/*   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 + -