diff options
Diffstat (limited to 'Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c')
-rw-r--r-- | Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c | 179 |
1 files changed, 141 insertions, 38 deletions
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c index 9e0d28c75..a96a27bc5 100644 --- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c +++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_MeshLightingPRFNode/STM32_WPAN/app/appli_nvm.c @@ -6,7 +6,7 @@ ****************************************************************************** * @attention * - * <h2><center>© Copyright (c) 2019 STMicroelectronics. + * <h2><center>© Copyright (c) 2020 STMicroelectronics. * All rights reserved.</center></h2> * * This software component is licensed by ST under Ultimate Liberty license @@ -77,6 +77,8 @@ extern const void* appNvmBase; #define FLASH_EMPTY_SIGNATURE 0xFFFFFFFF +#define RADIO_OFF_DELAY 1000 + /* Private variables ---------------------------------------------------------*/ typedef struct @@ -88,6 +90,7 @@ typedef struct /* ALIGN(4) */ __attribute__((aligned(4))) APPLI_NVM_REQS AppliNvm_Reqs; +MOBLEUINT16 StopRadioInProgress; MOBLE_RESULT AppliNvm_EraseRestoreResvNvm(void); MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex, @@ -95,7 +98,8 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex, MOBLEUINT32 totalSubPage, MOBLEUINT32 nvmBaseOffset); MOBLE_RESULT AppliNvm_MarkSubpageInvalid(void); -MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size); +MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, + void const *buf, MOBLEUINT32 size); #if 0 /** @@ -133,7 +137,9 @@ MOBLE_RESULT AppliNvm_FlashErase(uint16_t PageNumber) * @param Data: word to write * @retval MOBLE_RESULT_SUCCESS on success */ -MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size) +MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, + void const *buf, + MOBLEUINT32 size) { MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; @@ -159,7 +165,10 @@ MOBLE_RESULT AppliNvm_FlashProgram(MOBLEUINT32 offset, void const *buf, MOBLEUIN } else { - result = PalNvmWrite(APP_NVM_BASE, offset, buf, size); + result = PalNvmWrite(APP_NVM_BASE, + offset, + buf, + size); } return result; @@ -296,8 +305,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void) /* Load model data copy from nvm */ memcpy((void*)AppliNvm_Reqs.modelData, - (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx) + APP_NVM_GENERIC_MODEL_OFFSET), - APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE); + (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET), + APP_NVM_MODELDATA_PER_ELEMENT_SIZE); result = AppliNvm_MarkSubpageInvalid(); @@ -341,7 +350,8 @@ MOBLE_RESULT AppliNvm_FactorySettingReset(void) * @param model state buff size * @retval MOBLE_RESULT_SUCCESS on success */ -MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size) +MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, + uint16_t size) { MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; /* if save model state not defined, return MOBLE_RESULT_FAIL */ @@ -354,7 +364,9 @@ MOBLE_RESULT AppliNvm_SaveModelState(uint8_t* state, uint8_t size) } else { - memcpy(AppliNvm_Reqs.modelData, state, size); + memcpy(AppliNvm_Reqs.modelData, + state, + size); AppliNvm_Reqs.writeReq = MOBLE_TRUE; AppliNvm_Reqs.erasePageReq = MOBLE_FALSE; @@ -379,13 +391,13 @@ MOBLE_RESULT AppliNvm_ClearModelState(void) #if (SAVE_MODEL_STATE_NVM == 1) MOBLEUINT8 subPageTemp[APP_NVM_SUBPAGE_SIZE]; MOBLEINT16 subPageIdx; - MOBLEUINT8 clearBuff[APP_NVM_GENERIC_MODEL_SIZE+APP_NVM_LIGHT_MODEL_SIZE] = {0}; + MOBLEUINT8 clearBuff[APP_NVM_MODELDATA_PER_ELEMENT_SIZE] = {0}; MOBLEUINT32 valid = 0; result = AppliNvm_FindFirstEmptyPage(&subPageIdx, APP_NVM_SUBPAGE_SIZE, APP_NVM_MAX_SUBPAGE, - (APP_NVM_BASE+APP_NVM_RESERVED_SIZE)); + (APP_NVM_BASE+APP_NVM_RESERVED_SIZE)); if (MOBLE_FAILED(result)) { @@ -434,7 +446,8 @@ MOBLE_RESULT AppliNvm_ClearModelState(void) * @param model state buff size * @retval MOBLE_RESULT_SUCCESS on success */ -MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size) +MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], + uint16_t* size) { #if (SAVE_MODEL_STATE_NVM == 1) MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; @@ -463,8 +476,10 @@ MOBLE_RESULT AppliNvm_LoadModelState(uint8_t state[], uint8_t* size) memcpy((void*)AppliNvm_Reqs.modelData, (void*)(APP_NVM_BASE + APP_NVM_SUBPAGE_OFFSET(currSubPageIdx-1) + APP_NVM_GENERIC_MODEL_OFFSET), APP_NVM_GENERIC_MODEL_SIZE + APP_NVM_LIGHT_MODEL_SIZE); - memcpy((void*)state, (void*)(AppliNvm_Reqs.modelData), APP_NVM_MODEL_SIZE); - *size = APP_NVM_MODEL_SIZE; + memcpy((void*)state, + (void*)(AppliNvm_Reqs.modelData), + APP_NVM_MODEL_SIZE); + *size = APP_NVM_MODEL_SIZE; } } return result; @@ -487,41 +502,47 @@ void AppliNvm_Process(void) uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE]; /* Erase if required */ - if (AppliNvm_Reqs.erasePageReq == MOBLE_TRUE) + if ((AppliNvm_Reqs.erasePageReq == MOBLE_TRUE) && + (!LL_FLASH_IsActiveFlag_OperationSuspended())) { - /* save reserve flash area */ - memcpy((void*)reserveAreaCopy, (void*)APP_NVM_BASE, APP_NVM_RESERVED_SIZE); - - result = PalNvmErase(APP_NVM_BASE, 0); - - if(result == MOBLE_RESULT_OUTOFMEMORY) + if(StopRadioInProgress == 0) { - AppliNvm_Reqs.erasePageReq = MOBLE_TRUE; + /* save reserve flash area */ + memcpy((void*)reserveAreaCopy, + (void*)APP_NVM_BASE, + APP_NVM_RESERVED_SIZE); + + TRACE_M(TF_PROVISION,"Erase flash page\r\n"); + result = PalNvmErase(APP_NVM_BASE, 0); + + if(result == MOBLE_RESULT_OUTOFMEMORY) + { + AppliNvm_Reqs.erasePageReq = MOBLE_TRUE; #if (LOW_POWER_FEATURE == 1) - UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0); + UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0); #endif - } - else - { - AppliNvm_Reqs.erasePageReq = MOBLE_FALSE; - AppliNvm_Reqs.writeReq = MOBLE_TRUE; + } + else + { + AppliNvm_Reqs.erasePageReq = MOBLE_FALSE; + AppliNvm_Reqs.writeReq = MOBLE_TRUE; #if (LOW_POWER_FEATURE == 1) - UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0); + UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0); #endif /* restore reserve area */ /* FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy); */ - result = AppliNvm_FlashProgram(0, - (uint32_t*)&reserveAreaCopy, - APP_NVM_RESERVED_SIZE); - if (result == MOBLE_RESULT_SUCCESS) - { - AppliNvm_Reqs.writeReq = MOBLE_FALSE; + result = AppliNvm_FlashProgram(0, + (uint32_t*)&reserveAreaCopy, + APP_NVM_RESERVED_SIZE); + BLEMesh_ResumeAdvScan(); } } + else + StopRadioInProgress--; } - if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE - && AppliNvm_Reqs.writeReq == MOBLE_TRUE) + if (AppliNvm_Reqs.erasePageReq == MOBLE_FALSE && + AppliNvm_Reqs.writeReq == MOBLE_TRUE) { result = AppliNvm_FindFirstEmptyPage(&subPageIdx, APP_NVM_SUBPAGE_SIZE, @@ -530,11 +551,14 @@ void AppliNvm_Process(void) if(result == MOBLE_RESULT_OUTOFMEMORY) { + BLEMesh_SuspendAdvScan(); + StopRadioInProgress = RADIO_OFF_DELAY; + AppliNvm_Reqs.erasePageReq = MOBLE_TRUE; #if (LOW_POWER_FEATURE == 1) UTIL_SEQ_SetTask( 1<<CFG_TASK_APPLI_REQ_ID, CFG_SCH_PRIO_0); #endif - result = MOBLE_RESULT_FAIL; + result = MOBLE_RESULT_SUCCESS; } else { @@ -637,6 +661,85 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex, return result; } +#if 0 +MOBLE_RESULT AppliNVM_Save_FlashTesting(MOBLEUINT8 *buffer, + MOBLEUINT16 buffer_size) +{ + MOBLE_RESULT result = MOBLE_RESULT_FAIL; + uint8_t reserveAreaCopy[APP_NVM_RESERVED_SIZE]; + MOBLEINT16 subPageIdx; + + for(MOBLEUINT8 count = 0;count <= buffer_size;count++) + { + buffer[count] = count; + } + + /* save reserve flash area */ + memcpy((void*)reserveAreaCopy, + (void*)APP_NVM_BASE, + APP_NVM_RESERVED_SIZE); + + result = AppliNvm_FlashErase((uint16_t)((APP_NVM_BASE - RESET_MANAGER_FLASH_BASE_ADDRESS) / PAGE_SIZE)); + + if (result == MOBLE_RESULT_SUCCESS) + { + /* restore reserve area */ +// FLASH_ProgramWordBurst(APP_NVM_BASE, (uint32_t*)reserveAreaCopy); + result = AppliNvm_FlashProgram(0, + (uint32_t*)&reserveAreaCopy, + APP_NVM_RESERVED_SIZE); + } + + result = AppliNvm_FindFirstEmptyPage(&subPageIdx, + APP_NVM_SUBPAGE_SIZE, + APP_NVM_MAX_SUBPAGE, + (APP_NVM_BASE+APP_NVM_RESERVED_SIZE)); + + if(result == MOBLE_RESULT_OUTOFMEMORY) + { + TRACE_M(TF_PROVISION, "Flash sub page is full, preparing new subpage\r\n"); + } + else + { + result = AppliNvm_FlashProgram(APP_NVM_SUBPAGE_OFFSET(subPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET, + buffer, + buffer_size); + } + return result; +} + +MOBLE_RESULT AppliNVM_Retrieve_FlashTesting(MOBLEUINT8 *buffer, + MOBLEUINT16 buffer_size) +{ + MOBLEINT16 currSubPageIdx; + MOBLE_RESULT result = MOBLE_RESULT_FAIL; + + result = AppliNvm_FindFirstEmptyPage(&currSubPageIdx, + APP_NVM_SUBPAGE_SIZE, + APP_NVM_MAX_SUBPAGE, + (APP_NVM_BASE+APP_NVM_RESERVED_SIZE)); + + if(result == MOBLE_RESULT_OUTOFMEMORY) + { + TRACE_M(TF_PROVISION," Can not find the empty page for testing flash \r\n"); + } + else + { + memcpy((void*)buffer, + (void*)(APP_NVM_SUBPAGE_OFFSET(currSubPageIdx)+APP_NVM_GENERIC_MODEL_OFFSET), + buffer_size); + + result = AppliNvm_MarkSubpageInvalid(); + + if (MOBLE_FAILED(result)) + { + result = MOBLE_RESULT_FAIL; + } + } + + return result; +} +#endif /** * @} @@ -645,4 +748,4 @@ MOBLE_RESULT AppliNvm_FindFirstEmptyPage(MOBLEINT16* subPageIndex, /** * @} */ -/******************* (C) COPYRIGHT 2017 STMicroelectronics *****END OF FILE****/ +/******************* (C) COPYRIGHT 2020 STMicroelectronics *****END OF FILE****/ |