summaryrefslogtreecommitdiff
path: root/src/stm
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2012-07-17 01:24:52 -0700
committerKeith Packard <keithp@keithp.com>2012-07-17 01:24:52 -0700
commita5d873d47b3b16ca32559b4de668bf07b25eddb0 (patch)
tree47c2ca395d776b4e4574ca59dbfdb49d8b6ea870 /src/stm
parent20877ae9de8bb5d3a29e2a96024e53afbd396f55 (diff)
altos: Place STM config values at fixed addresses for re-use
Just like cc1111, stick the serial number and radio calibration values at known fixed addresses so that when re-flashing the board, we can go find the existing values. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/stm')
-rw-r--r--src/stm/altos.ld21
-rw-r--r--src/stm/ao_arch.h12
-rw-r--r--src/stm/ao_romconfig.c7
3 files changed, 29 insertions, 11 deletions
diff --git a/src/stm/altos.ld b/src/stm/altos.ld
index f5a84f4c..f78a45d6 100644
--- a/src/stm/altos.ld
+++ b/src/stm/altos.ld
@@ -25,18 +25,22 @@ INCLUDE registers.ld
EXTERN (stm_interrupt_vector)
SECTIONS {
- . = ORIGIN(rom);
-
/*
* Rom contents
*/
- __text_start__ = .;
-
- .text : {
+ .text ORIGIN(rom) : {
+ __text_start__ = .;
*(.interrupt) /* Interrupt vectors */
+
+ . = ORIGIN(rom) + 0x100;
+
+ ao_romconfig.o(.romconfig*)
+ ao_product.o(.romconfig*)
+
*(.text*) /* Executable code */
*(.rodata*) /* Constants */
+
} > rom
.ARM.exidx : {
@@ -44,12 +48,10 @@ SECTIONS {
__text_end__ = .;
} > rom
- . = ORIGIN(ram);
- __data_start__ = .;
-
/* Data -- relocated to RAM, but written to ROM
*/
- .data : AT (ADDR(.ARM.exidx) + SIZEOF (.ARM.exidx)) {
+ .data ORIGIN(ram) : AT (ADDR(.ARM.exidx) + SIZEOF (.ARM.exidx)) {
+ __data_start__ = .;
*(.data) /* initialized data */
__data_end__ = .;
__bss_start__ = .;
@@ -63,7 +65,6 @@ SECTIONS {
PROVIDE(__stack__ = ORIGIN(ram) + LENGTH(ram));
PROVIDE(end = .);
-
}
ENTRY(start);
diff --git a/src/stm/ao_arch.h b/src/stm/ao_arch.h
index d8fa3e89..484ce89e 100644
--- a/src/stm/ao_arch.h
+++ b/src/stm/ao_arch.h
@@ -59,7 +59,19 @@ extern void putchar(char c);
extern char getchar(void);
extern void ao_avr_stdio_init(void);
+
+/*
+ * ao_romconfig.c
+ */
+
+#define AO_ROMCONFIG_VERSION 2
+
+#define AO_ROMCONFIG_SYMBOL(a) __attribute__((section(".romconfig"))) const
+
+extern const uint16_t ao_romconfig_version;
+extern const uint16_t ao_romconfig_check;
extern const uint16_t ao_serial_number;
+extern const uint32_t ao_radio_cal;
#define ARM_PUSH32(stack, val) (*(--(stack)) = (val))
diff --git a/src/stm/ao_romconfig.c b/src/stm/ao_romconfig.c
index 84317458..cbb922ec 100644
--- a/src/stm/ao_romconfig.c
+++ b/src/stm/ao_romconfig.c
@@ -17,4 +17,9 @@
#include "ao.h"
-const uint16_t ao_serial_number = 58;
+AO_ROMCONFIG_SYMBOL (0) uint16_t ao_romconfig_version = AO_ROMCONFIG_VERSION;
+AO_ROMCONFIG_SYMBOL (0) uint16_t ao_romconfig_check = ~AO_ROMCONFIG_VERSION;
+AO_ROMCONFIG_SYMBOL (0) uint16_t ao_serial_number = 0;
+#ifdef AO_RADIO_CAL_DEFAULT
+AO_ROMCONFIG_SYMBOL (0) uint32_t ao_radio_cal = AO_RADIO_CAL_DEFAULT;
+#endif