summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/ao_config.c21
-rw-r--r--src/core/ao_config.h57
-rw-r--r--src/core/ao_eeprom.h43
-rw-r--r--src/core/ao_storage.c2
-rw-r--r--src/core/ao_storage.h10
5 files changed, 122 insertions, 11 deletions
diff --git a/src/core/ao_config.c b/src/core/ao_config.c
index 82faf32b..5567587b 100644
--- a/src/core/ao_config.c
+++ b/src/core/ao_config.c
@@ -17,7 +17,7 @@
#include "ao.h"
#include "ao_log.h"
-#include <ao_storage.h>
+#include <ao_config.h>
#if HAS_FLIGHT
#include <ao_sample.h>
#include <ao_data.h>
@@ -59,13 +59,12 @@ __xdata uint8_t ao_config_mutex;
static void
_ao_config_put(void)
{
- ao_storage_setup();
- ao_storage_erase(ao_storage_config);
- ao_storage_write(ao_storage_config, &ao_config, sizeof (ao_config));
+ ao_config_setup();
+ ao_config_write(&ao_config, sizeof (ao_config));
#if HAS_FLIGHT
ao_log_write_erase(0);
#endif
- ao_storage_flush();
+ ao_config_flush();
}
void
@@ -97,8 +96,8 @@ _ao_config_get(void)
* but ao_storage_setup *also* sets ao_storage_config, which we
* need before calling ao_storage_read here
*/
- ao_storage_setup();
- ao_storage_read(ao_storage_config, &ao_config, sizeof (ao_config));
+ ao_config_setup();
+ ao_config_read(&ao_config, sizeof (ao_config));
#endif
if (ao_config.major != AO_CONFIG_MAJOR) {
ao_config.major = AO_CONFIG_MAJOR;
@@ -127,8 +126,10 @@ _ao_config_get(void)
ao_config.radio_cal = ao_radio_cal;
#endif
/* Fixups for minor version 4 */
+#if HAS_FLIGHT
if (minor < 4)
ao_config.flight_log_max = AO_CONFIG_DEFAULT_FLIGHT_LOG_MAX;
+#endif
/* Fixupes for minor version 5 */
if (minor < 5)
ao_config.ignite_mode = AO_CONFIG_DEFAULT_IGNITE_MODE;
@@ -655,7 +656,7 @@ static void
ao_config_show(void) __reentrant;
static void
-ao_config_write(void) __reentrant;
+ao_config_save(void) __reentrant;
__code struct ao_config_var ao_config_vars[] = {
#if HAS_FLIGHT
@@ -714,7 +715,7 @@ __code struct ao_config_var ao_config_vars[] = {
ao_config_show, 0 },
#if HAS_EEPROM
{ "w\0Write to eeprom",
- ao_config_write, 0 },
+ ao_config_save, 0 },
#endif
{ "?\0Help",
ao_config_help, 0 },
@@ -766,7 +767,7 @@ ao_config_show(void) __reentrant
#if HAS_EEPROM
static void
-ao_config_write(void) __reentrant
+ao_config_save(void) __reentrant
{
uint8_t saved = 0;
ao_mutex_get(&ao_config_mutex);
diff --git a/src/core/ao_config.h b/src/core/ao_config.h
new file mode 100644
index 00000000..5e38430e
--- /dev/null
+++ b/src/core/ao_config.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_CONFIG_H_
+#define _AO_CONFIG_H_
+
+#ifndef USE_STORAGE_CONFIG
+#define USE_STORAGE_CONFIG 1
+#endif
+
+#ifndef USE_EEPROM_CONFIG
+#define USE_EEPROM_CONFIG 0
+#endif
+
+#if USE_STORAGE_CONFIG
+
+#include <ao_storage.h>
+
+#define ao_config_setup() ao_storage_setup()
+
+#define ao_config_write(bytes, len) do { \
+ ao_storage_erase(ao_storage_config); \
+ ao_storage_write(ao_storage_config, bytes, len); \
+ } while (0)
+
+#define ao_config_read(bytes, len) ao_storage_read(ao_storage_config, bytes, len)
+
+#define ao_config_flush() ao_storage_flush()
+
+#endif
+
+#if USE_EEPROM_CONFIG
+
+#include <ao_eeprom.h>
+
+#define ao_config_setup()
+#define ao_config_write(bytes, len) ao_eeprom_write(0, bytes, len)
+#define ao_config_read(bytes, len) ao_eeprom_read(0, bytes, len)
+#define ao_config_flush()
+
+#endif
+
+#endif /* _AO_CONFIG_H_ */
diff --git a/src/core/ao_eeprom.h b/src/core/ao_eeprom.h
new file mode 100644
index 00000000..915522bf
--- /dev/null
+++ b/src/core/ao_eeprom.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright © 2013 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+#ifndef _AO_EEPROM_H_
+#define _AO_EEPROM_H_
+
+extern const ao_pos_t ao_eeprom_total;
+
+/*
+ * Write to eeprom
+ */
+
+uint8_t
+ao_eeprom_write(ao_pos_t pos32, __xdata void *v, uint16_t len);
+
+/*
+ * Read from eeprom
+ */
+uint8_t
+ao_eeprom_read(ao_pos_t pos, __xdata void *v, uint16_t len);
+
+/*
+ * Initialize eeprom
+ */
+
+void
+ao_eeprom_init(void);
+
+#endif /* _AO_EEPROM_H_ */
diff --git a/src/core/ao_storage.c b/src/core/ao_storage.c
index adf7e4d4..6eddae7f 100644
--- a/src/core/ao_storage.c
+++ b/src/core/ao_storage.c
@@ -154,7 +154,7 @@ ao_storage_zapall(void) __reentrant
ao_cmd_white();
if (!ao_match_word("DoIt"))
return;
- for (pos = 0; pos < ao_storage_config; pos += ao_storage_block)
+ for (pos = 0; pos < ao_storage_log_max; pos += ao_storage_block)
ao_storage_erase(pos);
}
diff --git a/src/core/ao_storage.h b/src/core/ao_storage.h
index ea946399..d6e95605 100644
--- a/src/core/ao_storage.h
+++ b/src/core/ao_storage.h
@@ -35,9 +35,19 @@ extern __pdata ao_pos_t ao_storage_total;
/* Block size - device is erased in these units. At least 256 bytes */
extern __pdata ao_pos_t ao_storage_block;
+#ifndef USE_STORAGE_CONFIG
+#define USE_STORAGE_CONFIG 1
+#endif
+
+#if USE_STORAGE_CONFIG
/* Byte offset of config block. Will be ao_storage_block bytes long */
extern __pdata ao_pos_t ao_storage_config;
+#define ao_storage_log_max ao_storage_config
+#else
+#define ao_storage_log_max ao_storage_total
+#endif
+
/* Storage unit size - device reads and writes must be within blocks of this size. Usually 256 bytes. */
extern __pdata uint16_t ao_storage_unit;