122 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <umsd.h>
 | |
| #include <kwrap/task.h>
 | |
| #include <FileSysTsk.h>
 | |
| #include <FwSrvApi.h>
 | |
| #include <msdcnvt/MsdcNvtApi.h>
 | |
| #include <msdcnvt//MsdcNvtCallback.h>
 | |
| #include <hwpower.h>
 | |
| #include <timer.h>
 | |
| #include "MsdcNvtCb_UpdFw.h"
 | |
| #include "PrjInc.h"
 | |
| #include "SysMain.h"
 | |
| 
 | |
| #if defined(__FREERTOS)
 | |
| 
 | |
| #define ALL_IN_ONE_MAX_SIZE 0x1000000
 | |
| #define CFG_USE_MALLOC DISABLE
 | |
| 
 | |
| static UINT32 uiWorkMem = 0;
 | |
| 
 | |
| //for MSDCVendorNVT_AddCallback_Bi
 | |
| static void MsdcNvtCb_UpdFwAllInOne_Step1(void *pData);
 | |
| static void MsdcNvtCb_UpdFwAllInOne_Step2(void *pData);
 | |
| 
 | |
| MSDCNVT_REG_BI_BEGIN(m_MsdcNvtUpdfw)
 | |
| MSDCNVT_REG_BI_ITEM(MsdcNvtCb_UpdFwAllInOne_Step1)
 | |
| MSDCNVT_REG_BI_ITEM(MsdcNvtCb_UpdFwAllInOne_Step2)
 | |
| MSDCNVT_REG_BI_END()
 | |
| 
 | |
| BOOL MsdcNvtRegBi_UpdFw(void)
 | |
| {
 | |
| 	return MsdcNvt_AddCallback_Bi(m_MsdcNvtUpdfw);
 | |
| }
 | |
| 
 | |
| static void MsdcNvtCb_UpdFwAllInOne_Step1(void *pData)
 | |
| {
 | |
| 	tMSDCEXT_UPDFWALLINONE_STEP1 *pDesc = MSDCNVT_CAST(tMSDCEXT_UPDFWALLINONE_STEP1, pData);
 | |
| 	if (pDesc == NULL) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	//Delete Firmware in Cards
 | |
| 	DBG_DUMP("\r\nDelete firmware in A:\\ \r\n");
 | |
| 	if (FileSys_DeleteFile("A:\\"_BIN_NAME_T_".BIN") != FST_STA_OK) {
 | |
| 		DBG_IND("Ignore deleting file.\r\n");
 | |
| 	}
 | |
| 
 | |
| 	if (FileSys_DeleteFile("A:\\"_BIN_NAME_".BIN") != FST_STA_OK) {
 | |
| 		DBG_IND("Ignore deleting file.\r\n");
 | |
| 	}
 | |
| 
 | |
| #if (CFG_USE_MALLOC)
 | |
| 	uiWorkMem  = (UINT32)malloc(ALL_IN_ONE_MAX_SIZE);
 | |
| #else
 | |
| 	uiWorkMem  = (UINT32)SysMain_GetTempBuffer(ALL_IN_ONE_MAX_SIZE);
 | |
| #endif
 | |
| 	if (uiWorkMem) {
 | |
| 		pDesc->uiAddr = uiWorkMem;
 | |
| 		pDesc->uiSize = ALL_IN_ONE_MAX_SIZE;
 | |
| 		pDesc->tParent.bOK = TRUE;
 | |
| 	}
 | |
| }
 | |
| 
 | |
| static void system_reboot(UINT32 event)
 | |
| {
 | |
| 	DBG_DUMP("\nsystem_reboot...\n");
 | |
| 	hwpower_set_power_key(POWER_ID_HWRT, 0xff); //h/w reset NOW
 | |
| }
 | |
| 
 | |
| static void MsdcNvtCb_UpdFwAllInOne_Step2(void *pData)
 | |
| {
 | |
| 	tMSDCEXT_UPDFWALLINONE_STEP2 *pDesc = MSDCNVT_CAST(tMSDCEXT_UPDFWALLINONE_STEP2, pData);
 | |
| 
 | |
| 	if (pDesc == NULL) {
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	if (pDesc->uiKey != MAKEFOURCC('N', 'O', 'V', 'A')) {
 | |
| 		DBG_ERR("MsdcNvtCb_UpdFwSetBlock: Invalid Key\r\n!");
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| 	FWSRV_BIN_UPDATE_ALL_IN_ONE Desc = {0};
 | |
| 	Desc.uiSrcBufAddr = (UINT32)uiWorkMem;
 | |
| 	Desc.uiSrcBufSize = (UINT32)pDesc->EffectDataSize;
 | |
| 
 | |
| 	FWSRV_CMD Cmd = {0};
 | |
| 	Cmd.Idx = FWSRV_CMD_IDX_BIN_UPDATE_ALL_IN_ONE; //continue load
 | |
| 	Cmd.In.pData = &Desc;
 | |
| 	Cmd.In.uiNumByte = sizeof(Desc);
 | |
| 	Cmd.Prop.bExitCmdFinish = TRUE;
 | |
| 
 | |
| 	ER er = FwSrv_Cmd(&Cmd);
 | |
| 
 | |
| 	if (er != FWSRV_ER_OK) {
 | |
| 		DBG_ERR("Process failed!\r\n");
 | |
| 		pDesc->tParent.bOK = FALSE;
 | |
| 		return;
 | |
| 	}
 | |
| 
 | |
| #if (CFG_USE_MALLOC)
 | |
| 	free((void *)uiWorkMem);
 | |
| #else
 | |
| 	SysMain_RelTempBuffer(uiWorkMem);
 | |
| #endif
 | |
| 
 | |
| 	TIMER_ID timer_id;
 | |
| 	if (timer_open(&timer_id, system_reboot) == E_OK) {
 | |
| 		timer_cfg(timer_id, 500000, TIMER_MODE_FREE_RUN | TIMER_MODE_ENABLE_INT, TIMER_STATE_PLAY);
 | |
| 	}
 | |
| 
 | |
| 	pDesc->tParent.bOK = TRUE;
 | |
| }
 | |
| 
 | |
| #else
 | |
| BOOL MsdcNvtRegBi_UpdFw(void)
 | |
| {
 | |
| 	return FALSE;
 | |
| }
 | |
| #endif | 
