Wait for flash to go non-busy after writing or erasing a page and
before jumping back out of the RAM code.
Export a separate 'erase' operation for testing.
Re-lock flash after every operation.
Signed-off-by: Keith Packard <keithp@keithp.com>
/* Unlock Data EEPROM and FLASH_PECR register */
stm_flash.pekeyr = STM_FLASH_PEKEYR_PEKEY1;
stm_flash.pekeyr = STM_FLASH_PEKEYR_PEKEY2;
/* Unlock Data EEPROM and FLASH_PECR register */
stm_flash.pekeyr = STM_FLASH_PEKEYR_PEKEY1;
stm_flash.pekeyr = STM_FLASH_PEKEYR_PEKEY2;
+ if (ao_flash_pecr_is_locked())
+ ao_panic(AO_PANIC_FLASH);
/* Unlock program memory */
stm_flash.prgkeyr = STM_FLASH_PRGKEYR_PRGKEY1;
stm_flash.prgkeyr = STM_FLASH_PRGKEYR_PRGKEY2;
/* Unlock program memory */
stm_flash.prgkeyr = STM_FLASH_PRGKEYR_PRGKEY1;
stm_flash.prgkeyr = STM_FLASH_PRGKEYR_PRGKEY2;
+ if (ao_flash_pgr_is_locked())
+ ao_panic(AO_PANIC_FLASH);
+}
+
+static void
+ao_flash_lock(void)
+{
+ stm_flash.pecr |= (1 << STM_FLASH_PECR_OPTLOCK) | (1 << STM_FLASH_PECR_PRGLOCK) | (1 << STM_FLASH_PECR_PELOCK);
+static void __attribute__ ((section(".text.ram"),noinline))
+_ao_flash_erase_page(uint32_t *page)
+{
+ stm_flash.pecr |= (1 << STM_FLASH_PECR_ERASE) | (1 << STM_FLASH_PECR_PROG);
+
+ *page = 0x00000000;
+
+ while (stm_flash.sr & (1 << STM_FLASH_SR_BSY))
+ ;
+}
+
+void
ao_flash_erase_page(uint32_t *page)
{
ao_flash_pecr_unlock();
ao_flash_pgr_unlock();
ao_flash_erase_page(uint32_t *page)
{
ao_flash_pecr_unlock();
ao_flash_pgr_unlock();
- stm_flash.pecr |= (1 << STM_FLASH_PECR_ERASE);
- stm_flash.pecr |= (1 << STM_FLASH_PECR_PROG);
-
- ao_flash_wait_bsy();
+ _ao_flash_erase_page(page);
}
static void __attribute__ ((section(".text.ram"), noinline))
}
static void __attribute__ ((section(".text.ram"), noinline))
- _ao_flash_half_page(uint32_t *dst, uint32_t *src)
+_ao_flash_half_page(uint32_t *dst, uint32_t *src)
{
uint8_t i;
stm_flash.pecr |= (1 << STM_FLASH_PECR_FPRG);
stm_flash.pecr |= (1 << STM_FLASH_PECR_PROG);
{
uint8_t i;
stm_flash.pecr |= (1 << STM_FLASH_PECR_FPRG);
stm_flash.pecr |= (1 << STM_FLASH_PECR_PROG);
while (stm_flash.sr & (1 << STM_FLASH_SR_BSY))
;
while (stm_flash.sr & (1 << STM_FLASH_SR_BSY))
;
-
- for (i = 0; i < 32; i++)
+
+ for (i = 0; i < 32; i++) {
+ }
+
+ while (stm_flash.sr & (1 << STM_FLASH_SR_BSY))
+ ;
uint8_t h;
ao_flash_erase_page(page);
uint8_t h;
ao_flash_erase_page(page);
+ ao_flash_pecr_unlock();
+ ao_flash_pgr_unlock();
for (h = 0; h < 2; h++) {
for (h = 0; h < 2; h++) {
- ao_flash_pecr_unlock();
- ao_flash_pgr_unlock();
_ao_flash_half_page(page, src);
page += 32;
src += 32;
}
_ao_flash_half_page(page, src);
page += 32;
src += 32;
}
#ifndef _AO_FLASH_STM_H_
#define _AO_FLASH_STM_H_
#ifndef _AO_FLASH_STM_H_
#define _AO_FLASH_STM_H_
+void
+ao_flash_erase_page(uint32_t *page);
+
void
ao_flash_page(uint32_t *page, uint32_t *src);
void
ao_flash_page(uint32_t *page, uint32_t *src);