ASR_BASE
Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/marvell/obm/Common/Misc/asr_flag.c b/marvell/obm/Common/Misc/asr_flag.c
new file mode 100644
index 0000000..46a37de
--- /dev/null
+++ b/marvell/obm/Common/Misc/asr_flag.c
@@ -0,0 +1,644 @@
+#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;
+
+ 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] = 1;
+
+ 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;
+}
\ No newline at end of file