altos: Explicitly erase memory in STM eeprom driver.
authorKeith Packard <keithp@keithp.com>
Wed, 29 Aug 2012 01:10:34 +0000 (18:10 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 29 Aug 2012 06:00:23 +0000 (23:00 -0700)
This seems to make the STM32L152 happier

Signed-off-by: Keith Packard <keithp@keithp.com>
src/stm/ao_eeprom_stm.c

index 1e51b417c7b8a22da2b8c821f6dee9552d007623..5a75a97d86d6be05f1128529493fdf1c52b9af30 100644 (file)
@@ -82,19 +82,30 @@ ao_intflash_lock(void)
        stm_flash.pecr |= (1 << STM_FLASH_PECR_PELOCK);
 }
 
+static void
+ao_intflash_wait(void)
+{
+       /* Wait for the flash unit to go idle */
+       while (stm_flash.sr & (1 << STM_FLASH_SR_BSY))
+               ;
+}
+
 static void
 ao_intflash_write32(uint16_t pos, uint32_t w)
 {
-       uint32_t        *addr;
+       volatile uint32_t       *addr;
 
        addr = (uint32_t *) (stm_eeprom + pos);
 
-       /* Write a word to a valid address in the data EEPROM */
-       *addr = w;
+       /* Erase previous word */
+       *addr = 0;
+       ao_intflash_wait();
 
-       /* Wait for the flash unit to go idle */
-       while (stm_flash.sr & (1 << STM_FLASH_SR_BSY))
-               ;
+       if (w) {
+               /* Write a word to a valid address in the data EEPROM */
+               *addr = w;
+               ao_intflash_wait();
+       }
 }
 
 static void
@@ -182,6 +193,7 @@ ao_storage_setup(void)
 void
 ao_storage_device_info(void) __reentrant
 {
+       uint8_t i;
        printf ("Using internal flash\n");
 }