diff options
Diffstat (limited to 'Middlewares/ST/STM32_WPAN/ble/mesh/PAL/STM32WB/pal_nvm.c')
-rw-r--r-- | Middlewares/ST/STM32_WPAN/ble/mesh/PAL/STM32WB/pal_nvm.c | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/Middlewares/ST/STM32_WPAN/ble/mesh/PAL/STM32WB/pal_nvm.c b/Middlewares/ST/STM32_WPAN/ble/mesh/PAL/STM32WB/pal_nvm.c index 392f1a3ea..5d4a7f95c 100644 --- a/Middlewares/ST/STM32_WPAN/ble/mesh/PAL/STM32WB/pal_nvm.c +++ b/Middlewares/ST/STM32_WPAN/ble/mesh/PAL/STM32WB/pal_nvm.c @@ -47,11 +47,6 @@ #include "ble.h" -extern const void* mobleNvmBase; -#define NVM_BASE ((unsigned int)mobleNvmBase) -#define NVM_SIZE 0x00002000 -#define FLASH_SECTOR_SIZE 0x1000 - /* Private functions ---------------------------------------------------------*/ /** * @brief Gets the page of a given address @@ -96,13 +91,18 @@ MOBLEBOOL MoblePalNvmIsWriteProtected(void) /** * @brief Read NVM -* @param offset: offset wrt start address of nvm +* @param address: read start address of nvm +* @param offset: offset read start address of nvm * @param buf: copy of read content * @param size: size of memory to be read * @param backup: If read from backup memory * @retval Result of read operation */ -MOBLE_RESULT MoblePalNvmRead(MOBLEUINT32 offset, void *buf, MOBLEUINT32 size, MOBLEBOOL backup) +MOBLE_RESULT MoblePalNvmRead(MOBLEUINT32 address, + MOBLEUINT32 offset, + void *buf, + MOBLEUINT32 size, + MOBLEBOOL backup) { MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; @@ -122,7 +122,7 @@ MOBLE_RESULT MoblePalNvmRead(MOBLEUINT32 offset, void *buf, MOBLEUINT32 size, MO } else { - memmove(buf, (void *)(NVM_BASE + offset), size); + memmove(buf, (void *)(address + offset), size); } // printf("MoblePalNvmRead <<<\r\n"); @@ -131,13 +131,18 @@ MOBLE_RESULT MoblePalNvmRead(MOBLEUINT32 offset, void *buf, MOBLEUINT32 size, MO /** * @brief Compare with NVM -* @param offset: offset wrt start address of nvm +* @param offset: start address of nvm to compare +* @param offset: offset start address of nvm * @param buf: copy of content * @param size: size of memory to be compared * @param comparison: outcome of comparison * @retval Result */ -MOBLE_RESULT MoblePalNvmCompare(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size, MOBLE_NVM_COMPARE* comparison) +MOBLE_RESULT MoblePalNvmCompare(MOBLEUINT32 address, + MOBLEUINT32 offset, + void const *buf, + MOBLEUINT32 size, + MOBLE_NVM_COMPARE* comparison) { MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; @@ -173,7 +178,7 @@ MOBLE_RESULT MoblePalNvmCompare(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size >>= 3; uint64_t* src = (uint64_t*)buf; - uint64_t* dst = (uint64_t*)(NVM_BASE + offset); + uint64_t* dst = (uint64_t*)(address + offset); for (MOBLEUINT32 i=0; i<size; ++i) { @@ -199,25 +204,31 @@ MOBLE_RESULT MoblePalNvmCompare(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 * @param None * @retval Result */ -MOBLE_RESULT MoblePalNvmErase(MOBLEUINT32 offset) +MOBLE_RESULT MoblePalNvmErase(MOBLEUINT32 address, + MOBLEUINT32 offset) { HAL_StatusTypeDef status = HAL_OK; + uint32_t pageError = 0; // printf("MoblePalNvmErase >>>\r\n"); - while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) ); - HAL_FLASH_Unlock(); - __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR); - FLASH_EraseInitTypeDef erase; erase.TypeErase = FLASH_TYPEERASE_PAGES; - erase.Page = GetPage(NVM_BASE + offset); /* 126 or 127 */; + erase.Page = GetPage(address + offset); /* 126 or 127 */; erase.NbPages = FLASH_SECTOR_SIZE >> 12; - uint32_t pageError = 0; + while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) ); + HAL_FLASH_Unlock(); + __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR); + + SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_ON); + while(LL_FLASH_IsActiveFlag_OperationSuspended()); status = HAL_FLASHEx_Erase(&erase, &pageError); while(LL_FLASH_IsActiveFlag_OperationSuspended()); + + SHCI_C2_FLASH_EraseActivity( ERASE_ACTIVITY_OFF); + HAL_FLASH_Lock(); LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 ); @@ -228,12 +239,16 @@ MOBLE_RESULT MoblePalNvmErase(MOBLEUINT32 offset) /** * @brief Write to NVM +* @param offset: wrt start address of nvm * @param offset: offset wrt start address of nvm * @param buf: copy of write content * @param size: size of memory to be written * @retval Result */ -MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 size) +MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 address, + MOBLEUINT32 offset, + void const *buf, + MOBLEUINT32 size) { MOBLE_RESULT result = MOBLE_RESULT_SUCCESS; @@ -264,24 +279,24 @@ MOBLE_RESULT MoblePalNvmWrite(MOBLEUINT32 offset, void const *buf, MOBLEUINT32 s size >>= 3; uint64_t* src = (uint64_t*)buf; - uint64_t* dst = (uint64_t*)(NVM_BASE + offset); +// uint64_t* dst = (uint64_t*)(address + offset); HAL_StatusTypeDef status = HAL_OK; while( LL_HSEM_1StepLock( HSEM, CFG_HW_FLASH_SEMID ) ); HAL_FLASH_Unlock(); __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR | FLASH_FLAG_OPTVERR); - for (size_t i = 0; i < size && status == HAL_OK; i++) - { - if (src[i<<3] != dst[i<<3]) + for (size_t i = 0; (i < size) && (status == HAL_OK); i++) { +// if (src[i<<3] != dst[i<<3]) +// { while(LL_FLASH_IsActiveFlag_OperationSuspended()); - status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, NVM_BASE + offset + (i <<3), src[i]); + status = HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address + offset + (i <<3), src[i]); if (status != HAL_OK) { break; } - } +// } } HAL_FLASH_Lock(); LL_HSEM_ReleaseLock( HSEM, CFG_HW_FLASH_SEMID, 0 ); |