summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-08-28 18:10:34 -0700
committerKeith Packard <keithp@keithp.com>2012-08-28 23:00:23 -0700
commiteb1a9a8c3f3d3993d5986925bc4ad112c2bbc119 (patch)
treefb1fedb1a0c15c7cbdb9c8400e362a66a272179b /src
parent3fe5a70d9ac2114ee554813b1dbb3019a3e4aff7 (diff)
altos: Explicitly erase memory in STM eeprom driver.
This seems to make the STM32L152 happier Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src')
-rw-r--r--src/stm/ao_eeprom_stm.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/stm/ao_eeprom_stm.c b/src/stm/ao_eeprom_stm.c
index 1e51b417..5a75a97d 100644
--- a/src/stm/ao_eeprom_stm.c
+++ b/src/stm/ao_eeprom_stm.c
@@ -83,18 +83,29 @@ ao_intflash_lock(void)
}
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");
}