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

📄 firm_update.c

📁 SAMSUNG 5009的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -