📄 firm_update.c
字号:
UINT length;
pszId[0] = '\0';
pszVer[0] = '\0';
pszCheck[0] = '\0';
/*
* To check check bytes
*/
memcpy( pszCheck, src+FIRM_CHECK_BYTE_OFFSET, 16 );
if(GetDiscState() == USB_DISC)
length = 8;
else
length = 16;
for( i = 0; i < length; i++ )
{
if( pszCheck[i] == 0xFF )
break;
}
pszCheck[i] = '\0';
if( strcmp( pStr, pszCheck ) != 0 )
return FALSE;
/*
* To check ID
*/
memcpy( pszId, src+FIRM_SPECIAL_BYTE_OFFSET, 16 );
for( i = 0; i < 16; i++ )
{
if( pszId[i] == 0xFF )
break;
}
pszId[i] = '\0';
/*
* To check Version
*/
memcpy( pszVer, src+FIRM_VERSION_OFFSET, 16 );
for( i = 0; i < 16; i++ )
{
if( pszVer[i] == 0xFF )
break;
}
pszVer[i] = '\0';
gFirm_rom_addr = (UINT)(src+FIRM_ROM_ADDR_OFFSET);
strcpy( gFirm_new_id, pszCheck );
strcpy( gFirm_new_ver, pszVer );
return TRUE;
}
VOID FirmUpdateStart( ULONG argc, VOID *argv )
{
BOOL bMain_exit = FALSE;
BOOL bFirm_loading = FALSE;
Key_t rx;
ULONG rsize;
OSD_State_st *osd_state;
OsdCtrl_st ctrl;
#if FIRM_USE_RECOVER
UINT *recover_addr, recover_size;
#endif
#if _APP_CAP_FUNC_FIRMUP_BY_USB
FS_File_st open_f;
SH_MediaType_et disc;
#endif
UINT timeout;
SysPrintf("\nEnter in Firmware Update Main.");
#if _APP_CAP_FUNC_FIRMUP_BY_USB
giFirm_fid = 0;
gpstFirm_files = NULL;
gpstFirm_mount = FS_DRV_NULL;
if( GetDiscState() == FIRM_USB )
{
disc = SH_MEDIA_USB_HOST;
} else {
disc = SH_FE_GetMediaType();
}
if( FirmFileListCheck(disc) == FALSE )
{
SysPrintf("\n[FIRM] Cannot find firmware file.");
goto EXIT_FROM_HERE;
}
#endif
gQ_firm = SysAppMalloc(sizeof(SysQueue_t));
if( gQ_firm == NULL )
goto EXIT_FROM_HERE;
if(SysCreateMsgQ(gQ_firm, "FIRM_Q", 1,
MSG_FIXED_SIZE, sizeof(Key_t), SYS_FIFO, SYS_SYSTEM_POOL) != SYS_RETURN_SUCCESS )
{
goto EXIT_FROM_HERE;
}
SetMainState( MAIN_PLAY );
SetVfdMainState( FP_MAIN_FIRMCD ); // OMS 6/22
/**
If Flash device used for code runing, detect job will be done in
firmupdate operation.
*/
#if !_APP_CAP_PERI_EEPROM_USE_FLASH
FLASH_detectDevice();
#endif
while( bMain_exit == FALSE )
{
if( SysReceiveMsg( gQ_firm, &rx, sizeof( Key_t ), &rsize, SYS_WAIT,
0 ) == SYS_RETURN_SUCCESS )
{
osd_state = OSD_GetState();
switch( rx.key_data )
{
case RC_KEY_POWER:
#if _APP_CAP_FUNC_FIRMUP_BY_USB
FS_Close(giFirm_fid);
FS_DeleteEntryList(gpstFirm_files);
FS_Unmount(gpstFirm_mount);
giFirm_fid = 0;
gpstFirm_files = NULL;
gpstFirm_mount = FS_DRV_NULL;
#endif
GuiPower(rx.param);
break;
case RC_KEY_LEFT:
case RC_KEY_RIGHT:
if( bFirm_loading == TRUE )
return;
if( osd_state->ebFirmup_sel == TRUE )
{
ctrl.p.toggle = FALSE;
} else {
ctrl.p.toggle = TRUE;
}
OSD_ChangeDisplay(OSD_CTRL_ELEM_SELECT, &ctrl, SYS_NO_WAIT);
break;
case RC_KEY_ENTER:
if( bFirm_loading == TRUE )
return;
if( osd_state->ebFirmup_sel == TRUE )
{
#if FIRM_USE_RECOVER
BOOL recover_flag = TRUE; /* to check previous flash */
#endif
bFirm_loading = TRUE;
OSD_ChangeDisplay(OSD_CTRL_CD_UP_START, NULL, SYS_NO_WAIT);
#if _APP_CAP_FUNC_FIRMUP_BY_USB
giFirm_fid = FS_Open( gpstFirm_mount, gpstFirm_files, &open_f, FIRM_FILE_NAME, -1, FS_OM_READ);
if( giFirm_fid == 0 )
{
SysPrintf("\n[FIRM] Cannot open firmware file.");
goto POWEROFF;
}
/* Download flash image from CD */
if( DownloadFirmwareImage( giFirm_fid, open_f.iEntry_lba, open_f.iEntry_size ) == FALSE )
{
SysPrintf("\n[FIRM] Image Download fail" );
/*
* To cancel this update
*/
goto POWEROFF;
} else {
FS_Close( giFirm_fid );
giFirm_fid = 0;
}
#else
/* Download flash image from CD */
if( DownloadFirmwareImage( giReserved_file_lba, giReserved_file_size ) == FALSE )
{
SysPrintf("\n[FIRM] Image Download fail" );
/*
* To cancel this update
*/
goto POWEROFF;
}
#endif
/* open tray */
SH_PM_Stop(PM_STOP_OPT_FULL);
SH_FE_Eject();
/* Open spindle */
{
SH_FEState_et state;
UINT tray_timeout = 0;
state = SH_FE_GetState();
while( state != SH_FE_STATE_OPENED )
{
if( tray_timeout == 30000 )
{
SysPrintf("\n TIMEOUT &&&&");
Door_Open();
break;
}
tray_timeout++;
SysSleep(800,0);
state = SH_FE_GetState();
}
}
gTray_open = TRUE;
gLoading_on = FALSE;
#if FIRM_USE_RECOVER
/* Save previous image for recovering */
/*
* Add 0x100000 to frame buffer address because frame buffer
* address is used for download address from CD.
*/
recover_addr = (UINT *)(gFirm_down_addr + FIRM_MAX_SIZE);
timeout = 0;
while( timeout < FIRM_COPY_RETRY_COUNT )
{
SysPrintf("\n[FIRM] Read from flash start.");
if( FLASH_readFromFlash( recover_addr, &recover_size ) == TRUE )
{
break;
}
timeout++;
}
if( timeout >= FIRM_COPY_RETRY_COUNT )
{
SysPrintf("\n[FIRM] Backup error.");
recover_flag = FALSE;
/*
* IF backup is failed, ignore this job.
*/
goto POWEROFF;
}
#endif // FIRM_USE_RECOVER
#if _APP_CAP_FUNC_FIRMUP_ON_FLASH
/*******************************************************
*
* For the case of code running type on flash,
* flash cannot be written during run time.
* If firmware image already downloaded on SDRAM,
* the PC will move to SDRAM special code area and then
* run a special code just for new version code.
*
* TJ 2005.05.01
*/
FLASH_updateFirmware( (UINT *)gFirm_down_addr );
#else // _APP_CAP_FUNC_FIRMUP_ON_FLASH
SysPrintf("\n[FIRM] Write to flash started.");
timeout = 0;
while( timeout < FIRM_WRITE_RETRY_COUNT )
{
SysPrintf("\n[FIRM] Erase flash.");
if( FLASH_eraseEntireFlash() == FALSE )
{
timeout++;
continue;
}
SysPrintf("\n[FIRM] Write image to flash.");
#if _APP_CAP_FUNC_FIRMUP_BY_USB
if( FLASH_writeFirmImage( (UINT *)gFirm_down_addr, open_f.iEntry_size ) == FALSE )
{
timeout++;
continue;
}
#else
if( FLASH_writeFirmImage( (UINT *)gFirm_down_addr ) == FALSE )
{
timeout++;
continue;
}
#endif
SysPrintf("\n[FIRM] Verify flash image written.");
#if _APP_CAP_FUNC_FIRMUP_BY_USB
if( FLASH_verifyFlashImage((UINT *)gFirm_down_addr, \
(UINT *)FLASH_BASE_ADDR, open_f.iEntry_size ) == FALSE )
#else
if( FLASH_verifyFlashImage((UINT *)gFirm_down_addr, \
(UINT *)FLASH_BASE_ADDR, giReserved_file_size ) == FALSE )
#endif
{
timeout++;
continue;
} else {
break;
}
}
#endif // !FIRM_UPGRADE_ON_FLASH
#if FIRM_USE_RECOVER
/*
* If firmware writing is failed, recover firmware from backup.
*/
if( (timeout >= FIRM_WRITE_RETRY_COUNT) &&
(recover_flag == TRUE) )
{
SysPrintf("\n[FIRM] Recover previous image from memory.");
timeout = 0;
while( timeout < FIRM_RECOVER_RETRY_COUNT )
{
SysPrintf("\n[FIRM] Erase flash.");
if( FLASH_eraseEntireFlash() == FALSE )
{
timeout++;
continue;
}
/* recover previous version */
SysPrintf("\n[FIRM] Recover flash image.");
if( FLASH_writeFirmImage( recover_addr ) == FALSE )
{
timeout++;
continue;
}
SysPrintf("\n[FIRM] Verify recovered image.");
if( FLASH_verifyFlashImage((UINT *)recover_addr, \
(UINT *)FLASH_BASE_ADDR, recover_size ) == FALSE )
{
timeout++;
continue;
} else {
break;
}
}
}
#endif // FIRM_USE_RECOVER
/* setup */
SetupInfoInit(FALSE);
/* >>> @: 5008CHN-XXX.Qian liping 050719: when reset, support pre- tv-system.'*/
#if _APP_CAP_FUNC_COLDSTART/* Qian liping 050713*/
SetupSetColdStartFlag( TRUE );
#endif
POWEROFF:
SysPrintf("\n[FIRM] Firm update job done.");
gCd_firm_upgrading = TRUE;
SetVfdMainState( FP_MAIN_FIRMCD_END ); // OMS 6/22
#if _APP_CAP_FUNC_FIRMUP_BY_USB
FS_Close(giFirm_fid);
FS_DeleteEntryList(gpstFirm_files);
FS_Unmount(gpstFirm_mount);
giFirm_fid = 0;
gpstFirm_files = NULL;
gpstFirm_mount = FS_DRV_NULL;
#endif
GuiPower( 0 );
} else {
/* Exit from firmware update */
SetDiscState( NO_DISC );
bMain_exit = TRUE;
}
break;
case RC_KEY_RETURN:
if( bFirm_loading == TRUE )
return;
SetDiscState( NO_DISC );
bMain_exit = TRUE;
break;
#ifndef _RELEASE /* Temprorary use */
case RC_KEY_FIT_DISPLAY:
FLASH_eraseEntireFlash();
gCd_firm_upgrading = TRUE;
SysSleep(1000, 0);
GuiPower( 0 );
break;
#endif
default:
break;
}
}
}
EXIT_FROM_HERE:
SetNavTaskEnd(END_NAV_NORMAL);
}
VOID FirmUpdateEnd( ULONG argc, VOID *argv )
{
if( gQ_firm != NULL )
{
SysDeleteMsgQ(gQ_firm, 0);
SysFree( gQ_firm );
}
SH_PM_Stop(PM_STOP_OPT_FULL);
#if _APP_CAP_FUNC_FIRMUP_BY_USB
FS_Close( giFirm_fid );
FS_DeleteEntryList(gpstFirm_files);
FS_Unmount(gpstFirm_mount);
giFirm_fid = 0;
gpstFirm_files = NULL;
gpstFirm_mount = FS_DRV_NULL;
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -