altos/test: Adjust CRC error rate after FEC fix
[fw/altos] / src / stm / ao_eeprom_stm.c
index 1e51b417c7b8a22da2b8c821f6dee9552d007623..ed2d2e41728d0fc3a00f5c9ff1638a9db2f8bb50 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  */
 
 #include <ao.h>
-#include <ao_storage.h>
+#include <ao_eeprom.h>
 
 /* Total bytes of available storage */
-ao_pos_t       ao_storage_total = 4096;
-
-/* Block size - device is erased in these units. */
-ao_pos_t       ao_storage_block = 1024;
-
-/* Byte offset of config block. Will be ao_storage_block bytes long */
-ao_pos_t       ao_storage_config = 0;
-
-/* Storage unit size - device reads and writes must be within blocks of this size. */
-uint16_t       ao_storage_unit = 1024;
+#define ao_eeprom_total 4096
 
 /* Location of eeprom in address space */
 #define stm_eeprom     ((uint8_t *) 0x08080000)
@@ -42,23 +34,19 @@ uint16_t    ao_storage_unit = 1024;
  * the same contents, or append to an existing page easily enough
  */
 
-/*
- * Erase the specified sector
- */
-uint8_t
-ao_storage_erase(ao_pos_t pos) __reentrant
-{
-       /* Not necessary */
-       return 1;
-}
-
 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 +56,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 +70,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);
+       addr = (uint32_t *) (void *) (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
@@ -103,14 +96,14 @@ ao_intflash_write8(uint16_t pos, uint8_t d)
        uint32_t        w, *addr, mask;
        uint8_t         shift;
        
-       addr = (uint32_t *) (stm_eeprom + (pos & ~3));
+       addr = (uint32_t *) (void *) (stm_eeprom + (pos & ~3));
 
        /* Compute word to be written */
        shift = (pos & 3) << 3;
        mask = 0xff << shift;
        w = (*addr & ~mask) | (d << shift);
 
-       ao_intflash_write32(pos & ~3, w);
+       ao_intflash_write32(pos & (uint16_t)~3, w);
 }
 
 static uint8_t
@@ -120,16 +113,16 @@ ao_intflash_read(uint16_t pos)
 }
 
 /*
- * Write to flash
+ * Write to eeprom
  */
 
 uint8_t
-ao_storage_device_write(ao_pos_t pos32, __xdata void *v, uint16_t len) __reentrant
+ao_eeprom_write(ao_pos_t pos32, void *v, uint16_t len)
 {
-       uint16_t pos = pos32;
-       __xdata uint8_t *d = v;
+       uint16_t pos = (uint16_t) pos32;
+       uint8_t *d = v;
 
-       if (pos >= ao_storage_total || pos + len > ao_storage_total)
+       if (pos >= ao_eeprom_total || pos + len > ao_eeprom_total)
                return 0;
 
        ao_intflash_unlock();
@@ -137,7 +130,7 @@ ao_storage_device_write(ao_pos_t pos32, __xdata void *v, uint16_t len) __reentra
                if ((pos & 3) == 0 && len >= 4) {
                        uint32_t        w;
 
-                       w = d[0] | (d[1] << 8) | (d[2] << 16) | (d[3] << 24);
+                       w = (uint32_t) d[0] | ((uint32_t) d[1] << 8) | ((uint32_t) d[2] << 16) | ((uint32_t) d[3] << 24);
                        ao_intflash_write32(pos, w);
                        pos += 4;
                        d += 4;
@@ -155,37 +148,26 @@ ao_storage_device_write(ao_pos_t pos32, __xdata void *v, uint16_t len) __reentra
 }
 
 /*
- * Read from flash
+ * Read from eeprom
  */
 uint8_t
-ao_storage_device_read(ao_pos_t pos, __xdata void *v, uint16_t len) __reentrant
+ao_eeprom_read(ao_pos_t pos, void *v, uint16_t len)
 {
        uint8_t *d = v;
        
-       if (pos >= ao_storage_total || pos + len > ao_storage_total)
+       if (pos >= ao_eeprom_total || pos + len > ao_eeprom_total)
                return 0;
        while (len--)
-               *d++ = ao_intflash_read(pos++);
+               *d++ = ao_intflash_read((uint16_t) (pos++));
        return 1;
 }
 
-void
-ao_storage_flush(void) __reentrant
-{
-}
-
-void
-ao_storage_setup(void)
-{
-}
-
-void
-ao_storage_device_info(void) __reentrant
-{
-       printf ("Using internal flash\n");
-}
+/*
+ * Initialize eeprom
+ */
 
 void
-ao_storage_device_init(void)
+ao_eeprom_init(void)
 {
+       /* Nothing to do here */
 }