summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-03-27 18:43:42 -0700
committerKeith Packard <keithp@keithp.com>2013-03-27 18:43:42 -0700
commit985cd22b941415b1ae2709ae1ab6b60c3d815ec1 (patch)
tree402478515fd71861e0ade931362ff80ac7c20cd7
parent4a68878a66508e6f1523cd813b2e37bcf2e90ab3 (diff)
altos: Use FTDW, clear DATA bit. Disable backup write protection
The newer(?) chips in telegps didn't like the previous programming scheme, so go back to fixed time for write, which does an implicit erase before every write. Also clear the DATA bit, which is only needed for double word erase/programming. Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/stm/ao_eeprom_stm.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/src/stm/ao_eeprom_stm.c b/src/stm/ao_eeprom_stm.c
index 5a75a97d..58783f1a 100644
--- a/src/stm/ao_eeprom_stm.c
+++ b/src/stm/ao_eeprom_stm.c
@@ -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) |
@@ -97,15 +103,9 @@ ao_intflash_write32(uint16_t pos, uint32_t w)
addr = (uint32_t *) (stm_eeprom + pos);
- /* Erase previous word */
- *addr = 0;
+ /* Write a word to a valid address in the data EEPROM */
+ *addr = w;
ao_intflash_wait();
-
- if (w) {
- /* Write a word to a valid address in the data EEPROM */
- *addr = w;
- ao_intflash_wait();
- }
}
static void