blob: e7a8df7615ed250a2ebca5e5f92d32488245d540 [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;
b.liu7e9a7512025-04-18 11:42:39 +0800481
482 // Add by liubin for Open IMSD by default.
b.liue9582032025-04-17 19:18:16 +0800483 pFOTA_T->imsd[0] = IMSDID;
b.liu7e9a7512025-04-18 11:42:39 +0800484 pFOTA_T->imsd[1] = 1;
b.liue9582032025-04-17 19:18:16 +0800485
486 pFOTA_T->eehP[0] = EEHPID;
487 pFOTA_T->eehP[1] = 2;
488
489 pFOTA_T->ramdump[0] = RAMDUMPID;
hong.liufa3dc0a2025-06-30 17:30:59 +0800490 pFOTA_T->ramdump[1] = 0;
b.liue9582032025-04-17 19:18:16 +0800491
492 pFOTA_T->cplog[0] = CPLOGID;
493 pFOTA_T->cplog[1] = 1;
494#endif
495
496 /* OBM enum USB port flag */
497 pFOTA_T->obmdl[0] = OBMDLID;
498 pFOTA_T->obmdl[1] = OBMNOUSB;
499
500 /* OBM download flag */
501 pFOTA_T->dlflag[0] = DLFLG;
502 pFOTA_T->dlflag[1] = DLDONE;
503
504 pFOTA_T->DDR_ID = GetDDR_PID();
505 pFOTA_T->Flash_ID = GetFlash_PID();
506
507 pFOTA_T->Header = Header;
508 pFOTA_T->RefCounter = 0;
509 pFOTA_T->FlagLen = MaxLen;
510 pFOTA_T->Version = ASRFLAG_VERSION;
511
512 return;
513}
514
515UINT_T ASRFlag_TrustBootStatus_Update(pTIM pTIM_h, UINT_T para)
516{
517 #if TRUSTED
518 UINT_T Retval;
519 P_FOTA_Info pFOTAInfo = &FOTAInfo;
520 P_FOTA_Firmware pFOTA_T = OTAGetConfig(pTIM_h);
521
522 if (!pFOTA_T)
523 return NotFoundError;
524
525 switch(para)
526 {
527 case DTIM_PRIMARY:
528 pFOTA_T->TrustBootStatus = TB_DTIM_PRIMARY_ERROR;
529 break;
530 case DTIM_RECOVERY:
531 pFOTA_T->TrustBootStatus = TB_DTIM_RECOVERY_ERROR;
532 break;
533 case DTIM_PPSETTING:
534 pFOTA_T->TrustBootStatus = TB_DTIM_PPSETTING_ERROR;
535 break;
536 case TZSWIDENTIFIER:
537 pFOTA_T->TrustBootStatus = TB_TOS_ERROR;
538 break;
539 case OSLOADERID:
540 case OSL2ADERID:
541 pFOTA_T->TrustBootStatus = TB_UBOOT_ERROR;
542 break;
543 case SDTIM:
544 pFOTA_T->TrustBootStatus = TB_SDTIM_ERROR;
545 break;
546 default:
547 pFOTA_T->TrustBootStatus = para;
548 break;
549 }
550
551 Retval = OTA_Save_Config(pTIM_h);
552 if (Retval != NoError)
553 {
554 obm_printf("OTA_Save_Config: 0x%x\n\r", Retval);
555 return Retval;
556 }
557
558 if((pFOTA_T->TrustBootStatus != 0) && (pFOTA_T->TrustBootStatus != -1)) {
559 err_msg("Reboot due to trusted boot error: %d\n\r", pFOTA_T->TrustBootStatus);
560 do_wdt_reset(); // reset after download as default
561 //while(1);
562 }
563 #endif
564
565 return Retval;
566}
567
568UINT_T ASRFlag_DLStatus_Update(pTIM pTIM_h, UINT_T dlflag0, UINT_T dlflag1)
569{
570 UINT_T Retval = NoError;
571 P_FOTA_Firmware pFOTA_T = NULL;
572
573 pFOTA_T = OTAGetConfig(pTIM_h);
574
575 /* OBM download flag */
576 if (pFOTA_T) {
577 pFOTA_T->dlflag[0] = dlflag0;
578 pFOTA_T->dlflag[1] = dlflag1;
579
580 Retval = OTA_Save_Config(pTIM_h);
581 if (Retval != NoError)
582 {
583 obm_printf("%s error\n\r", __FUNCTION__);
584 }
585 }
586
587 return Retval;
588}
589
590INT ASRFlag_InProductionMode(pTIM pTIM_h)
591{
592 P_FOTA_Firmware pFOTA_T = NULL;
593 pFOTA_T = OTAGetConfig(pTIM_h);
594 if(pFOTA_T) {
595 if(pFOTA_T->Production_Mode_Flag == PRODUCT_USB_MODE ||
596 pFOTA_T->Production_Mode_Flag == PRODUCT_UART_MODE)
597
598 return 1;
599 }
600
601 return 0;
602}
603
604VOID ASRFlag_Update_DdrFlashId(pTIM pTIM_h, UINT_T DDR_PID, UINT_T Flash_PID)
605{
606 UINT_T Retval = NoError;
607 P_FOTA_Firmware pFOTA_T = NULL;
608
609 if(pFOTA_T->DDR_ID == DDR_PID && pFOTA_T->Flash_ID == Flash_PID)
610 return;
611
612 pFOTA_T = OTAGetConfig(pTIM_h);
613
614 if ( pFOTA_T &&
615 (pFOTA_T->DDR_ID != DDR_PID || pFOTA_T->Flash_ID != Flash_PID) )
616 {
617 pFOTA_T->DDR_ID = DDR_PID;
618 pFOTA_T->Flash_ID = Flash_PID;
619
620 Retval = OTA_Save_Config(pTIM_h);
621 if (Retval != NoError)
622 {
623 obm_printf("%s error\n\r", __FUNCTION__);
624 return;
625 }
626 }
627
628 return;
629}
630
631BOOL ASRFlag_NeedRunDDRT(pTIM pTIM_h)
632{
633 UINT_T Retval = NoError;
634 P_FOTA_Firmware pFOTA_T = NULL;
635
636 pFOTA_T = OTAGetConfig(pTIM_h);
637
638 if ( pFOTA_T && pFOTA_T->ddrt_state.bits.test_proc)
639 {
640 return TRUE;
641
642 }
643
644 return FALSE;
hong.liufa3dc0a2025-06-30 17:30:59 +0800645}