Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Flipper-Zero/STM32CubeWB.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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.c179
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>&copy; Copyright (c) 2019 STMicroelectronics.
+ * <h2><center>&copy; 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****/