altos: Wait after configuring boot pin before testing it
[fw/altos] / src / stm / ao_eeprom_stm.c
index 1e51b417c7b8a22da2b8c821f6dee9552d007623..58783f1a0771262f6c573abc81162d8f09c0401f 100644 (file)
@@ -55,10 +55,16 @@ ao_storage_erase(ao_pos_t pos) __reentrant
 static void
 ao_intflash_unlock(void)
 {
+       /* Disable backup write protection */
+       stm_pwr.cr |= (1 << STM_PWR_CR_DBP);
+
        /* Unlock Data EEPROM and FLASH_PECR register */
        stm_flash.pekeyr = STM_FLASH_PEKEYR_PEKEY1;
        stm_flash.pekeyr = STM_FLASH_PEKEYR_PEKEY2;
 
+       if (stm_flash.pecr & (1 << STM_FLASH_PECR_PELOCK))
+               printf ("eeprom unlock failed\n");
+
        /* Configure the FTDW bit (FLASH_PECR[8]) to execute
         * word write, whatever the previous value of the word
         * being written to
@@ -68,8 +74,8 @@ ao_intflash_unlock(void)
                          (0 << STM_FLASH_PECR_EOPIE) |
                          (0 << STM_FLASH_PECR_FPRG) |
                          (0 << STM_FLASH_PECR_ERASE) |
-                         (0 << STM_FLASH_PECR_FTDW) |
-                         (1 << STM_FLASH_PECR_DATA) |
+                         (1 << STM_FLASH_PECR_FTDW) |
+                         (0 << STM_FLASH_PECR_DATA) |
                          (0 << STM_FLASH_PECR_PROG) |
                          (0 << STM_FLASH_PECR_OPTLOCK) |
                          (0 << STM_FLASH_PECR_PRGLOCK) |
@@ -82,19 +88,24 @@ 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;
-
-       /* Wait for the flash unit to go idle */
-       while (stm_flash.sr & (1 << STM_FLASH_SR_BSY))
-               ;
+       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");
 }