*
* 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)
* 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
(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) |
{
volatile uint32_t *addr;
- addr = (uint32_t *) (stm_eeprom + pos);
+ addr = (uint32_t *) (void *) (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
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
}
/*
- * 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();
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;
}
/*
- * 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
-{
- uint8_t i;
- printf ("Using internal flash\n");
-}
+/*
+ * Initialize eeprom
+ */
void
-ao_storage_device_init(void)
+ao_eeprom_init(void)
{
+ /* Nothing to do here */
}