From 318f0cf679b0c9215fbc5ca843245257c77bdefb Mon Sep 17 00:00:00 2001 From: Federico Pellegrin <fede@evolware.org> Date: Wed, 30 Jan 2019 04:29:23 +0100 Subject: [PATCH] sam0 flashpage: make ready check inline, add wait also after PBC --- cpu/sam0_common/periph/flashpage.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/cpu/sam0_common/periph/flashpage.c b/cpu/sam0_common/periph/flashpage.c index c3468d3b0d..22ba4b8dd6 100644 --- a/cpu/sam0_common/periph/flashpage.c +++ b/cpu/sam0_common/periph/flashpage.c @@ -41,6 +41,16 @@ #define _NVMCTRL NVMCTRL #endif +static inline void wait_nvm_is_ready(void) __attribute__((always_inline)); +static inline void wait_nvm_is_ready(void) +{ +#ifdef CPU_SAML1X + while (!_NVMCTRL->STATUS.bit.READY) {} +#else + while (!_NVMCTRL->INTFLAG.bit.READY) {} +#endif +} + static void _unlock(void) { /* remove peripheral access lock for the NVMCTRL peripheral */ @@ -89,15 +99,12 @@ void flashpage_write_raw(void *target_addr, const void *data, size_t len) _unlock(); _NVMCTRL->CTRLA.reg = (NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_PBC); + wait_nvm_is_ready(); for (unsigned i = 0; i < len; i++) { *dst++ = *data_addr++; } _NVMCTRL->CTRLA.reg = (NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_WP); -#ifdef CPU_SAML1X - while (!_NVMCTRL->STATUS.bit.READY) {} -#else - while (!_NVMCTRL->INTFLAG.bit.READY) {} -#endif + wait_nvm_is_ready(); _lock(); } @@ -116,11 +123,7 @@ void flashpage_write(int page, const void *data) _NVMCTRL->ADDR.reg = (((uint32_t)page_addr) >> 1); #endif _NVMCTRL->CTRLA.reg = (NVMCTRL_CTRLA_CMDEX_KEY | NVMCTRL_CTRLA_CMD_ER); -#ifdef CPU_SAML1X - while (!_NVMCTRL->STATUS.bit.READY) {} -#else - while (!_NVMCTRL->INTFLAG.bit.READY) {} -#endif + wait_nvm_is_ready(); _lock(); /* write data to page */ -- GitLab