blob: 46a37decd5d6168ec15d397ebc42c7b4adc0e9d5 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#include "asr_flag.h"
2#include "fota.h"
3#include "obm2osl.h"
4#include "serial.h"
5#include "Errors.h"
6#include "print.h"
7
8extern UINT_T UUID[2];
9extern UINT8_T FlashInitDone;
10extern OBM2OSL *pOBM2OSL_h;
11FOTA_Info FOTAInfo;
12FOTA_Firmware FotaFirmware;
13
14static void OTA_SetDefault_Config(P_FOTA_Firmware pFOTA_T, UINT_T Header, UINT_T MaxLen);
15
16VOID ASRFlag_ParseCfgToOBM2OSLO(pTIM pTIM_h)
17{
18 P_FOTA_Firmware pFOTA_T = OTAGetConfig(pTIM_h);
19
20 if(pFOTA_T == NULL){
21 obm_printf("ASR Flag not found in %s\n\r", __FUNCTION__);
22 return;
23 }
24
25 if(pFOTA_T->eehP[0] == EEHPID)
26 {
27 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->eehP[0];
28 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->eehP[1];
29 pOBM2OSL_h->info.cfg_numbers++;
30 }
31
32 if(pFOTA_T->cpsr[0] == CPSRID)
33 {
34 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->cpsr[0];
35 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->cpsr[1];
36 pOBM2OSL_h->info.cfg_numbers++;
37 }
38
39 if(pFOTA_T->hawk[0] == HAWKID)
40 {
41 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->hawk[0];
42 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->hawk[1];
43 pOBM2OSL_h->info.cfg_numbers++;
44 }
45
46 if(pFOTA_T->imsd[0] == IMSDID)
47 {
48 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->imsd[0];
49 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->imsd[1];
50 pOBM2OSL_h->info.cfg_numbers++;
51 }
52
53 if((pFOTA_T->Production_Mode_Flag >= 0)&&
54 (pFOTA_T->Production_Mode_Flag <= 2))
55 {
56 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = PRODID;
57 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->Production_Mode_Flag;
58 pOBM2OSL_h->info.cfg_numbers++;
59 }
60
61 if(pFOTA_T->pipe[0] == PIPEID)
62 {
63 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->pipe[0];
64 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->pipe[1];
65 pOBM2OSL_h->info.cfg_numbers++;
66 }
67
68 if(pFOTA_T->fast[0] == FASTID)
69 {
70 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->fast[0];
71 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->fast[1];
72 pOBM2OSL_h->info.cfg_numbers++;
73 }
74
75 if(pFOTA_T->apmf[0] == APMFID)
76 {
77 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->apmf[0];
78 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->apmf[1];
79 pOBM2OSL_h->info.cfg_numbers++;
80 }
81
82 if(pFOTA_T->pid[0] == PIDID)
83 {
84 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->pid[0];
85 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->pid[1];
86 pOBM2OSL_h->info.cfg_numbers++;
87 }
88
89 if(pFOTA_T->vid[0] == VIDID)
90 {
91 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->vid[0];
92 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->vid[1];
93 pOBM2OSL_h->info.cfg_numbers++;
94 }
95
96 if(UUID[0] != 0)
97 {
98 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = UUID0;
99 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = UUID[0];
100 pOBM2OSL_h->info.cfg_numbers++;
101 }
102
103 if(UUID[1] != 0)
104 {
105 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = UUID1;
106 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = UUID[1];
107 pOBM2OSL_h->info.cfg_numbers++;
108 }
109
110 if(pFOTA_T->ramdump[0] == RAMDUMPID)
111 {
112 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->ramdump[0];
113 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->ramdump[1];
114 pOBM2OSL_h->info.cfg_numbers++;
115 }
116
117 if(pFOTA_T->nocp[0] == NOCPID)
118 {
119 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->nocp[0];
120 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->nocp[1];
121 pOBM2OSL_h->info.cfg_numbers++;
122 }
123
124 if(pFOTA_T->cplog[0] == CPLOGID)
125 {
126 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = pFOTA_T->cplog[0];
127 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = pFOTA_T->cplog[1];
128 pOBM2OSL_h->info.cfg_numbers++;
129 }
130
131#if CONFIG_SAVE_LOG_TO_MEM
132 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_id = BOOT_LOG_MAGIC;
133 pOBM2OSL_h->info.cfg_info[pOBM2OSL_h->info.cfg_numbers].cfg_value = CONFIG_BOOT_LOG_ADDR;
134 pOBM2OSL_h->info.cfg_numbers++;
135#endif
136
137 return;
138}
139
140VOID ASRFlag_UpdateCRC(P_FOTA_Firmware pFOTA_T)
141{
142 UINT_T CrcLen, CrcVal;
143 CrcLen = sizeof(FOTA_Firmware) - 4; /* 4 bytes is CRC itself */
144
145 CrcVal = malbrain_crc32(0, pFOTA_T, CrcLen);
146
147 pFOTA_T->CRC = CrcVal;
148
149 return;
150}
151
152INT_T ASRFlag_ValidateCRC(P_FOTA_Firmware pFOTA_T)
153{
154 UINT_T CrcLen, CrcVal;
155 CrcLen = sizeof(FOTA_Firmware) - 4; /* 4 bytes is CRC itself */
156
157 CrcVal = malbrain_crc32(0, pFOTA_T, CrcLen);
158
159 if(pFOTA_T->CRC != CrcVal){
160 obm_printf("ASR Flag CRC mismatch: 0x%x 0x%x 0x%x\n\r", CrcVal, pFOTA_T->CRC, pFOTA_T->Header);
161 return 1;
162 }
163
164 return 0;
165}
166
167INT_T ASRFlag_IsInvalid(P_FOTA_Firmware pFOTA_T, pFOTA_INFO pFI)
168{
169 if(pFOTA_T->Header != pFI->Magic)
170 return 1;
171
172 if(ASRFlag_ValidateCRC(pFOTA_T))
173 return 1;
174
175 return 0;
176}
177
178P_FOTA_Firmware OTAGetConfig(pTIM pTIM_h)
179{
180 UINT_T Retval = GeneralError;
181 P_FOTA_Firmware pFOTA_T = &FotaFirmware;
182 P_FOTA_Firmware pFOTA_Temp1 = NULL;
183 P_FOTA_Firmware pFOTA_Temp2 = NULL;
184 pWTP_RESERVED_AREA_HEADER pWRAH = NULL;
185 pFOTA_INFO pFI = NULL;
186 P_FOTA_Info pFOTAInfo = &FOTAInfo;
187 P_FlashProperties_T pFlashP = GetFlashProperties(BOOT_FLASH);
188 UINT_T AsrFlagLen = sizeof(FOTA_Firmware);
189#if MMC_CODE
190 UINT_T AsrFlagMaxLen = MAX_ASR_FLAG_SIZE;
191#else
192 UINT_T AsrFlagMaxLen = pFlashP->BlockSize;
193#endif
194 UINT_T NeedUpgrade = 1;
195 CHAR *CurVersion = NULL;
196
197#if MMC_CODE
198 SetPartition(MMC_SD_USER_PARTITION, BOOT_FLASH);
199#endif
200
201 if((pFOTAInfo->InitFlag != INIT_DONE) && FlashInitDone)
202 {
203 pWRAH = FindPackageInReserved(&Retval, pTIM_h, FOTAINFOID);
204 if ((pWRAH == NULL) || (Retval != NoError))
205 {
206 obm_printf("No FOTA package found\n\r");
207 return NULL;
208 }
209 else
210 {
211 pFI = (pFOTA_INFO) pWRAH;
212 if (pFI->Enable != 1)
213 {
214 obm_printf("FOTA Not Enabled\n\r");
215 return NULL;
216 }
217 else
218 {
219 pFOTA_Temp1 = malloc(AsrFlagMaxLen);
220 pFOTA_Temp2 = malloc(AsrFlagMaxLen);
221 if(pFOTA_Temp1 == NULL || pFOTA_Temp2 == NULL)
222 return HeapExhaustedError;
223 memset(pFOTA_Temp1, 0xFF, AsrFlagMaxLen);
224 memset(pFOTA_Temp2, 0xFF, AsrFlagMaxLen);
225
226 pFOTAInfo->FOTA_Addr = pFI->FlashAddr;
227 pFOTAInfo->FOTA_FBF_Flag = pFI->Magic;
228 if(pWRAH->Size == 24)
229 AsrFlagMaxLen = pFI->FlagLen;
230
231 Retval = ReadFlash(pFI->FlashAddr, pFOTA_Temp1, AsrFlagLen, BOOT_FLASH);
232 if (Retval != NoError || pFOTA_Temp1->Header != pFI->Magic)
233 {
234 obm_printf("No main ASR Flag, ret: 0x%x, 0x%x\n\r", Retval, pFOTA_Temp1->Header);
235 free(pFOTA_Temp1); pFOTA_Temp1 = NULL;
236 }
237
238#if MMC_CODE
239 Retval = ReadFlash(pFI->FlashAddr + AsrFlagMaxLen/512, pFOTA_Temp2, AsrFlagLen, BOOT_FLASH);
240#else
241 Retval = ReadFlash(pFI->FlashAddr + AsrFlagMaxLen, pFOTA_Temp2, AsrFlagLen, BOOT_FLASH);
242#endif
243 if (Retval != NoError || pFOTA_Temp2->Header != pFI->Magic )
244 {
245 obm_printf("No backup ASR Flag, ret: 0x%x, 0x%x\n\r", Retval, pFOTA_Temp2->CRC);
246 free(pFOTA_Temp2); pFOTA_Temp2 = NULL;
247 }
248
249 if ( pFOTA_Temp2 ) { /* means dual asr flag is enabled */
250 if (pFOTA_Temp2->Version == ASRFLAG_VERSION_LEGACY ||
251 pFOTA_Temp2->Version < ASRFLAG_VERSION_DAF)
252 {
253 free(pFOTA_Temp2); pFOTA_Temp2 = NULL;
254 }
255
256 if (pFOTA_Temp1 && ( pFOTA_Temp1->Version == ASRFLAG_VERSION_LEGACY ||
257 pFOTA_Temp1->Version < ASRFLAG_VERSION_DAF) )
258 {
259 free(pFOTA_Temp1); pFOTA_Temp1 = NULL;
260 }
261 }
262
263 if (pFOTA_Temp2 == NULL && pFOTA_Temp1 == NULL) {
264 obm_printf("Init ASR Flag partition\n\r");
265 OTA_SetDefault_Config(pFOTA_T, pFI->Magic, AsrFlagMaxLen);
266 } else {
267 if(pFOTA_Temp1 == NULL) {
268 memcpy(pFOTA_T, pFOTA_Temp2, AsrFlagLen);
269 } else if(pFOTA_Temp2 == NULL) {
270 memcpy(pFOTA_T, pFOTA_Temp1, AsrFlagLen);
271 } else {
272 if (pFOTA_Temp1->Version >= ASRFLAG_VERSION_CRC ||
273 pFOTA_Temp2->Version >= ASRFLAG_VERSION_CRC)
274 {
275 if (ASRFlag_ValidateCRC(pFOTA_Temp1) ) {
276 free(pFOTA_Temp1); pFOTA_Temp1 = NULL;
277 }
278
279 if (ASRFlag_ValidateCRC(pFOTA_Temp2) ) {
280 free(pFOTA_Temp2); pFOTA_Temp2 = NULL;
281 }
282
283 if (pFOTA_Temp1 == NULL && pFOTA_Temp2 == NULL) {
284 obm_printf("ASR Flag is lost, re-init, should never happen\n\r");
285 OTA_SetDefault_Config(pFOTA_T, pFI->Magic, AsrFlagMaxLen);
286 goto asr_flag_found;
287 } else if (pFOTA_Temp1 == NULL) {
288 memcpy(pFOTA_T, pFOTA_Temp2, AsrFlagLen);
289 goto asr_flag_found;
290 } else if (pFOTA_Temp2 == NULL) {
291 memcpy(pFOTA_T, pFOTA_Temp1, AsrFlagLen);
292 goto asr_flag_found;
293 }
294 }
295
296 if(pFOTA_Temp2->RefCounter > pFOTA_Temp1->RefCounter)
297 memcpy(pFOTA_T, pFOTA_Temp2, AsrFlagLen);
298 else
299 memcpy(pFOTA_T, pFOTA_Temp1, AsrFlagLen);
300
301 if(pFOTA_Temp1->RefCounter == pFOTA_Temp2->RefCounter)
302 NeedUpgrade = 0;
303 }
304 }
305
306 asr_flag_found:
307 /* There is an old version ASR flag in board */
308 if (pFOTA_T->Version != ASRFLAG_VERSION) {
309 /* old way, upgrade here */
310 pFOTA_T->RefCounter = 0;
311 pFOTA_T->FlagLen = AsrFlagMaxLen;
312 NeedUpgrade = 1;
313 if(pFOTA_T->Version == ASRFLAG_VERSION_LEGACY)
314 CurVersion = "legacy";
315 else
316 CurVersion = HexToSwdObmVersion(pFOTA_T->Version);
317 obm_printf("Upgrade ASR Flag from %s to ", CurVersion);
318 obm_printf("%s\n\r", HexToSwdObmVersion(ASRFLAG_VERSION));
319 pFOTA_T->Version = ASRFLAG_VERSION;
320 }
321
322 pFOTAInfo->InitFlag = INIT_DONE;
323 serial_set_quiet(!pFOTA_T->ramdump[1]);
324
325 if (pFOTA_Temp1) { free(pFOTA_Temp1); pFOTA_Temp1 = NULL; }
326 if (pFOTA_Temp2) { free(pFOTA_Temp2); pFOTA_Temp2 = NULL; }
327
328 UINT_T DDR_PID = GetDDR_PID();
329 UINT_T Flash_PID = GetFlash_PID();
330 if(DDR_PID != 0 && pFOTA_T->DDR_ID != DDR_PID) {
331 pFOTA_T->DDR_ID = DDR_PID;
332 NeedUpgrade++;
333 }
334
335 if(Flash_PID != 0 && pFOTA_T->Flash_ID != Flash_PID) {
336 pFOTA_T->Flash_ID = Flash_PID;
337 NeedUpgrade++;
338 }
339
340 /* InitFlag must be INIT_DONE here, otherwise deed loop */
341 if(NeedUpgrade) OTA_Save_Config(pTIM_h);
342 }
343 }
344 }
345
346 return pFOTA_T;
347}
348
349UINT_T OTA_Save_Config(pTIM pTIM_h)
350{
351 UINT_T MainRet = NoError, BackupRet = NoError;
352 P_FOTA_Info pFOTAInfo = &FOTAInfo;
353 P_FOTA_Firmware pFOTA_T = OTAGetConfig(pTIM_h);
354 P_FlashProperties_T pFlashP = GetFlashProperties(BOOT_FLASH);
355#if MMC_CODE
356 UINT_T AsrFlagMaxLen = MAX_ASR_FLAG_SIZE;
357#else
358 UINT_T AsrFlagMaxLen = pFlashP->BlockSize;
359#endif
360 UINT_T AsrFlagLen = sizeof(FOTA_Firmware);
361
362 if (!pFOTA_T)
363 return NotFoundError;
364
365#if MMC_CODE
366 SetPartition(MMC_SD_USER_PARTITION, BOOT_FLASH);
367#endif
368
369 if (pFOTA_T->Header != pFOTAInfo->FOTA_FBF_Flag)
370 {
371 obm_printf("ASR Flag Header mismatch: 0x%x, 0x%x\n\r",
372 pFOTA_T->Header, pFOTAInfo->FOTA_FBF_Flag);
373 return NotFoundError;
374 }
375
376 if(pFOTA_T->RefCounter++ == 0xFFFFFFFF)
377 pFOTA_T->RefCounter = 0;
378
379 ASRFlag_UpdateCRC(pFOTA_T);
380
381 AsrFlagMaxLen = pFOTA_T->FlagLen;
382
383 MainRet = EraseFlash(pFOTAInfo->FOTA_Addr, AsrFlagLen, BOOT_FLASH);
384 if (MainRet != NoError)
385 {
386 obm_printf("Warning: Erase main ASR Flag error\n\r");
387 } else {
388 MainRet = WriteFlash(pFOTAInfo->FOTA_Addr, (UINT_T)pFOTA_T, AsrFlagLen, BOOT_FLASH);
389 if (MainRet != NoError)
390 obm_printf("Warning: Write main ASR Flag error\n\r");
391 }
392
393#if MMC_CODE
394 /* not need erase for mmc */
395#else
396 BackupRet = EraseFlash(pFOTAInfo->FOTA_Addr + AsrFlagMaxLen, AsrFlagLen, BOOT_FLASH);
397#endif
398 if (BackupRet != NoError)
399 {
400 obm_printf("Warning: Erase backup ASR Flag error\n\r");
401 } else {
402#if MMC_CODE
403 BackupRet = WriteFlash(pFOTAInfo->FOTA_Addr + AsrFlagMaxLen/512, (UINT_T)pFOTA_T, AsrFlagLen, BOOT_FLASH);
404#else
405 BackupRet = WriteFlash(pFOTAInfo->FOTA_Addr + AsrFlagMaxLen, (UINT_T)pFOTA_T, AsrFlagLen, BOOT_FLASH);
406#endif
407 if (BackupRet != NoError)
408 obm_printf("Warning: Write backup ASR Flag error\n\r");
409 }
410
411 SetUseSpareArea( FALSE, BOOT_FLASH );
412 UpdateBBT();
413
414 #if SPI_CODE
415 SPINOR_Disable4BytesMode();
416 #endif
417
418 #if OLED_SUPPORT || LED_DISPLAY
419 Firmware_Upgrade_Done();
420 #endif
421
422 if (MainRet && BackupRet) {
423 /* Both main and backup ASR flag are not saved */
424 return ASRFlagSaveError;
425 }
426
427 return NoError;
428}
429
430
431void OTA_SetDefault_Config(P_FOTA_Firmware pFOTA_T, UINT_T Header, UINT_T MaxLen)
432{
433
434 memset((void *)pFOTA_T, 0x00, sizeof(FOTA_Firmware));
435
436 pFOTA_T->nocp[0] = NOCPID;
437 pFOTA_T->nocp[1] = 0;
438 pFOTA_T->TrustBootStatus = TB_NO_ERROR;
439
440#if NEZHA701||NEZHA702||FALCON401
441 /* Set default value of ASR Flags. */
442 pFOTA_T->Production_Mode_Flag = 1;
443#else
444 pFOTA_T->Production_Mode_Flag = 0;
445#endif
446
447 /* PIPE mode flag */
448#if NEZHA701||NEZHA305
449 pFOTA_T->pipe[0] = PIPEID;
450 pFOTA_T->pipe[1] = 1;
451
452 pFOTA_T->imsd[0] = IMSDID;
453 pFOTA_T->imsd[1] = 1;
454
455 pFOTA_T->eehP[0] = EEHPID;
456 pFOTA_T->eehP[1] = 2;
457
458 pFOTA_T->ramdump[0] = RAMDUMPID;
459 pFOTA_T->ramdump[1] = 0;
460
461 pFOTA_T->cplog[0] = CPLOGID;
462 pFOTA_T->cplog[1] = 0;
463#elif NEZHA702
464 pFOTA_T->pipe[0] = PIPEID;
465 pFOTA_T->pipe[1] = 0;
466
467 pFOTA_T->imsd[0] = IMSDID;
468 pFOTA_T->imsd[1] = 0;
469
470 pFOTA_T->eehP[0] = EEHPID;
471 pFOTA_T->eehP[1] = 2;
472
473 pFOTA_T->ramdump[0] = RAMDUMPID;
474 pFOTA_T->ramdump[1] = 0;
475
476 pFOTA_T->cplog[0] = CPLOGID;
477 pFOTA_T->cplog[1] = 0;
478#else
479 pFOTA_T->pipe[0] = PIPEID;
480 pFOTA_T->pipe[1] = 0;
481
482 pFOTA_T->imsd[0] = IMSDID;
483 pFOTA_T->imsd[1] = 0;
484
485 pFOTA_T->eehP[0] = EEHPID;
486 pFOTA_T->eehP[1] = 2;
487
488 pFOTA_T->ramdump[0] = RAMDUMPID;
489 pFOTA_T->ramdump[1] = 1;
490
491 pFOTA_T->cplog[0] = CPLOGID;
492 pFOTA_T->cplog[1] = 1;
493#endif
494
495 /* OBM enum USB port flag */
496 pFOTA_T->obmdl[0] = OBMDLID;
497 pFOTA_T->obmdl[1] = OBMNOUSB;
498
499 /* OBM download flag */
500 pFOTA_T->dlflag[0] = DLFLG;
501 pFOTA_T->dlflag[1] = DLDONE;
502
503 pFOTA_T->DDR_ID = GetDDR_PID();
504 pFOTA_T->Flash_ID = GetFlash_PID();
505
506 pFOTA_T->Header = Header;
507 pFOTA_T->RefCounter = 0;
508 pFOTA_T->FlagLen = MaxLen;
509 pFOTA_T->Version = ASRFLAG_VERSION;
510
511 return;
512}
513
514UINT_T ASRFlag_TrustBootStatus_Update(pTIM pTIM_h, UINT_T para)
515{
516 #if TRUSTED
517 UINT_T Retval;
518 P_FOTA_Info pFOTAInfo = &FOTAInfo;
519 P_FOTA_Firmware pFOTA_T = OTAGetConfig(pTIM_h);
520
521 if (!pFOTA_T)
522 return NotFoundError;
523
524 switch(para)
525 {
526 case DTIM_PRIMARY:
527 pFOTA_T->TrustBootStatus = TB_DTIM_PRIMARY_ERROR;
528 break;
529 case DTIM_RECOVERY:
530 pFOTA_T->TrustBootStatus = TB_DTIM_RECOVERY_ERROR;
531 break;
532 case DTIM_PPSETTING:
533 pFOTA_T->TrustBootStatus = TB_DTIM_PPSETTING_ERROR;
534 break;
535 case TZSWIDENTIFIER:
536 pFOTA_T->TrustBootStatus = TB_TOS_ERROR;
537 break;
538 case OSLOADERID:
539 case OSL2ADERID:
540 pFOTA_T->TrustBootStatus = TB_UBOOT_ERROR;
541 break;
542 case SDTIM:
543 pFOTA_T->TrustBootStatus = TB_SDTIM_ERROR;
544 break;
545 default:
546 pFOTA_T->TrustBootStatus = para;
547 break;
548 }
549
550 Retval = OTA_Save_Config(pTIM_h);
551 if (Retval != NoError)
552 {
553 obm_printf("OTA_Save_Config: 0x%x\n\r", Retval);
554 return Retval;
555 }
556
557 if((pFOTA_T->TrustBootStatus != 0) && (pFOTA_T->TrustBootStatus != -1)) {
558 err_msg("Reboot due to trusted boot error: %d\n\r", pFOTA_T->TrustBootStatus);
559 do_wdt_reset(); // reset after download as default
560 //while(1);
561 }
562 #endif
563
564 return Retval;
565}
566
567UINT_T ASRFlag_DLStatus_Update(pTIM pTIM_h, UINT_T dlflag0, UINT_T dlflag1)
568{
569 UINT_T Retval = NoError;
570 P_FOTA_Firmware pFOTA_T = NULL;
571
572 pFOTA_T = OTAGetConfig(pTIM_h);
573
574 /* OBM download flag */
575 if (pFOTA_T) {
576 pFOTA_T->dlflag[0] = dlflag0;
577 pFOTA_T->dlflag[1] = dlflag1;
578
579 Retval = OTA_Save_Config(pTIM_h);
580 if (Retval != NoError)
581 {
582 obm_printf("%s error\n\r", __FUNCTION__);
583 }
584 }
585
586 return Retval;
587}
588
589INT ASRFlag_InProductionMode(pTIM pTIM_h)
590{
591 P_FOTA_Firmware pFOTA_T = NULL;
592 pFOTA_T = OTAGetConfig(pTIM_h);
593 if(pFOTA_T) {
594 if(pFOTA_T->Production_Mode_Flag == PRODUCT_USB_MODE ||
595 pFOTA_T->Production_Mode_Flag == PRODUCT_UART_MODE)
596
597 return 1;
598 }
599
600 return 0;
601}
602
603VOID ASRFlag_Update_DdrFlashId(pTIM pTIM_h, UINT_T DDR_PID, UINT_T Flash_PID)
604{
605 UINT_T Retval = NoError;
606 P_FOTA_Firmware pFOTA_T = NULL;
607
608 if(pFOTA_T->DDR_ID == DDR_PID && pFOTA_T->Flash_ID == Flash_PID)
609 return;
610
611 pFOTA_T = OTAGetConfig(pTIM_h);
612
613 if ( pFOTA_T &&
614 (pFOTA_T->DDR_ID != DDR_PID || pFOTA_T->Flash_ID != Flash_PID) )
615 {
616 pFOTA_T->DDR_ID = DDR_PID;
617 pFOTA_T->Flash_ID = Flash_PID;
618
619 Retval = OTA_Save_Config(pTIM_h);
620 if (Retval != NoError)
621 {
622 obm_printf("%s error\n\r", __FUNCTION__);
623 return;
624 }
625 }
626
627 return;
628}
629
630BOOL ASRFlag_NeedRunDDRT(pTIM pTIM_h)
631{
632 UINT_T Retval = NoError;
633 P_FOTA_Firmware pFOTA_T = NULL;
634
635 pFOTA_T = OTAGetConfig(pTIM_h);
636
637 if ( pFOTA_T && pFOTA_T->ddrt_state.bits.test_proc)
638 {
639 return TRUE;
640
641 }
642
643 return FALSE;
644}