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

📄 setup.c

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