From f58319f82a45bbf38a3fac080a1aa5c651afdfc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Duda?= Date: Thu, 26 Mar 2020 23:29:22 +0100 Subject: [PATCH] [nrf528xx] align flash driver to the new otPlatFlash* API (#4742) --- .../nrf528xx/nrf52811/platform-config.h | 2 + .../nrf528xx/nrf52833/platform-config.h | 2 + .../nrf528xx/nrf52840/platform-config.h | 2 + examples/platforms/nrf528xx/src/flash.c | 2 + examples/platforms/nrf528xx/src/flash_nosd.c | 5 +- examples/platforms/nrf528xx/src/flash_sd.c | 135 +++++++++--------- .../platforms/nrf528xx/src/platform-nrf5.h | 2 +- 7 files changed, 79 insertions(+), 71 deletions(-) diff --git a/examples/platforms/nrf528xx/nrf52811/platform-config.h b/examples/platforms/nrf528xx/nrf52811/platform-config.h index 30c58c08d..e98954a24 100644 --- a/examples/platforms/nrf528xx/nrf52811/platform-config.h +++ b/examples/platforms/nrf528xx/nrf52811/platform-config.h @@ -121,6 +121,8 @@ * * Number of flash pages to use for OpenThread's non-volatile settings. * + * @note This define applies only for MDK-ARM Keil toolchain configuration. + * */ #ifndef PLATFORM_FLASH_PAGE_NUM #define PLATFORM_FLASH_PAGE_NUM 2 diff --git a/examples/platforms/nrf528xx/nrf52833/platform-config.h b/examples/platforms/nrf528xx/nrf52833/platform-config.h index 0965b6e93..a0ed91665 100644 --- a/examples/platforms/nrf528xx/nrf52833/platform-config.h +++ b/examples/platforms/nrf528xx/nrf52833/platform-config.h @@ -120,6 +120,8 @@ * * Number of flash pages to use for OpenThread's non-volatile settings. * + * @note This define applies only for MDK-ARM Keil toolchain configuration. + * */ #ifndef PLATFORM_FLASH_PAGE_NUM #define PLATFORM_FLASH_PAGE_NUM 4 diff --git a/examples/platforms/nrf528xx/nrf52840/platform-config.h b/examples/platforms/nrf528xx/nrf52840/platform-config.h index f1cacb7c9..fba961620 100644 --- a/examples/platforms/nrf528xx/nrf52840/platform-config.h +++ b/examples/platforms/nrf528xx/nrf52840/platform-config.h @@ -120,6 +120,8 @@ * * Number of flash pages to use for OpenThread's non-volatile settings. * + * @note This define applies only for MDK-ARM Keil toolchain configuration. + * */ #ifndef PLATFORM_FLASH_PAGE_NUM #define PLATFORM_FLASH_PAGE_NUM 4 diff --git a/examples/platforms/nrf528xx/src/flash.c b/examples/platforms/nrf528xx/src/flash.c index 13ef823d5..31d7af2ae 100644 --- a/examples/platforms/nrf528xx/src/flash.c +++ b/examples/platforms/nrf528xx/src/flash.c @@ -37,6 +37,8 @@ * * Number of flash pages to use for OpenThread's non-volatile settings. * + * @note This define applies only for MDK-ARM Keil toolchain configuration. + * */ #ifndef PLATFORM_FLASH_PAGE_NUM #define PLATFORM_FLASH_PAGE_NUM 4 diff --git a/examples/platforms/nrf528xx/src/flash_nosd.c b/examples/platforms/nrf528xx/src/flash_nosd.c index 07fc44d3b..711ab38e4 100644 --- a/examples/platforms/nrf528xx/src/flash_nosd.c +++ b/examples/platforms/nrf528xx/src/flash_nosd.c @@ -43,8 +43,9 @@ bool nrf5FlashIsBusy(void) return NRF_NVMC->READY != NVMC_READY_READY_Ready; } -uint32_t nrf5FlashWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize) +otError nrf5FlashWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize) { nrfx_nvmc_bytes_write(aAddress, aData, aSize); - return aSize; + + return OT_ERROR_NONE; } diff --git a/examples/platforms/nrf528xx/src/flash_sd.c b/examples/platforms/nrf528xx/src/flash_sd.c index 3de69930e..fbac9d3ef 100644 --- a/examples/platforms/nrf528xx/src/flash_sd.c +++ b/examples/platforms/nrf528xx/src/flash_sd.c @@ -41,7 +41,7 @@ #include "softdevice.h" #define FLASH_PAGE_SIZE 4096 -#define FLASH_TIMEOUT 500 +#define FLASH_MAX_RETRY 5 typedef enum { @@ -99,58 +99,57 @@ void nrf5SdSocFlashProcess(uint32_t aEvtId) static void waitInState(SdFlashState state) { - uint32_t startTime = otPlatAlarmMilliGetNow(); - do { nrf_sdh_evts_poll(); - if (sState != state) - { - break; - } - } while (otPlatAlarmMilliGetNow() - startTime < FLASH_TIMEOUT); + } while (sState == state); } static otError sdFlashSingleWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize) { uint32_t retval; - - nrf_sdh_suspend(); + uint32_t maxRetry = FLASH_MAX_RETRY; do { - sState = FLASH_STATE_PENDING; + nrf_sdh_suspend(); - retval = sd_flash_write((uint32_t *)aAddress, (uint32_t *)aData, aSize); + do + { + sState = FLASH_STATE_PENDING; - if (retval == NRF_SUCCESS) + retval = sd_flash_write((uint32_t *)aAddress, (uint32_t *)aData, aSize); + + if (retval == NRF_SUCCESS) + { + break; + } + else if (retval == NRF_ERROR_BUSY) + { + sState = FLASH_STATE_WAITING_FOR_IDLE; + } + else + { + assert(false); + } + + waitInState(FLASH_STATE_WAITING_FOR_IDLE); + + } while (retval == NRF_ERROR_BUSY); + + waitInState(FLASH_STATE_PENDING); + + if (sState != FLASH_STATE_COMPLETE_SUCCESS) { - break; - } - else if (retval == NRF_ERROR_BUSY) - { - sState = FLASH_STATE_WAITING_FOR_IDLE; - } - else - { - assert(false); + retval = NRF_ERROR_INTERNAL; } - waitInState(FLASH_STATE_WAITING_FOR_IDLE); + sState = FLASH_STATE_IDLE; - } while (retval == NRF_ERROR_BUSY); + nrf_sdh_resume(); - waitInState(FLASH_STATE_PENDING); - - if (sState != FLASH_STATE_COMPLETE_SUCCESS) - { - retval = NRF_ERROR_INTERNAL; - } - - sState = FLASH_STATE_IDLE; - - nrf_sdh_resume(); + } while (retval != NRF_SUCCESS && maxRetry--); return nrf5SdErrorToOtError(retval); } @@ -158,42 +157,47 @@ static otError sdFlashSingleWrite(uint32_t aAddress, const uint8_t *aData, uint3 otError nrf5FlashPageErase(uint32_t aAddress) { uint32_t retval; - - nrf_sdh_suspend(); + uint32_t maxRetry = FLASH_MAX_RETRY; do { - sState = FLASH_STATE_PENDING; + nrf_sdh_suspend(); - retval = sd_flash_page_erase(aAddress / FLASH_PAGE_SIZE); + do + { + sState = FLASH_STATE_PENDING; - if (retval == NRF_SUCCESS) + retval = sd_flash_page_erase(aAddress / FLASH_PAGE_SIZE); + + if (retval == NRF_SUCCESS) + { + break; + } + else if (retval == NRF_ERROR_BUSY) + { + sState = FLASH_STATE_WAITING_FOR_IDLE; + } + else + { + assert(false); + } + + waitInState(FLASH_STATE_WAITING_FOR_IDLE); + + } while (retval == NRF_ERROR_BUSY); + + waitInState(FLASH_STATE_PENDING); + + if (sState != FLASH_STATE_COMPLETE_SUCCESS) { - break; - } - else if (retval == NRF_ERROR_BUSY) - { - sState = FLASH_STATE_WAITING_FOR_IDLE; - } - else - { - assert(false); + retval = NRF_ERROR_INTERNAL; } - waitInState(FLASH_STATE_WAITING_FOR_IDLE); + sState = FLASH_STATE_IDLE; - } while (retval == NRF_ERROR_BUSY); + nrf_sdh_resume(); - waitInState(FLASH_STATE_PENDING); - - if (sState != FLASH_STATE_COMPLETE_SUCCESS) - { - retval = NRF_ERROR_INTERNAL; - } - - sState = FLASH_STATE_IDLE; - - nrf_sdh_resume(); + } while (retval != NRF_SUCCESS && maxRetry--); return nrf5SdErrorToOtError(retval); } @@ -203,15 +207,14 @@ bool nrf5FlashIsBusy(void) return sState != FLASH_STATE_IDLE; } -uint32_t nrf5FlashWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize) +otError nrf5FlashWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize) { otError error = OT_ERROR_NONE; - uint32_t result = 0; uint32_t remainder = (aAddress % sizeof(uint32_t)); uint32_t blockSize; uint32_t blockValue; - otEXPECT(sState == FLASH_STATE_IDLE); + otEXPECT_ACTION(sState == FLASH_STATE_IDLE, error = OT_ERROR_BUSY); // Check if @p aAddress is aligned to full word size. If not, make additional // flash write at the beginning. @@ -229,7 +232,6 @@ uint32_t nrf5FlashWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize) aAddress += blockSize; aData += blockSize; aSize -= blockSize; - result += blockSize; } otEXPECT(aSize); @@ -245,7 +247,6 @@ uint32_t nrf5FlashWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize) aAddress += blockSize; aData += blockSize; aSize -= blockSize; - result += blockSize; // Store any additional bytes that didn't fit into middle block. if (remainder) @@ -257,10 +258,8 @@ uint32_t nrf5FlashWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize) error = sdFlashSingleWrite(aAddress, (uint8_t *)&blockValue, sizeof(blockValue) / sizeof(uint32_t)); otEXPECT(error == OT_ERROR_NONE); - - result += remainder; } exit: - return result; + return error; } diff --git a/examples/platforms/nrf528xx/src/platform-nrf5.h b/examples/platforms/nrf528xx/src/platform-nrf5.h index 428a716be..339f0b946 100644 --- a/examples/platforms/nrf528xx/src/platform-nrf5.h +++ b/examples/platforms/nrf528xx/src/platform-nrf5.h @@ -155,7 +155,7 @@ bool nrf5FlashIsBusy(void); * Function for writing data into flash. * */ -uint32_t nrf5FlashWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize); +otError nrf5FlashWrite(uint32_t aAddress, const uint8_t *aData, uint32_t aSize); /** * Initialization of temperature controller.