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

📄 upgrade_lg.c

📁 M3355的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************/
/*		FlashRam:MXIC 29F400T/B									*/
/*																*/
/*Modified History:												*/
/* 1999.11.2--First release by Edmond							*/
/* 1999.12.7--Reallocation by Charlemagne						*/
/* 2000.3.15--Modify by Rockman 								*/
/* 2000-5-15--Modify by Charlemagne Yue							*/
/* 2001-10-1--Modify by CliffWang            */
/* 2002-9-13--Modify by peter  for M3351     */
/*********************************************/

/*====================================================================
 *
 *  Copyright (C) 2004 ALi Corporation.  All Rights Reserved.
 *
 *  File: upgrade_lg.c
 *
 *  Contents:
 *    It's a general upgrade program. It can be used by LA4Mx16x1,
 *  LA1M16x2, and CAR DVD now.
 *    See reference of "upgrade overview_v10.pdf"
 *
 *  History:
 *   Date            By       Reason                Version
 *   ===========    =======  ====================   =======
 *   04/06/04       Steven    upgrade function definitions
 *
 *------------------------------------------------------------------*/

#include <comsub.h>
#include <platform.h>

#include <filesys.h>
#include <atapi.h>
//#include <string.h>
#include <flash.h>
#include <panel.h>
#include <gui.h>
#include <resource.h>
//#include <nmscreen.h>
#include <filesys.h>
#include <gui.h>
#include <ui.h>
#include "../cstm/fend/frntp.h" 

#include <upgrade.h>
#include <m3325jpg.h>


#define BIN_FILE	UPGRADE_FILE_PATH



/*upgrade osd show mode define*/
/*
#define UPG_CHECKSUM 	0
#define UPG_OK			1
#define UPG_UPGRADING	2
#define UPG_SUCCESS		3
#define UPG_FAIL		4
*/

//Dickma for LG 0508
//extern caddr_t _malloc_start;                /* _end is set in the linker command file */



//////////////////////////////////////////////////////////////////////


//
// for flash size <= 1M
//
#if ((_SDRAM_MODE==_SDRAM_1M16x2_MODE_) || (_SDRAM_MODE==_SDRAM_4M16x1_MODE_))
//#define FRAME_BUF_OFFSET_Y		0x200000
#define FRAME_BUF_OFFSET_Y		FRAME_BUFFER_OFFSET
#define FRAME_BUF_SIZE_Y		(720*576*3)	// F01_Y & F11_Y & F01_C & F11_C

FRAME_BUFFER_OBJ  FrameBuf[1] =
	{FRAME_BUF_OFFSET_Y, FRAME_BUF_SIZE_Y, 576*3, 720, 2048, 0, 0};
const BYTE		  g_bFrmObjCount  = 1;
BYTE    		  g_bFrmObjCurNum = 0;


#endif
//////////////////////////////////////////////////////////////////////



/*****************  Start: 30803_01jeff for CDUpgrade using 1M*16 flash  ************/
#define ReadLS(arg1,arg2) ReadSectorUp(arg1,arg2,1,C_LBA,TRUE)//030530_2Xi for dvd audio
/*****************  End: 30803_01jeff for CDUpgrade using 1M*16 flash  *************/

#if (_FLASH_TYPE_ == FLASH_x8x16_16BIT_BUS)
WORD* awData ;
#else
BYTE* awData ;
#endif

#define PRINTF(...)
#define EPRINTF(...)
#define SPRINTF(...)


/////////////////////////////////////////////////////////////////////////////
//
// Interface
//

void RebootSystem()
{
#if ((UPGRADE_MODE == UPGRADE_SDRAM_MODE))
	GenerateException();
#else
//for 4m sdram & car dvd
	asm volatile(".set noreorder
			la $2, 0xbfc00000
			jalr $2
			nop
			.set reorder
			"
			::);
#endif
}

