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

📄 setup.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
📖 第 1 页 / 共 4 页
字号:
                FREE(gSetupUnpackHead);
                return 10;
            }
        }
        else if (pPackDir->Action == IRES_PACKACT_CRREATFILE)
        {
            creatFile = FSFileOpen(outFilePath , "wb");
            if (creatFile == NULL)
            {
                TR("Open File:%s Failed!\n", outFilePath);
                ISetupErrorString("FS OPER CREATE FILE ERROR!");
                FREE(gSetupUnpackHead);
                return 5;
            }



            FSFileSeek(file , pPackDir->OffsetToData  , SEEK_SET);
            if (ISetupFsOperCopyFile(file , creatFile , pPackDir->SizeOfBytes , showName))
            {
                TR("Copy File:%x Failed!\n", pPackDir->SizeOfBytes);
                FSFileClose(creatFile);
                FREE(gSetupUnpackHead);
                return 6;
            }
            FSFileClose(creatFile);
        }
        else    // NOT SUPPORT YE!!
        {
            //      break;
        }
        WindowSendMessage(FirmWareWin, WM_COMMAND, 0, NULL);
        WindowInvalidateWindow(NULL);
        LCD_Update( );
        pPackDir = (PIMAGE_PACKDENTRY)((char*)pPackDir + pPackDir->Size);
    }
    FREE(showName);
    FREE(gSetupUnpackHead);
    return 0;
}


// 删除文家 .
INT32U  ISetupFsDel(INT32U size , INT32U offSet , MY_FILE* file)
{
    char             *filePath;
    filePath = (char*)MALLOC(size);
    if (filePath == NULL)
    {
        TR("MALLOC FAILED[%x]!" , size);
        return 1;
    }
    FSFileSeek(file , offSet , SEEK_SET);
    if (FSFileRead(filePath , size , file) != size)
    {
        TR("FSFileRead FAILED[%x]!" , size);
        FREE(filePath);
        return 2;
    }

    FSFileDelete(filePath);
    FREE(filePath);
    return 0;
}

// 升级 二级 LOADER .
extern BOOLEAN BCMakeIDBlockData(UCHAR *pIDBlockData, UCHAR* pUsbData , UINT UsbDataLen,
                                     UCHAR* pBootCode, UINT BootCodeLen);
#define STP_IDBKL_BYTES             66*1024  // 64K CODE + 2K HEAD INFO.

/*
Log :
1.  080324,huangsl,增加 低格判断 和 提示接口.
2.  增加版本判断,如果版本一致,则 不需要进行LOADER升级.
*/

extern INT16U   FtlLowFormat;
INT32U  ISetupLoaderUpdate(PRK_SETUPITEM_STR pItem, MY_FILE* file)
{
    INT8U             *ldBUf;
    INT8U             *ldBootLoader;
    INT8U             *idBlockBuffer;
    INT8U             idBlockSpare[64];

    //080325,huangsl,首先判断版本是否一样,如果一样,则不用进行 LOADER 升级.
    if (RkLdGetVersion() == pItem->Param[3])
        goto ISetupLoaderUpdateEnd;

    //ISetupDispDrawString( SETUP_FILEX , SETUP_FILEY, "BootLoader..." , 16 );
    ldBUf = (INT8U*)MALLOC(pItem->SizeOfBytes);
    if (ldBUf == NULL)
    {
        TR("MALLOC FAILED[%x]!" , pItem->SizeOfBytes);
        return 1;
    }

    idBlockBuffer = (INT8U*)MALLOC(STP_IDBKL_BYTES);
    if (idBlockBuffer == NULL)
    {
        TR("MALLOC FAILED[%x]!" , STP_IDBKL_BYTES);
        FREE(ldBUf);
        return 2;
    }
    memset(ldBUf , 0 , pItem->SizeOfBytes);
    memset(idBlockBuffer , 0 , STP_IDBKL_BYTES);
    FSFileSeek(file , pItem->OffsetToData , SEEK_SET);
    if (FSFileRead(ldBUf , pItem->SizeOfBytes , file) != pItem->SizeOfBytes)
    {
        TR("FSFileRead FAILED[%x]!" , pItem->SizeOfBytes);
        FREE(idBlockBuffer);
        FREE(ldBUf);
        return 3;
    }

    //080504,huangsl,为了适应以后修改 头部信息二不影响里面的参数,param[1] 不再使用,
    //直接通过 param[0]来获得.
    //ldBootLoader = ldBUf+(pItem->Param[1]+gSetupBaseOffset)-pItem->OffsetToData;
    ldBootLoader = ldBUf + ALIGENSIZE4(pItem->Param[0]);

    if (!BCMakeIDBlockData(idBlockBuffer, ldBUf, pItem->Param[0],
                           ldBootLoader , pItem->Param[2]))
    {
        TR("BCMakeIDBlockData FAILED[%x]!" , pItem->SizeOfBytes);
        ISetupErrorString("BootLoader...FAILED!!");
        FREE(idBlockBuffer);
        FREE(ldBUf);
        return 4;
    }

//    ISetupDispDrawString( SETUP_FILEX , SETUP_FILEY, "LOADER UPDATE OK!" , 16 );
    FREE(idBlockBuffer);
    FREE(ldBUf);
//    SetupDelayMs( 1000 );

ISetupLoaderUpdateEnd:
#ifdef SETUP
    //080324,判断是否需要低格.
    if (FtlLowFormat == 1)
    {
        //ISetupDispDrawString( SETUP_FILEX , SETUP_FILEY, "Flash Error, Formating..." , 16 );
        LowFormat(1);
        SetupDelayMs(2000);
        //ISetupDispDrawString( SETUP_FILEX , SETUP_FILEY, "Restarting,Please Setup Again!!" , 16 );
        SetupDelayMs(5000);
        return 0xffffffff;  //返回错误标记,退出安装程序,重启.
    }
#endif
    return 0;
}

// 返回拷贝的直接数. -1 表示错误.
INT32U ISetupFCopyCopyFile(char *srcFile , char *dstFile)
{
    MY_FILE     *sfile;
    MY_FILE     *dfile;
    INT32U      readNum;
    INT32U      copyByte;
    INT32U      fileSize;
    sfile = FSFileOpen(srcFile , "rb");
    if (sfile == NULL)
        return (INT32U) - 1;
    dfile = FSFileOpen(dstFile , "wb");
    if (dfile == NULL)
    {
        FSFileClose(sfile);
        return (INT32U) - 1;
    }

    fileSize = copyByte = FSFileGetSize(sfile);

    if (fileSize > 0)
    {
        readNum = SETUP_FILEBUFFER;
        while (readNum == SETUP_FILEBUFFER)
        {
            if (copyByte < readNum)
                readNum = copyByte;
            if (FSFileRead(gSetupFileBuffer , readNum  , sfile) != readNum)
            {
                TR("READ FAILED,COPY BYTES[%x]" , copyByte);
                ISetupErrorString("FS COPY READ FAILED!");
                FSFileClose(sfile);
                FSFileClose(dfile);
                return (INT32U) - 1;
            }
            if (FSFileWrite(gSetupFileBuffer , readNum ,  dfile)  != readNum)
            {
                TR("WRITE FAILED,COPY BYTES[%x]" , copyByte);
                ISetupErrorString("FS COPY WRITE FAILED!");
                FSFileClose(sfile);
                FSFileClose(dfile);
                return (INT32U) - 1;
            }
            copyByte -= readNum;
        }
    }

    //NOW , copyByte WILL BE 0.

    FSFileClose(sfile);
    FSFileClose(dfile);
    return fileSize - copyByte;
}

INT32U  ISetupFileCopy(PRK_SETUPITEM_STR pItem, MY_FILE* file)
{
    INT8U       *ldBUf;
    char        *srcName;
    char        *dstName;
    MY_FILE     *srcFile;

    ldBUf = (INT8U*)MALLOC(pItem->SizeOfBytes);
    if (ldBUf == NULL)
    {
        TR("MALLOC FAILED[%x]!" , pItem->SizeOfBytes);
        return 1;
    }

    memset(ldBUf , 0 , pItem->SizeOfBytes);
    FSFileSeek(file , pItem->OffsetToData , SEEK_SET);
    if (FSFileRead(ldBUf , pItem->SizeOfBytes , file) != pItem->SizeOfBytes)
    {
        TR("FSFileRead FAILED[%x]!" , pItem->SizeOfBytes);
        FREE(ldBUf);
        return 2;
    }

    srcName = (char*)ldBUf;
    dstName = srcName + pItem->Param[0];

    // 1:for 0,1 for Len-->index.
    if (dstName[pItem->Param[1] - 2] == '\\' ||
            srcName[pItem->Param[0] - 2] == '\\')
    {
        TR("FIle Name Error[%s,%s]!" , srcName , dstName);
        FREE(ldBUf);
        return 3;
    }

    // COPY FILE!!
    // 080116,为了方便判断是否 出错,首先判断源文件是否存在.
    // 因为第一次升级,可能 该文件不存在. 假设目标文件 不会存在.
    srcFile = FSFileOpen(srcName , "rb");
    if (srcFile != NULL)
    {
        FSFileClose(srcFile);
        if ((INT32U) - 1 == ISetupFCopyCopyFile(srcName , dstName))
        {
            ISetupErrorString("FS COPY FAILED!");
            FREE(ldBUf);
            return 4;
        }
    }
    FREE(ldBUf);
    return 0;
}
/*****************************************************************************/

/*********************************************************************************
Name        :   ISetupProcessItme
Desc        :   执行具体的 安装操作.

Param       :   file : 安装数据文件 .
                pItem : 安装 操作.

Return      :   无.
Global      :   无.
Note        :

Author      :     HUANGSL
Log         :
* 071102    huangsl     for rk27 setup.
*********************************************************************************/

INT32U ISetupProcessItem(MY_FILE *file , PRK_SETUPITEM_STR pItem)
{
    switch (pItem->Option)
    {
        case RKST_OPTION_MKDIR:
            break;
        case RKST_OPTION_FCOPY:
            return ISetupFileCopy(pItem , file);
            break;
        case RKST_OPTION_FSOPER:
            return ISetupFsOper(pItem->OffsetToData, file , gSetupDestPath);
        case RKST_OPTION_FORMAT: //格式化.
            //格式化 系统盘.
            // 080325,huangsl,必须保证在文件系统极端错误的情况下,格式化 系统盘没有问题.!!!!
#ifdef BOARD
            FS_format(&FS_FlashSysDevice , FS_FAT16);
#endif
            FS_Init();
            break;
#ifdef SETUP
        case RKST_OPTION_DISPBMP:
            return ISetupDispBmp(pItem->Param[0], pItem->Param[1], pItem->OffsetToData,
                                 pItem->SizeOfBytes , file);
            break;
        case RKST_OPTION_DISPSTR:
            return ISetupDispString(pItem->Param[0], pItem->Param[1], pItem->OffsetToData,
                                    pItem->SizeOfBytes , file);
            break;
        case RKST_OPTION_SETFONT:
            return ISetupDispFontFile(pItem->Param[0] + gSetupBaseOffset, pItem->Param[1] + gSetupBaseOffset,
                                      pItem->Param[2] + gSetupBaseOffset, pItem->Param[3] - pItem->Param[0], file);
            break;
#endif
        case RKST_OPTION_DELAY:
            SetupDelayMs(pItem->Param[0]);
            break;
        case RKST_OPTION_VERSION:   // 版本信息,安装情况下 直接 返回.
            //升级情况下,在 升级入口时进行判断.
            break;
        case RKST_OPTION_FSDEL:
            if (pItem->SizeOfBytes > 0)  // SizeOfBytes > 0 ,为其他文件.
            {
                ISetupFsDel(pItem->SizeOfBytes , pItem->OffsetToData, file);
            }
            //只能删除其他文件,不能删除 固件文件.
            break;
        case RKST_OPTION_RESTART:
#ifdef SETUP
            return 0xffffffff; // normal quit .
#else
            break;
#endif
        case RKST_OPTION_LOADER:    //更新 二级 LOADER,在生成的时候 判断 CRC,此处不用判断.
            return ISetupLoaderUpdate(pItem, file);
        default:
            {
                TR("UNKnow Operation[%d]" , pItem->Option);
                // 080528,huangsl,为了和 以后的命令兼容,对于不支持的命令,
                //直接忽略,返回正确值.
                return 0; //0xfffffffe;
            }
    }
    return 0; // normal continue.
}

/*
Log :
    1. 080409,huangsl,为了支持多个文件搜索,需要根据返回值判断.
        规定 返回值 非0且 < 100,则继续搜索.


*/
INT32U SetupFile(char *file)
{
    MY_FILE                 *f;
    PIMAGE_RESBIN_DIRECTORY ph;
    INT32U                  size;
    PRK_SETUPITEM_STR       pSetupItem;

    f = FSFileOpen(file , "rb");
    if (f == NULL)
    {
        TR("Open file[%s] Failed!" , file);
        return 1;
    }
    gSetupBaseOffset  = ISetupGetFwOffset(f);
    if (gSetupBaseOffset == (INT32U) - 1)
    {
        TR("file[%s] Format Error!" , file);
        return 2;
    }

    FSFileSeek(f, gSetupBaseOffset , 0);
    gSetupHeadBuffer = (INT32U*)MALLOC(RKUD_HEAD_MAX);

    if (FSFileRead(gSetupHeadBuffer , RKUD_HEAD_MAX  , f) != RKUD_HEAD_MAX)
    {
        TR("Read file[%d] Failed!" , RKUD_HEAD_MAX);
        FSFileClose(f);
        FREE(gSetupHeadBuffer);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -