📄 upgrade_lg.c
字号:
/****************************************************************/
/* 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 + -