/*****************************************************************************
 Function	 : ChkIsAli_CDROM
 Description  : If the CD is alicdrom,load the data to RAM
 Arguments	: None
 Return value : C_OK -> success
				C_FAIL -> fail
*****************************************************************************/
void ChkIsAli_CDROM(void)
{
    int i,fail_flag = 1;

	SPRINTF(">>>>>>>> ChkIsAli_CDROM\r\n");
    FlashAuto_ID_Ok=0; //peter 0410 for whadh

    PRINTOUT(ER_ChkIsAli_CDROM | ER_Enter);
    if ( IsAli_CDROM() )
    {

/*			
		
//		CmdUIMsg(C_DT_TEST, C_DT_TEST_END);

//        for(i=0;i<500;i++)//peter 0410 for whadh
        for(i=0;i<2000;i++)//peter 0410 for whadh
        {

			p_FlashAutoSelect_ID();
            EPRINTF("Flash ID = 0x%X\r\n", FlashDeviceID);
            EPRINTF("Flash Manufacturer ID = 0x%X\r\n", FlashManufacturerID);
            if( ((FlashManufacturerID==0xc2)&&(FlashDeviceID==0x4f) ) //mx29lv040
                    ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0x49) ) //mx29lv800BTC
                    ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0x5B) ) //mx29lv800BTC
                    ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0xDA) ) //mx29lv800ATTC
                    ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0xa4) ) //mx29f040
                    ||((FlashManufacturerID==0x04)&&(FlashDeviceID==0x00) ) //fujisu mbm29lv800BA
                    ||((FlashManufacturerID==0x04)&&(FlashDeviceID==0xa4) ) //fujisu mbm29f040c
                    ||((FlashManufacturerID==0x01)&&(FlashDeviceID==0xa4) ) //am29f040b
                    ||((FlashManufacturerID==0x37)&&(FlashDeviceID==0x86) ) //AMIC A29040A
                    ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0x46) ) //PM29F004
                    ||((FlashManufacturerID==0xbf)&&((FlashDeviceID==0xb7)||(FlashDeviceID==0xd7)||(FlashDeviceID==0x77) )) //SST39SF040
                    ||((FlashManufacturerID==0xda)&&(FlashDeviceID==0x46) ) //W29C040
                    ||((FlashManufacturerID==0x1f)&&(FlashDeviceID==0x13) ) )//ATMEL AT49F040
            {
                FlashAuto_ID_Ok=1;
                break;
            }
            //PRINTF("flashID check!!times=%d %x %x \n",i+1,FlashManufacturerID,FlashDeviceID);
        }

		SPRINTF("FlashAuto_ID_Ok: %d\r\n", FlashAuto_ID_Ok);
        SPRINTF("Flash ID = 0x%X\r\n", FlashDeviceID);
        SPRINTF("Flash Manufacturer ID = 0x%X\r\n", FlashManufacturerID);

//for test
		if (FlashAuto_ID_Ok == 0)
		{
	        FlashAuto_ID_Ok=1;
			FlashManufacturerID=0xc2;
			FlashDeviceID=0xda;
		}
*/
        if(1/*FlashAuto_ID_Ok*/)
        {
			CmdUIMsg(C_DT_TEST, C_DT_TEST_END);

            InitUpgOSD();
			//Dickma 1212
            //for (i = 0;i < 30;i++)
            {
				jpgClearFBuf2(UPGRADE_DISPLAY_FRAME,
							Y(58,110,165), Cb(58,110,165), Cr(58,110,165));
				ShowFBuf(UPGRADE_DISPLAY_FRAME);

                //if (Loadprogram() == TRUE)
                if (Upgrade() == TRUE)
                {
					SPRINTF("Upgrade() success!\r\n");
                }
				else	//
				{
					SPRINTF("Upgrade() failed!\r\n");
				}
//for test
				dly_tsk(3000);
                ter_tsk(TASK_ID_UI);
                ter_tsk(TASK_ID_FP);
        		halPowerDown();//30910-02jeff:Enter Standby after CD Upgrade
       			FPPowerDown();//30910-02jeff:Enter Standby after CD Upgrade
            }

			CloseUpgOSD();
        }
		else
		{
			SPRINTF("Flash type NOT supported!\r\n");
		}

	    Alicdrom = 0;
	    DiscType = C_UNKOWN_DISC;
    }
	SPRINTF("<<<<<<<< ChkIsAli_CDROM\r\n");

}

