blob: e7a8df7615ed250a2ebca5e5f92d32488245d540 [file] [log] [blame]
#include "asr_flag.h"
#include "fota.h"
#include "obm2osl.h"
#include "serial.h"
#include "Errors.h"
#include "print.h"
extern UINT_T UUID[2];
extern UINT8_T FlashInitDone;
extern OBM2OSL *pOBM2OSL_h;
FOTA_Info FOTAInfo;
FOTA_Firmware FotaFirmware;
static void OTA_SetDefault_Config(P_FOTA_Firmware pFOTA_T, UINT_T Header, UINT_T MaxLen);
VOID ASRFlag_ParseCfgToOBM2OSLO(pTIM pTIM_h)
{
P_FOTA_Firmware pFOTA_T = OTAGetConfig(pTIM_h);
if(pFOTA_T == NULL){
obm_printf("ASR Flag not found in %s\n\r", __FUNCTION__);
return;
}
if(pFOTA_T->eehP[0] == EEHPID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->eehP[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->eehP[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->cpsr[0] == CPSRID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->cpsr[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->cpsr[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->hawk[0] == HAWKID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->hawk[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->hawk[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->imsd[0] == IMSDID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->imsd[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->imsd[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if((pFOTA_T->Production_Mode_Flag >= 0)&&
(pFOTA_T->Production_Mode_Flag <= 2))
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = PRODID;
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->Production_Mode_Flag;
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->pipe[0] == PIPEID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->pipe[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->pipe[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->fast[0] == FASTID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->fast[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->fast[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->apmf[0] == APMFID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->apmf[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->apmf[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->pid[0] == PIDID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->pid[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->pid[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->vid[0] == VIDID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->vid[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->vid[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(UUID[0] != 0)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = UUID0;
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = UUID[0];
pOBM2OSL_h->info.cfg_numbers++;
}
if(UUID[1] != 0)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = UUID1;
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = UUID[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->ramdump[0] == RAMDUMPID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->ramdump[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->ramdump[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->nocp[0] == NOCPID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->nocp[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->nocp[1];
pOBM2OSL_h->info.cfg_numbers++;
}
if(pFOTA_T->cplog[0] == CPLOGID)
{
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->cplog[0];
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->cplog[1];
pOBM2OSL_h->info.cfg_numbers++;
}
#if CONFIG_SAVE_LOG_TO_MEM
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = BOOT_LOG_MAGIC;
pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = CONFIG_BOOT_LOG_ADDR;
pOBM2OSL_h->info.cfg_numbers++;
#endif
return;
}
VOID ASRFlag_UpdateCRC(P_FOTA_Firmware pFOTA_T)
{
UINT_T CrcLen, CrcVal;
CrcLen = sizeof(FOTA_Firmware) - 4; /* 4 bytes is CRC itself */
CrcVal = malbrain_crc32(0, pFOTA_T, CrcLen);
pFOTA_T->CRC = CrcVal;
return;
}
INT_T ASRFlag_ValidateCRC(P_FOTA_Firmware pFOTA_T)
{
UINT_T CrcLen, CrcVal;
CrcLen = sizeof(FOTA_Firmware) - 4; /* 4 bytes is CRC itself */
CrcVal = malbrain_crc32(0, pFOTA_T, CrcLen);
if(pFOTA_T->CRC != CrcVal){
obm_printf("ASR Flag CRC mismatch: 0x%x 0x%x 0x%x\n\r", CrcVal, pFOTA_T->CRC, pFOTA_T->Header);
return 1;
}
return 0;
}
INT_T ASRFlag_IsInvalid(P_FOTA_Firmware pFOTA_T, pFOTA_INFO pFI)
{
if(pFOTA_T->Header != pFI->Magic)
return 1;
if(ASRFlag_ValidateCRC(pFOTA_T))
return 1;
return 0;
}
P_FOTA_Firmware OTAGetConfig(pTIM pTIM_h)
{
UINT_T Retval = GeneralError;
P_FOTA_Firmware pFOTA_T = &FotaFirmware;
P_FOTA_Firmware pFOTA_Temp1 = NULL;
P_FOTA_Firmware pFOTA_Temp2 = NULL;
pWTP_RESERVED_AREA_HEADER pWRAH = NULL;
pFOTA_INFO pFI = NULL;
P_FOTA_Info pFOTAInfo = &FOTAInfo;
P_FlashProperties_T pFlashP = GetFlashProperties(BOOT_FLASH);
UINT_T AsrFlagLen = sizeof(FOTA_Firmware);
#if MMC_CODE
UINT_T AsrFlagMaxLen = MAX_ASR_FLAG_SIZE;
#else
UINT_T AsrFlagMaxLen = pFlashP->BlockSize;
#endif
UINT_T NeedUpgrade = 1;
CHAR *CurVersion = NULL;
#if MMC_CODE
SetPartition(MMC_SD_USER_PARTITION, BOOT_FLASH);
#endif
if((pFOTAInfo->InitFlag != INIT_DONE) && FlashInitDone)
{
pWRAH = FindPackageInReserved(&Retval, pTIM_h, FOTAINFOID);
if ((pWRAH == NULL) || (Retval != NoError))
{
obm_printf("No FOTA package found\n\r");
return NULL;
}
else
{
pFI = (pFOTA_INFO) pWRAH;
if (pFI->Enable != 1)
{
obm_printf("FOTA Not Enabled\n\r");
return NULL;
}
else
{
pFOTA_Temp1 = malloc(AsrFlagMaxLen);
pFOTA_Temp2 = malloc(AsrFlagMaxLen);
if(pFOTA_Temp1 == NULL || pFOTA_Temp2 == NULL)
return HeapExhaustedError;
memset(pFOTA_Temp1, 0xFF, AsrFlagMaxLen);
memset(pFOTA_Temp2, 0xFF, AsrFlagMaxLen);
pFOTAInfo->FOTA_Addr = pFI->FlashAddr;
pFOTAInfo->FOTA_FBF_Flag = pFI->Magic;
if(pWRAH->Size == 24)
AsrFlagMaxLen = pFI->FlagLen;
Retval = ReadFlash(pFI->FlashAddr, pFOTA_Temp1, AsrFlagLen, BOOT_FLASH);
if (Retval != NoError || pFOTA_Temp1->Header != pFI->Magic)
{
obm_printf("No main ASR Flag, ret: 0x%x, 0x%x\n\r", Retval, pFOTA_Temp1->Header);
free(pFOTA_Temp1); pFOTA_Temp1 = NULL;
}
#if MMC_CODE
Retval = ReadFlash(pFI->FlashAddr + AsrFlagMaxLen/512, pFOTA_Temp2, AsrFlagLen, BOOT_FLASH);
#else
Retval = ReadFlash(pFI->FlashAddr + AsrFlagMaxLen, pFOTA_Temp2, AsrFlagLen, BOOT_FLASH);
#endif
if (Retval != NoError || pFOTA_Temp2->Header != pFI->Magic )
{
obm_printf("No backup ASR Flag, ret: 0x%x, 0x%x\n\r", Retval, pFOTA_Temp2->CRC);
free(pFOTA_Temp2); pFOTA_Temp2 = NULL;
}
if ( pFOTA_Temp2 ) { /* means dual asr flag is enabled */
if (pFOTA_Temp2->Version == ASRFLAG_VERSION_LEGACY ||
pFOTA_Temp2->Version < ASRFLAG_VERSION_DAF)
{
free(pFOTA_Temp2); pFOTA_Temp2 = NULL;
}
if (pFOTA_Temp1 && ( pFOTA_Temp1->Version == ASRFLAG_VERSION_LEGACY ||
pFOTA_Temp1->Version < ASRFLAG_VERSION_DAF) )
{
free(pFOTA_Temp1); pFOTA_Temp1 = NULL;
}
}
if (pFOTA_Temp2 == NULL && pFOTA_Temp1 == NULL) {
obm_printf("Init ASR Flag partition\n\r");
OTA_SetDefault_Config(pFOTA_T, pFI->Magic, AsrFlagMaxLen);
} else {
if(pFOTA_Temp1 == NULL) {
memcpy(pFOTA_T, pFOTA_Temp2, AsrFlagLen);
} else if(pFOTA_Temp2 == NULL) {
memcpy(pFOTA_T, pFOTA_Temp1, AsrFlagLen);
} else {
if (pFOTA_Temp1->Version >= ASRFLAG_VERSION_CRC ||
pFOTA_Temp2->Version >= ASRFLAG_VERSION_CRC)
{
if (ASRFlag_ValidateCRC(pFOTA_Temp1) ) {
free(pFOTA_Temp1); pFOTA_Temp1 = NULL;
}
if (ASRFlag_ValidateCRC(pFOTA_Temp2) ) {
free(pFOTA_Temp2); pFOTA_Temp2 = NULL;
}
if (pFOTA_Temp1 == NULL && pFOTA_Temp2 == NULL) {
obm_printf("ASR Flag is lost, re-init, should never happen\n\r");
OTA_SetDefault_Config(pFOTA_T, pFI->Magic, AsrFlagMaxLen);
goto asr_flag_found;
} else if (pFOTA_Temp1 == NULL) {
memcpy(pFOTA_T, pFOTA_Temp2, AsrFlagLen);
goto asr_flag_found;
} else if (pFOTA_Temp2 == NULL) {
memcpy(pFOTA_T, pFOTA_Temp1, AsrFlagLen);
goto asr_flag_found;
}
}
if(pFOTA_Temp2->RefCounter > pFOTA_Temp1->RefCounter)
memcpy(pFOTA_T, pFOTA_Temp2, AsrFlagLen);
else
memcpy(pFOTA_T, pFOTA_Temp1, AsrFlagLen);
if(pFOTA_Temp1->RefCounter == pFOTA_Temp2->RefCounter)
NeedUpgrade = 0;
}
}
asr_flag_found:
/* There is an old version ASR flag in board */
if (pFOTA_T->Version != ASRFLAG_VERSION) {
/* old way, upgrade here */
pFOTA_T->RefCounter = 0;
pFOTA_T->FlagLen = AsrFlagMaxLen;
NeedUpgrade = 1;
if(pFOTA_T->Version == ASRFLAG_VERSION_LEGACY)
CurVersion = "legacy";
else
CurVersion = HexToSwdObmVersion(pFOTA_T->Version);
obm_printf("Upgrade ASR Flag from %s to ", CurVersion);
obm_printf("%s\n\r", HexToSwdObmVersion(ASRFLAG_VERSION));
pFOTA_T->Version = ASRFLAG_VERSION;
}
pFOTAInfo->InitFlag = INIT_DONE;
serial_set_quiet(!pFOTA_T->ramdump[1]);
if (pFOTA_Temp1) { free(pFOTA_Temp1); pFOTA_Temp1 = NULL; }
if (pFOTA_Temp2) { free(pFOTA_Temp2); pFOTA_Temp2 = NULL; }
UINT_T DDR_PID = GetDDR_PID();
UINT_T Flash_PID = GetFlash_PID();
if(DDR_PID != 0 && pFOTA_T->DDR_ID != DDR_PID) {
pFOTA_T->DDR_ID = DDR_PID;
NeedUpgrade++;
}
if(Flash_PID != 0 && pFOTA_T->Flash_ID != Flash_PID) {
pFOTA_T->Flash_ID = Flash_PID;
NeedUpgrade++;
}
/* InitFlag must be INIT_DONE here, otherwise deed loop */
if(NeedUpgrade) OTA_Save_Config(pTIM_h);
}
}
}
return pFOTA_T;
}
UINT_T OTA_Save_Config(pTIM pTIM_h)
{
UINT_T MainRet = NoError, BackupRet = NoError;
P_FOTA_Info pFOTAInfo = &FOTAInfo;
P_FOTA_Firmware pFOTA_T = OTAGetConfig(pTIM_h);
P_FlashProperties_T pFlashP = GetFlashProperties(BOOT_FLASH);
#if MMC_CODE
UINT_T AsrFlagMaxLen = MAX_ASR_FLAG_SIZE;
#else
UINT_T AsrFlagMaxLen = pFlashP->BlockSize;
#endif
UINT_T AsrFlagLen = sizeof(FOTA_Firmware);
if (!pFOTA_T)
return NotFoundError;
#if MMC_CODE
SetPartition(MMC_SD_USER_PARTITION, BOOT_FLASH);
#endif
if (pFOTA_T->Header != pFOTAInfo->FOTA_FBF_Flag)
{
obm_printf("ASR Flag Header mismatch: 0x%x, 0x%x\n\r",
pFOTA_T->Header, pFOTAInfo->FOTA_FBF_Flag);
return NotFoundError;
}
if(pFOTA_T->RefCounter++ == 0xFFFFFFFF)
pFOTA_T->RefCounter = 0;
ASRFlag_UpdateCRC(pFOTA_T);
AsrFlagMaxLen = pFOTA_T->FlagLen;
MainRet = EraseFlash(pFOTAInfo->FOTA_Addr, AsrFlagLen, BOOT_FLASH);
if (MainRet != NoError)
{
obm_printf("Warning: Erase main ASR Flag error\n\r");
} else {
MainRet = WriteFlash(pFOTAInfo->FOTA_Addr, (UINT_T)pFOTA_T, AsrFlagLen, BOOT_FLASH);
if (MainRet != NoError)
obm_printf("Warning: Write main ASR Flag error\n\r");
}
#if MMC_CODE
/* not need erase for mmc */
#else
BackupRet = EraseFlash(pFOTAInfo->FOTA_Addr + AsrFlagMaxLen, AsrFlagLen, BOOT_FLASH);
#endif
if (BackupRet != NoError)
{
obm_printf("Warning: Erase backup ASR Flag error\n\r");
} else {
#if MMC_CODE
BackupRet = WriteFlash(pFOTAInfo->FOTA_Addr + AsrFlagMaxLen/512, (UINT_T)pFOTA_T, AsrFlagLen, BOOT_FLASH);
#else
BackupRet = WriteFlash(pFOTAInfo->FOTA_Addr + AsrFlagMaxLen, (UINT_T)pFOTA_T, AsrFlagLen, BOOT_FLASH);
#endif
if (BackupRet != NoError)
obm_printf("Warning: Write backup ASR Flag error\n\r");
}
SetUseSpareArea( FALSE, BOOT_FLASH );
UpdateBBT();
#if SPI_CODE
SPINOR_Disable4BytesMode();
#endif
#if OLED_SUPPORT || LED_DISPLAY
Firmware_Upgrade_Done();
#endif
if (MainRet && BackupRet) {
/* Both main and backup ASR flag are not saved */
return ASRFlagSaveError;
}
return NoError;
}
void OTA_SetDefault_Config(P_FOTA_Firmware pFOTA_T, UINT_T Header, UINT_T MaxLen)
{
memset((void *)pFOTA_T, 0x00, sizeof(FOTA_Firmware));
pFOTA_T->nocp[0] = NOCPID;
pFOTA_T->nocp[1] = 0;
pFOTA_T->TrustBootStatus = TB_NO_ERROR;
#if NEZHA701||NEZHA702||FALCON401
/* Set default value of ASR Flags. */
pFOTA_T->Production_Mode_Flag = 1;
#else
pFOTA_T->Production_Mode_Flag = 0;
#endif
/* PIPE mode flag */
#if NEZHA701||NEZHA305
pFOTA_T->pipe[0] = PIPEID;
pFOTA_T->pipe[1] = 1;
pFOTA_T->imsd[0] = IMSDID;
pFOTA_T->imsd[1] = 1;
pFOTA_T->eehP[0] = EEHPID;
pFOTA_T->eehP[1] = 2;
pFOTA_T->ramdump[0] = RAMDUMPID;
pFOTA_T->ramdump[1] = 0;
pFOTA_T->cplog[0] = CPLOGID;
pFOTA_T->cplog[1] = 0;
#elif NEZHA702
pFOTA_T->pipe[0] = PIPEID;
pFOTA_T->pipe[1] = 0;
pFOTA_T->imsd[0] = IMSDID;
pFOTA_T->imsd[1] = 0;
pFOTA_T->eehP[0] = EEHPID;
pFOTA_T->eehP[1] = 2;
pFOTA_T->ramdump[0] = RAMDUMPID;
pFOTA_T->ramdump[1] = 0;
pFOTA_T->cplog[0] = CPLOGID;
pFOTA_T->cplog[1] = 0;
#else
pFOTA_T->pipe[0] = PIPEID;
pFOTA_T->pipe[1] = 0;
// Add by liubin for Open IMSD by default.
pFOTA_T->imsd[0] = IMSDID;
pFOTA_T->imsd[1] = 1;
pFOTA_T->eehP[0] = EEHPID;
pFOTA_T->eehP[1] = 2;
pFOTA_T->ramdump[0] = RAMDUMPID;
pFOTA_T->ramdump[1] = 0;
pFOTA_T->cplog[0] = CPLOGID;
pFOTA_T->cplog[1] = 1;
#endif
/* OBM enum USB port flag */
pFOTA_T->obmdl[0] = OBMDLID;
pFOTA_T->obmdl[1] = OBMNOUSB;
/* OBM download flag */
pFOTA_T->dlflag[0] = DLFLG;
pFOTA_T->dlflag[1] = DLDONE;
pFOTA_T->DDR_ID = GetDDR_PID();
pFOTA_T->Flash_ID = GetFlash_PID();
pFOTA_T->Header = Header;
pFOTA_T->RefCounter = 0;
pFOTA_T->FlagLen = MaxLen;
pFOTA_T->Version = ASRFLAG_VERSION;
return;
}
UINT_T ASRFlag_TrustBootStatus_Update(pTIM pTIM_h, UINT_T para)
{
#if TRUSTED
UINT_T Retval;
P_FOTA_Info pFOTAInfo = &FOTAInfo;
P_FOTA_Firmware pFOTA_T = OTAGetConfig(pTIM_h);
if (!pFOTA_T)
return NotFoundError;
switch(para)
{
case DTIM_PRIMARY:
pFOTA_T->TrustBootStatus = TB_DTIM_PRIMARY_ERROR;
break;
case DTIM_RECOVERY:
pFOTA_T->TrustBootStatus = TB_DTIM_RECOVERY_ERROR;
break;
case DTIM_PPSETTING:
pFOTA_T->TrustBootStatus = TB_DTIM_PPSETTING_ERROR;
break;
case TZSWIDENTIFIER:
pFOTA_T->TrustBootStatus = TB_TOS_ERROR;
break;
case OSLOADERID:
case OSL2ADERID:
pFOTA_T->TrustBootStatus = TB_UBOOT_ERROR;
break;
case SDTIM:
pFOTA_T->TrustBootStatus = TB_SDTIM_ERROR;
break;
default:
pFOTA_T->TrustBootStatus = para;
break;
}
Retval = OTA_Save_Config(pTIM_h);
if (Retval != NoError)
{
obm_printf("OTA_Save_Config: 0x%x\n\r", Retval);
return Retval;
}
if((pFOTA_T->TrustBootStatus != 0) && (pFOTA_T->TrustBootStatus != -1)) {
err_msg("Reboot due to trusted boot error: %d\n\r", pFOTA_T->TrustBootStatus);
do_wdt_reset(); // reset after download as default
//while(1);
}
#endif
return Retval;
}
UINT_T ASRFlag_DLStatus_Update(pTIM pTIM_h, UINT_T dlflag0, UINT_T dlflag1)
{
UINT_T Retval = NoError;
P_FOTA_Firmware pFOTA_T = NULL;
pFOTA_T = OTAGetConfig(pTIM_h);
/* OBM download flag */
if (pFOTA_T) {
pFOTA_T->dlflag[0] = dlflag0;
pFOTA_T->dlflag[1] = dlflag1;
Retval = OTA_Save_Config(pTIM_h);
if (Retval != NoError)
{
obm_printf("%s error\n\r", __FUNCTION__);
}
}
return Retval;
}
INT ASRFlag_InProductionMode(pTIM pTIM_h)
{
P_FOTA_Firmware pFOTA_T = NULL;
pFOTA_T = OTAGetConfig(pTIM_h);
if(pFOTA_T) {
if(pFOTA_T->Production_Mode_Flag == PRODUCT_USB_MODE ||
pFOTA_T->Production_Mode_Flag == PRODUCT_UART_MODE)
return 1;
}
return 0;
}
VOID ASRFlag_Update_DdrFlashId(pTIM pTIM_h, UINT_T DDR_PID, UINT_T Flash_PID)
{
UINT_T Retval = NoError;
P_FOTA_Firmware pFOTA_T = NULL;
if(pFOTA_T->DDR_ID == DDR_PID && pFOTA_T->Flash_ID == Flash_PID)
return;
pFOTA_T = OTAGetConfig(pTIM_h);
if ( pFOTA_T &&
(pFOTA_T->DDR_ID != DDR_PID || pFOTA_T->Flash_ID != Flash_PID) )
{
pFOTA_T->DDR_ID = DDR_PID;
pFOTA_T->Flash_ID = Flash_PID;
Retval = OTA_Save_Config(pTIM_h);
if (Retval != NoError)
{
obm_printf("%s error\n\r", __FUNCTION__);
return;
}
}
return;
}
BOOL ASRFlag_NeedRunDDRT(pTIM pTIM_h)
{
UINT_T Retval = NoError;
P_FOTA_Firmware pFOTA_T = NULL;
pFOTA_T = OTAGetConfig(pTIM_h);
if ( pFOTA_T && pFOTA_T->ddrt_state.bits.test_proc)
{
return TRUE;
}
return FALSE;
}