📄 setup.c
字号:
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 + -