/*****************************************************************************
 Function	 : IsAli_CDROM
 Description  : This function will detect Ali CD
 Arguments	: None
 Return value : C_OK -> success
				C_FAIL -> fail
*****************************************************************************/
BOOL IsAli_CDROM()
{
    FS_FILE *fp;

	SPRINTF(">>>>>>>> IsAli_CDROM\r\n");
    if ( (fp=FsOpen(BIN_FILE, "rb"))!=NULL )
    {
        FsClose(fp);
        PRINTF("found upgrade CD\n");
		SPRINTF("found upgrade CD\r\n");

        Alicdrom = 1;
        MachineState = C_MACHINE_ST_READY;
        PnlReset();
        PnlDisplayMsg(PNL_MSG_UPGRADE);

        DiscType = C_ALICDROM;
		SPRINTF("<<<<<<<< IsAli_CDROM\r\n");
        return TRUE;
    }

	SPRINTF("<<<<<<<< IsAli_CDROM\r\n");
    return FALSE;
}

BOOL Upgrade()
{
	BYTE* buffer;
	DWORD FileSize;
	DWORD ROMSize;
	int i;

#if ((UPGRADE_MODE == UPGRADE_FLASH_MODE))
	extern void _upgrade_text_start;
	extern void _flashconten_end;
	extern void _upgrade_text_end;

	memcpy(&_upgrade_text_start, &_flashconten_end, &_upgrade_text_end - &_upgrade_text_start +1);
#endif

	SPRINTF(">>>>>>>> Upgrade\r\n");

	/*Read CD-upgrade file for 3 times*/
	for (i = 0; i < 3; i++)
	{
		//stage 1: display read disc window
		ShowUpgInfo(UPGRADE_READDATA, i);
		if (ReadROMFromDisc(BIN_FILE, &ROMSize))
		{
			SPRINTF("Step 1: Read OK\r\n");
			if (ROMCheckSum(buffer, &ROMSize) == TRUE)
			{
				SPRINTF("Step 2: Check sum OK\r\n");
				break;
			}
			else
				UpFreeData();
		}
	}

	if (i >= 3) 
	{
		SPRINTF("Try 5 times read data or check sum fail\r\n");
		//Dickma 1212, Display up-grade warning, CD error
		ShowUpgInfo(UPGRADE_WARNING,1);
		SPRINTF("<<<<<<<< Upgrade\r\n");
		return FALSE;
	}
	//Stage 2: display upgrade warning window and Tray out
	//Tary out
	OpenTraySong(0);
	dly_tsk(5000);

/*
	ShowUpgInfo(UPGRADE_WARNING,0);

	//Stage 3: wait UP key
    g_UpgradeWaitUserKey_UP=1;
    CmdFPMsg_Ext(VFD_UPGRADE_SHOW,C_UPGRADE_PRESSUP,0);
    while(1)
    {
        delay(10);
        if(g_flag_AllowUpgrade) //check up key
        {
            g_UpgradeWaitUserKey_UP=0;
            g_flag_AllowUpgrade=0;
            break;
        }
    }
	//Tray in
	CloseTray(0);
	dly_tsk(3000);
*/

	ShowUpgInfo(UPGRADE_WARNING,4);

//for test
//	SPRINTF("<<<<<<<< Upgrade\r\n");
//	return FALSE;
    ter_tsk(TASK_ID_UI);
    ter_tsk(TASK_ID_FP);
    ter_tsk(TASK_ID_PE);
    ter_tsk(TASK_ID_DVDENG);
    ter_tsk(TASK_ID_VOBU);
    ter_tsk(TASK_ID_ATA);
    ter_tsk(TASK_ID_SERVO);
	
	DisInt();
	if (!UpgradeFlash(buffer, ROMSize))
	{
		UpFreeData();
		ShowUpgInfo(UPGRADE_WARNING,3);
		return FALSE;
	}
	else
	{
		UpFreeData();
		ShowUpgInfo(UPGRADE_FINISH, 0);
		return TRUE;
	}
}

