📄 setup.c
字号:
return 3;
}
ph = (PIMAGE_RESBIN_DIRECTORY)gSetupHeadBuffer;
//判断头部 是否正确,还有其他判断可以省略.
if (ph->Size != sizeof(IMAGE_RESBIN_DIRECTORY) ||
ph->Magic != RKB_MAGIC_FLAG || ph->NumberOfNamedEntries == 0)
{
TR("Error file!" , "");
FSFileClose(f);
FREE(gSetupHeadBuffer);
return 4;
}
pSetupItem = (PRK_SETUPITEM_STR)((INT8U*)ph + ph->OffsetOfNamedEntries);
while (pSetupItem->Size > 0 && pSetupItem->Option != RKST_OPTION_NULL)
{
pSetupItem->OffsetToData += gSetupBaseOffset;
if ((size = ISetupProcessItem(f , pSetupItem)) != 0)
{
if (size == 0xffffffff)
{
if (f)
{
FSFileClose(f);
}
FREE(gSetupHeadBuffer);
return 0;
}
else
{
// 非 0 ,错误.
TR("Setup Opertion[%d] Failed!" , pSetupItem->Option);
//ISetupDispDrawString( SETUP_FILEX , SETUP_FILEY, "SETUP FAILED!!" , 16 );
SetupDelayMs(2000);
#ifdef SETUP
RkldSetFwRError(); //设置固件错误标志.
#endif
if (f)
{
FSFileClose(f);
}
FREE(gSetupHeadBuffer);
return 100;
}
}
pSetupItem++;
}
if (f)
{
FSFileClose(f);
}
FREE(gSetupHeadBuffer);
return 0;
}
/*********************************************************************************
Name : SetupMain
Desc : 安装 函数的入口函数.
主要执行 界面显示,解压和安装过程.
Param :
fileOffset : 安装数据 在 文件中的起始地址.
目前不再使用.
Return : 无.
Global : 无.
Note : 固件分为 两个部分:
1. 安装升级程序.
2. 升级 数据.
对于升级数据,又可以分为多个部分,具体参考 setup.h 列举的各个操作.
Author : HUANGSL
Log :
* 071102 huangsl for rk27 setup.
* 080321 huangsl 根据二级LOADER修改.二级LOADER增加 RKW后缀搜索功能,此处也需要增加
* 相应的功能,否则文件无法打开.
* 080409 huangsl 增加多个文件搜索功能.
*********************************************************************************/
INT32U SetupMain(INT32U fileOffset)
{
MY_FILE *f;
char shortName[20];
INT32U i = 10;
// char setupFwFile;
// CHECK FLAG TAG.
shortName[0] = 0;
f = FSFileOpen("C:\\APPDATA\\SETUPNAM.DAT" , "rb");
if (f != NULL)
{
strcpy(shortName, "D:\\");
i = FSFileRead(&shortName[3] , 11 , f);
FSFileClose(f);
shortName[3+i] = '\0';
i = SetupFile(shortName);
if (i)
{
//错误固件 ,删除,--比较好的办法是打个 标记,标明固件错误.
TR("INSTALL %s FAILED!" , shortName);
}
}
//可能是 命名固件 加载失败,也可能时 没有加载命名固件,此时 都需要 加载默认固件.
//080321,huangsl,根据LOADER更新,加载用户盘目录下找到的 第一个 RKW固件.
//不再独立加载 SETUP.RKW固件.
if (i)
{
FS_FDT fdt;
FS_FIND_DATA fdData;
int fdRet ;
TR("LOAD OTHER USR FW[.RKW]\n" , "");
fdRet = FS_FindFirst(&fdt , &fdData , "D:\\" , "RKW");
while (fdRet == FS_RETURN_OK)
{
strcpy(shortName, "D:\\");
strcat(shortName, (char*)fdt.Name);
i = SetupFile(shortName);
if (i && i < 100) // 080409,huangsl,<100,正常错误--固件不对.
{
//错误固件 ,显示错误信息提示.
//由于 LOADER 里面判断 0X10 标志,不会再次引导该固件,因此该固件不用删除.
TR("INSTALL %s FAILED!" , shortName);
fdRet = FS_FindNext(&fdt , &fdData , "RKW"); // find next.
}
else
{
break;
}
}
}
//无论成功与否,都正常启动。如果此时系统固件已经被 破坏,
// 则 直接起来 USB,替换新的固件.--0X10标志 告诉 LOADER,
// 不要再次引导 升级固件.
RKLDWriteBdRegister(0X10 | RKLD_LOAD_SYSFW);
return i;
}
/*****************************************************************************/
/*****************************************************************************/
/*
Note :
1.080504,huangsl,用于 PC段 对 RKW解压 和重打包,获取指定段信息等接口.
适合 PC段对 RKW UI 的直接修改以及 PHILIP 的 DM 计划.
2.考虑到外部调用方便,直接返回指针.但是外部需要注意不能改写 PRK_SETUPITEM_STR
的数据,因为最后要回写头部,修改这些指针的数据会破坏头部数据.
*/
/*****************************************************************************/
typedef struct _RKW_HANDLE_INFO
{
MY_FILE *RkwFile;
PIMAGE_RESBIN_DIRECTORY pRkwResBinDir; //作为 一个整体.
PRK_SETUPITEM_STR pRkwFirstSetupItem;
INT32U RkwSetupBaseOffset;
INT32U RkwHead[RKUD_HEAD_MAX/4];
} RKW_HANDLE_INFO, *PRKW_HANDLE_INFO;
/*****************************************************************************/
//内部接口
/*****************************************************************************/
// 把文件内容往后面移动 , rkwOffset 为移动的位置的 差值
INT32U IRkwMoveBackFile(PRKW_HANDLE_INFO rkwInHandle , INT32U rkwOffset ,
PRK_SETUPITEM_STR pItem)
{
INT8U *pTempBuff;
if (pItem->SizeOfBytes > 0)
{
pTempBuff = (INT8U*)MALLOC(pItem->SizeOfBytes);
if (pTempBuff == NULL)
return 1;
FSFileSeek(rkwInHandle->RkwFile, pItem->OffsetToData + rkwInHandle->RkwSetupBaseOffset, 0);
if (FSFileRead(pTempBuff , pItem->SizeOfBytes , rkwInHandle->RkwFile)
!= pItem->SizeOfBytes)
{
FREE(pTempBuff);
return 2;
}
FSFileSeek(rkwInHandle->RkwFile, pItem->OffsetToData + rkwInHandle->RkwSetupBaseOffset + rkwOffset, 0);
if (FSFileWrite(pTempBuff , pItem->SizeOfBytes , rkwInHandle->RkwFile)
!= pItem->SizeOfBytes)
{
FREE(pTempBuff);
return 3;
}
FREE(pTempBuff);
}
pItem->OffsetToData += rkwOffset;
return RKW_OK;
}
//拷贝文件到 当前 RKW 文件, OFFSET 和大小 有 pItem 决定.
INT32U IRkwCopyFile(PRKW_HANDLE_INFO rkwInHandle , MY_FILE* inputFile ,
PRK_SETUPITEM_STR pItem)
{
char tmp[2048];
int readNum ;
INT32U writeWord = 0;
FSFileSeek(rkwInHandle->RkwFile, pItem->OffsetToData + rkwInHandle->RkwSetupBaseOffset, 0);
readNum = FSFileRead(tmp , 2048 , inputFile) ;
while (readNum == 2048)
{
writeWord += FSFileWrite(tmp , readNum , rkwInHandle->RkwFile);
readNum = FSFileRead(tmp , 2048 , inputFile) ;
}
writeWord += FSFileWrite(tmp , readNum , rkwInHandle->RkwFile);
return writeWord;
}
//拷贝文件到 当前 RKW 文件, OFFSET 和 SIZE 外部输入.
INT32U IRkwCopyFileOut(PRKW_HANDLE_INFO rkwInHandle , OUT char* dstFile ,
INT32U fileOffSet , INT32U fileSize)
{
char tmp[2048];
int readNum ;
INT32U writeWord = 0;
MY_FILE *outFile;
outFile = FSFileOpen(dstFile, "wb");
if (outFile == NULL)
return 0;
FSFileSeek(rkwInHandle->RkwFile, fileOffSet , 0);
readNum = 2048;
while (fileSize > 0)
{
if (fileSize < 2048)
readNum = fileSize;
FSFileRead(tmp , readNum , rkwInHandle->RkwFile) ;
writeWord += FSFileWrite(tmp , readNum , outFile);
fileSize -= readNum;
}
FSFileClose(outFile);
return writeWord;
}
INT32U IRkwGetVersion(PRKW_HANDLE_INFO rkwInHandle, PRK_SETUPITEM_STR pItem ,
INT32U * rkwRkVersion , INT32U * rkwDvlpVersion)
{
INT32U rs = 0 ;
PRK_SWVERSION pSetupVersion;
PSWVERSION_REGKEY pSetupSwVersion; //平台版本 信息.
pSetupVersion = (PRK_SWVERSION)MALLOC(pItem->SizeOfBytes);
if (pSetupVersion == NULL)
return 2;
FSFileSeek(rkwInHandle->RkwFile , pItem->OffsetToData + rkwInHandle->RkwSetupBaseOffset, SEEK_SET);
if (FSFileRead(pSetupVersion , pItem->SizeOfBytes , rkwInHandle->RkwFile) != pItem->SizeOfBytes)
{
rs = 3;
goto UpdateGetVersionErrorExit;
}
if (pSetupVersion->Size != sizeof(RK_SWVERSION))
{
rs = 4;
goto UpdateGetVersionErrorExit;
}
pSetupSwVersion = (PSWVERSION_REGKEY)((char*)pSetupVersion + pSetupVersion->Size);
if (pSetupSwVersion->Size != sizeof(SWVERSION_REGKEY))
{
rs = 5;
goto UpdateGetVersionErrorExit;
}
*rkwRkVersion = (pSetupVersion->RkKnlMajor << 16) | pSetupVersion->RkKnlMinor;
*rkwDvlpVersion = (pSetupSwVersion->VerMajor << 16) | pSetupSwVersion->VerMinor;
UpdateGetVersionErrorExit:
FREE(pSetupVersion);
return rs;
}
/*****************************************************************************/
//外部接口
/*****************************************************************************/
RKW_HANDLE RkwInitialise(char* fwPathName)
{
PRKW_HANDLE_INFO rkwInHandle = NULL;
INT32U setupBaseOffset;
MY_FILE *file;
file = FSFileOpen(fwPathName , "r+b");
if (file == NULL)
return rkwInHandle;
setupBaseOffset = ISetupGetFwOffset(file);
if (setupBaseOffset == (INT32U) - 1)
{
TR("file[%s] Format Error!" , file);
return rkwInHandle;
}
FSFileSeek(file, setupBaseOffset , 0);
rkwInHandle = (PRKW_HANDLE_INFO)MALLOC(sizeof(RKW_HANDLE_INFO));
if (rkwInHandle == NULL)
{
TR("malloc[%d] Failed!" , sizeof(RKW_HANDLE_INFO));
FSFileClose(file);
return rkwInHandle;
}
if (FSFileRead(rkwInHandle->RkwHead, RKUD_HEAD_MAX , file) != RKUD_HEAD_MAX)
{
FSFileClose(file);
FREE(rkwInHandle);
return NULL;
}
rkwInHandle->pRkwResBinDir = (PIMAGE_RESBIN_DIRECTORY)rkwInHandle->RkwHead;
//判断头部 是否正确,还有其他判断可以省略.
if (rkwInHandle->pRkwResBinDir->Size != sizeof(IMAGE_RESBIN_DIRECTORY) ||
rkwInHandle->pRkwResBinDir->Magic != RKB_MAGIC_FLAG ||
rkwInHandle->pRkwResBinDir->NumberOfNamedEntries == 0)
{
FSFileClose(file);
FREE(rkwInHandle);
return NULL;
}
rkwInHandle->pRkwFirstSetupItem = (PRK_SETUPITEM_STR)
((INT8U*)rkwInHandle->RkwHead + rkwInHandle->pRkwResBinDir->OffsetOfNamedEntries);
rkwInHandle->RkwFile = file;
rkwInHandle->RkwSetupBaseOffset = setupBaseOffset;
return rkwInHandle;
}
void RkwDeInitialise(RKW_HANDLE rkwHandle)
{
PRKW_HANDLE_INFO rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
if (rkwInHandle)
{
//回写头部信息,因为可能有改变.
FSFileSeek(rkwInHandle->RkwFile, rkwInHandle->RkwSetupBaseOffset , 0);
if (FSFileWrite(rkwInHandle->RkwHead , RKUD_HEAD_MAX , rkwInHandle->RkwFile)
!= RKUD_HEAD_MAX)
{
TR("Write RKW Head Failed\n", "");
}
FSFileClose(rkwInHandle->RkwFile);
FREE(rkwInHandle);
}
}
INT32U RkwGetFirstActionInfo(RKW_HANDLE rkwHandle ,
OUT PRK_SETUPITEM_STR *pRkwItemInfo)
{
PRKW_HANDLE_INFO rkwInHandle = (PRKW_HANDLE_INFO)rkwHandle;
PRK_SETUPITEM_STR pItem;
pItem = rkwInHandle->pRkwFirstSetupItem;
if (pItem->Size > 0)
{
*pRkwItemInfo = pItem;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -