📄 setup.c
字号:
/******************************************************************/
/* Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved. */
/*******************************************************************
File : setup.h
Desc : 定义 应用和 内核安装 相关的数据结构.
Author : huangsl
Date : 2007-09-19
Notes : 安装类型:
1.在没有任何系统的情况下 的安装 -- 此时安装程序没有任何系统接口和资源澹(包括字库).
此种情况下,无须用户干预.
2.系统正常运行下的升级 安装.
安装模式:
通过脚本和PC工具生产安装固件,然后有专门的安装程序来执行该固件.
相关工作:
1.两种情况下的文件结构安排.
2.安装接口 扩展性问题--跨版本安装.
3.安装固件如何生成--脚本生成还是模块生成.
4.如果安装过程中断电,如何保证安全性.
$Log: setup.c,v $
Revision 1.8 2008/07/01 11:59:26 HSL
为保证升级稳定,升级过程中关闭 TIMER 和 UDC中断,升级时采用手工刷屏.
Revision 1.7 2008/06/30 04:34:53 HSL
增加 升级过程中立即刷新函数.
Revision 1.6 2008/06/21 09:33:59 HSL
增加文件系统PC仿真支持.
Revision 1.5 2008/06/19 04:43:26 Administrator
代码整理!
Revision 1.4 2008/06/13 07:08:55 Administrator
HJ 更新三级 LOAD 工程!
Revision 1.3 2008/05/28 02:45:23 HSL
增加扩展支持.
Revision 1.2 2008/05/26 03:33:13 HSL
修改SETUP工程的BUG.
Revision 1.1.1.1 2008/05/07 04:15:08 Administrator
no message
Revision 1.1.1.1 2008/03/06 13:29:10 Lingzhaojun
no message
Revision 1.4 2008/01/11 02:34:30 Huangshilin
增加更新 二级 LOADER的功能.打开 特效功能.
Revision 1.3 2008/01/08 05:04:55 Huangshilin
增加升级 更新 LOADER 的功能.
Revision 1.2 2008/01/07 12:52:19 Huangshilin
no message
Revision 1.1.1.1 2007/12/21 02:35:43 Lingzhaojun
12.21
Revision 1.1 2007/11/23 08:04:12 Huangshilin
增加安装接口.
Revision 1.4 2007/11/05 09:53:49 Huangshilin
增加GUI接口,增加应用资源互斥控制.
Revision 1.3 2007/10/20 04:46:30 Huangshilin
for RK2700
Revision 1.2 2007/10/08 02:57:03 Lingzhaojun
添加版本自动注释脚本
* huangsl 2007-09-19 for rk27.
*
*********************************************************************/
#include "include.h"
#include "lib\process\rkbin.h"
#include "setup.h"
#include "lib\loader\loader.h"
#ifdef BOARD
#include "hw_api.h"
#endif
/*****************************************************************************/
#define SETUP_FILEBUFFER 4096 //读取文件的 BUFFER.
/*****************************************************************************/
#define RKLOAD_MAGIC 0X4C44524B
#define RKLOAD_CRC 0X12345678
#define RKLOAD_OPT_SETUP (0X00000001U<<31)
#define RKLOAD_OPT_HDCRC32 (0X00000001U<<30) //头部 CRC
#define RKLOAD_OPT_FWCRC32 (0X00000001U<<29) // 固件.
INT32U gSetupBaseOffset; //OFFSET 的相对偏移量.
INT32U *gSetupHeadBuffer; // 头部长度.max = 4096 BYTES.4 aligned.
INT32U *gSetupUnpackHead;
INT8U gSetupFileBuffer[SETUP_FILEBUFFER];
extern const FS_DEVICE_TYPE FS_FlashSysDevice;
char gSetupDestPath[] = "C:\\";//from setupuhinit.c
/*****************************************************************************/
#if defined(SETUP) || defined(_MSC_VER)
/*****************************************************************************/
#pragma arm section zidata="SYSSTACK"
INT32U gSetupStack[8*1024];
INT32U gSetupStackBotton[512]; //FOR IRQ STACK.
INT32U gRockIrqStackStart;
#pragma arm section
void * _gpAppHeapHandle;
/*****************************************************************************/
extern BOOLEAN CRC_32CheckBuffer(unsigned char * aData, unsigned long aSize);
extern void FS_format(const FS_DEVICE_TYPE *pDev, uint8 type);
extern int FS_fcopy(char *SrcFileName, char *DstDir);
extern char gSetupDestPath[];
//#define ISetupDispDrawString(x,y,string,font)
/*****************************************************************************/
#endif
BOOLEAN BCMakeIDBlockData(UCHAR *pIDBlockData, UCHAR* pUsbData , UINT UsbDataLen,
UCHAR* pBootCode, UINT BootCodeLen)
{
return TRUE;
}
/*****************************************************************************/
//071222,huangsl,以下两个函数,在 SETUP 固件和系统固件都要调用.
//获取 固件的 OFFSET 地址.
INT32U ISetupGetFwOffset(MY_FILE* inputFile)
{
INT32U fileSize;
KNL_SECINFO gLoaderSecInfo;
fileSize = FSFileRead(&gLoaderSecInfo , sizeof(KNL_SECINFO) , inputFile) ;
if (sizeof(KNL_SECINFO) != fileSize)
{
return -1;
}
if (gLoaderSecInfo.ImagicNumber != RKLOAD_MAGIC
|| gLoaderSecInfo.Size != fileSize //考虑到扩展,gLoaderSecInfo.Size 会变大.
|| !(gLoaderSecInfo.ImageLoadOption&RKLOAD_OPT_SETUP)) //安装标志.
{
return 0; //NO FW.
}
//CHECK HEAD CRC
if (RKLOAD_OPT_HDCRC32 & gLoaderSecInfo.ImageLoadOption)
{
if (!CRC_32CheckBuffer((unsigned char *)&gLoaderSecInfo ,
(unsigned long) fileSize))
{
return -1;
}
}
//get total length.
gLoaderSecInfo.ImageLoadLimit -= gLoaderSecInfo.ImageLoadBase;
//CRC CHECK.有外部工具生产,因此需要 单独增加 4 BYTES。
if (gLoaderSecInfo.ImageLoadOption & RKLOAD_OPT_FWCRC32)
{
gLoaderSecInfo.ImageLoadLimit += sizeof(INT32U);
}
#ifndef SETUP // 固件 升级的时候需要使用.
//头部其他信息 忽略.
if (gLoaderSecInfo.ImageLoadOption & RKLOAD_OPT_FWCRC32)
{
char *pFWBuff;
pFWBuff = (char*)MALLOC(gLoaderSecInfo.ImageLoadLimit);
if (pFWBuff == NULL)
return -1;
FSFileSeek(inputFile , gLoaderSecInfo.Size , SEEK_SET);
if (FSFileRead((void*)pFWBuff , gLoaderSecInfo.ImageLoadLimit , inputFile)
!= gLoaderSecInfo.ImageLoadLimit)
{
FREE(pFWBuff);
return -1;
}
//NOW CHECK CRC OK.
if (!CRC_32CheckBuffer((unsigned char *)pFWBuff ,
(unsigned long) gLoaderSecInfo.ImageLoadLimit))
{
FREE(pFWBuff);
return -1;
}
FREE(pFWBuff);
}
#else
// SETUP , CLEAR FLAG.
RkLDWDClear();
*gSysLoaderFlag = 0x123456ad; //SET FW OK.
#endif
return gLoaderSecInfo.ImageLoadLimit + gLoaderSecInfo.Size;
}
/*****************************************************************************/
//延迟 毫秒数 .
void SetupDelayMs(INT32U ms)
{
#if defined( BOARD )
INT32U lms;
INT32U freq = Pll_get_arm_freq();
ms *= 500; //800 的 倍数.
while (freq-- > 0)
{
lms = ms;
while (lms-- > 0);
}
#endif
}
/*****************************************************************************/
#if 1//defined(SETUP) || defined(_MSC_VER)
/*****************************************************************************/
/*
错误 打印函数.
*/
void ISetupErrorString(char * ErrInfo)
{
//ISetupDispDrawString( SETUP_FILEX , SETUP_FILEY, ErrInfo , 16 );
SetupDelayMs(5000);
}
// 文件操作函数.
#define ISTUP_SHOWNAME_MIN (0X040000) // 256K .
INT32U ISetupFsOperCopyFile(MY_FILE* inputFile , MY_FILE* outPut ,
INT32U copyByte , char* fileName)
{
INT32U readNum ;
INT32U writeNum = 0;
INT32U ShowBytes; // max 10
#if defined(SETUP)
char showName[128];
INT32U bShow = 0;
if (copyByte > ISTUP_SHOWNAME_MIN)
{
bShow = 1;
strcpy(showName , fileName);
strcat(showName , ".");
}
#endif
readNum = SETUP_FILEBUFFER;
while (readNum == SETUP_FILEBUFFER)
{
if (copyByte < readNum)
readNum = copyByte;
if (FSFileRead(gSetupFileBuffer , readNum , inputFile) != readNum)
{
TR("READ FAILED,COPY BYTES[%x]" , copyByte);
ISetupErrorString("FS OPER READ FAILED!");
return 2;
}
if (FSFileWrite(gSetupFileBuffer , readNum , outPut) != readNum)
{
TR("WRITE FAILED,COPY BYTES[%x]" , copyByte);
ISetupErrorString("FS OPER WRITE FAILED!");
return 1;
}
copyByte -= readNum;
writeNum += readNum;
#if defined(SETUP)
if (bShow && writeNum >= ISTUP_SHOWNAME_MIN)
{
//ISetupDispDrawString( SETUP_FILEX , SETUP_FILEY, showName , 16 );
writeNum -= ISTUP_SHOWNAME_MIN;
bShow++;
strcat(showName , ".");
if (bShow > 12)
{
bShow = 1;
strcpy(showName , fileName);
}
}
#endif
}
return copyByte;
}
// 文件操作 .
extern char* SetupPrint;
extern PIMAGE_PACKDENTRY SetupFilePrint;
extern WINDOW* FirmWareWin;
INT32U ISetupFsOper(INT32U offSet , MY_FILE* file , char* destDir)
{
INT32U fileOffset = offSet;
char outFilePath[128];
//char showName[48];
char *showName;
PIMAGE_RESBIN_DIRECTORY pResBInDir;
PIMAGE_PACKDENTRY pPackDir;
MY_FILE *creatFile;
showName = RKmalloc(48);
gSetupUnpackHead = (INT32U*)MALLOC(BF_HEAD_SIZE);
FSFileSeek(file , offSet , 0);
if (FSFileRead((void*)gSetupUnpackHead , BF_HEAD_SIZE , file)
!= BF_HEAD_SIZE) //读取整个头部信息.
{
FREE(gSetupUnpackHead);
ISetupErrorString("FS OPER READ HEAD ERROR!");
return 3;
}
pResBInDir = (PIMAGE_RESBIN_DIRECTORY)gSetupUnpackHead;
if (pResBInDir->Magic != RKST_MAGIC_FLAG
|| pResBInDir->SizeOfNameDir != (INT16U) - 1
|| pResBInDir->NumberOfNamedEntries == 0)
{
FREE(gSetupUnpackHead);
ISetupErrorString("FS OPER CHECK HEAD ERROR!");
return 4;
}
pPackDir = (PIMAGE_PACKDENTRY)((INT8U*)gSetupUnpackHead + pResBInDir->OffsetOfNamedEntries);
while (pPackDir->Size > 0)
{
strcpy(outFilePath , destDir);
strcat(outFilePath , pPackDir->Name);
pPackDir->OffsetToData += fileOffset;
// TR("[%s],BYTS=%x" ,outFilePath , pPackDir->SizeOfBytes);
//显示 当前正在 拷贝的文件名 .
if (strrchr(pPackDir->Name , '\\'))
{
strcpy(showName , strrchr(pPackDir->Name , '\\') + 1);
}
else
{
strcpy(showName , pPackDir->Name);
}
#ifdef SETUP
ISetupDispDrawString(SETUP_FILEX , SETUP_FILEY , showName , 16);
#else
SetupPrint = showName;
SetupFilePrint = pPackDir;
WindowSendMessage(FirmWareWin, WM_COMMAND, 0, (WLPARAM)SetupPrint);
WindowInvalidateWindow(NULL);
#endif
if (pPackDir->Action == IRES_PACKACT_MKDIR)
{
// 建立目录.
#if defined (BOARD)
int r = FS_MakeDir(outFilePath);
#else
int r = FSMakeDir(outFilePath); // MSC VER
#endif
if (FS_RETURN_OK != r
&& FS_FDT_EXISTS != r)
{
TR("Make Dir:%s Failed!\n", outFilePath);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -