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

📄 setup.c

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