BOOL UpgradeFlash_ram(BYTE* buffer, DWORD ROMSize)
{
	int i;

	UPPRINTF(">>>>>>>> UpgradeFlash\r\n");

#if 0
    for(i=0;i<2000;i++)//peter 0410 for whadh
    {
		FlashAutoSelect_ID();
        EPRINTF("Flash ID = 0x%X\r\n", FlashDeviceID);
        EPRINTF("Flash Manufacturer ID = 0x%X\r\n", FlashManufacturerID);
        if( ((FlashManufacturerID==0xc2)&&(FlashDeviceID==0x4f) ) //mx29lv040
                ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0x49) ) //mx29lv800BTC
                ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0x5B) ) //mx29lv800BTC
                ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0xDA) ) //mx29lv800ATTC
                ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0xa4) ) //mx29f040
                ||((FlashManufacturerID==0x04)&&(FlashDeviceID==0x00) ) //fujisu mbm29lv800BA
                ||((FlashManufacturerID==0x04)&&(FlashDeviceID==0xa4) ) //fujisu mbm29f040c
                ||((FlashManufacturerID==0x01)&&(FlashDeviceID==0xa4) ) //am29f040b
                ||((FlashManufacturerID==0x37)&&(FlashDeviceID==0x86) ) //AMIC A29040A
                ||((FlashManufacturerID==0xc2)&&(FlashDeviceID==0x46) ) //PM29F004
                ||((FlashManufacturerID==0xbf)&&((FlashDeviceID==0xb7)||(FlashDeviceID==0xd7)||(FlashDeviceID==0x77) )) //SST39SF040
                ||((FlashManufacturerID==0xda)&&(FlashDeviceID==0x46) ) //W29C040
                ||((FlashManufacturerID==0x1f)&&(FlashDeviceID==0x13) ) )//ATMEL AT49F040
        {
            FlashAuto_ID_Ok=1;
            break;
        }
        //PRINTF("flashID check!!times=%d %x %x \n",i+1,FlashManufacturerID,FlashDeviceID);
    }

	//UPPRINTF("FlashAuto_ID_Ok: %d\r\n", FlashAuto_ID_Ok);
    //UPPRINTF("Flash ID = 0x%X\r\n", FlashDeviceID);
    //UPPRINTF("Flash Manufacturer ID = 0x%X\r\n", FlashManufacturerID);

	if (FlashAuto_ID_Ok == 0)
	{
		UPPRINTF("FlashAuto_ID_Ok: 0\r\n");
		return FALSE;
	}
	else
		UPPRINTF("FlashAuto_ID_Ok: 1\r\n");
		
#endif

	//Stage 4: Erase and program flash, for 3 times
	ShowProgress(0);
	for( i=0 ; i<3 ; i++ )
	{
//	    CmdFPMsg_Ext(VFD_UPGRADE_SHOW,C_UPGRADE_READ,0);
	    if (Erase_Flash() == FALSE)
	    {
			//mark 40315
//	        ShowUpgInfo(UPGRADE_EARSE,PROCESS_ERROR);
//	        SPRINTF("Step 3: Erase flash fail\r\n");
	    }
	    else
	    {

//			SPRINTF("Step 3: Erase chip Ok\r\n");
			//mark 40315
//			ShowUpgInfo(UPGRADE_EARSE,PROCESS_OK);

//			CmdFPMsg_Ext(VFD_UPGRADE_SHOW,C_UPGRADE_UPGRADE,0);
			if (WriteToFlash(buffer, ROMSize) == FALSE)
			{
				//mark 40315
//				ShowUpgInfo(UPGRADE_PROGRAM,PROCESS_ERROR);
//				SPRINTF("Step 4: Write flash fail\r\n");
			}
			else
			{
				//mark 40315
//				ShowUpgInfo(UPGRADE_PROGRAM,PROCESS_5);
//				SPRINTF("Step 4: Write flash OK\r\n");
				//Stage 5: display cd-upgrade finished, and then re-start
//				if(Flash_Verify(Valid_Data_Lenth,Right_Check_Sum))
				if(1)
				{
					//mark 40315
#if ((UPGRADE_MODE == UPGRADE_DRAM_MODE))
					ShowUpgInfo(UPGRADE_FINISH,0);
					//CmdFPMsg_Ext(VFD_UPGRADE_SHOW,C_UPGRADE_FINISHED,0);
					//mark 40315
					dly_tsk(1000);
#endif
					//re-start
					RebootSystem();

//					SPRINTF("<<<<<<<< UpgradeFlash OK\r\n");
					return TRUE;     	
				}
				else
				{
//		                 SPRINTF("\n ==== Flash_Verify ERROR  === \r\n");
				}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -