altos: Use flash loader on all STM products
authorKeith Packard <keithp@keithp.com>
Tue, 23 Apr 2013 01:35:57 +0000 (20:35 -0500)
committerKeith Packard <keithp@keithp.com>
Wed, 8 May 2013 04:30:26 +0000 (21:30 -0700)
Includes the boot chain stuff

Signed-off-by: Keith Packard <keithp@keithp.com>
13 files changed:
src/core/ao_cmd.c
src/megadongle-v0.1/Makefile
src/stm-demo/Makefile
src/stm-demo/ao_demo.c
src/stm-flash/ao_pins.h
src/stm/altos-application.ld [deleted file]
src/stm/altos.ld
src/stm/ao_arch.h
src/stm/ao_boot.h
src/telegps-v0.1/Makefile
src/telelco-v0.1/Makefile
src/telemega-v0.1/Makefile
src/telescience-v0.2/Makefile

index 7da2384f8c9d5a155112a83dda61949211640709..188b8bb4c693c71aa23dd75c74ed5f7a3fc59dfa 100644 (file)
@@ -385,6 +385,18 @@ ao_cmd(void)
        }
 }
 
+#if HAS_BOOT_LOADER
+
+#include <ao_boot.h>
+
+static void
+ao_loader(void)
+{
+       flush();
+       ao_boot_loader();
+}
+#endif
+
 __xdata struct ao_task ao_cmd_task;
 
 __code struct ao_cmds  ao_base_cmds[] = {
@@ -396,6 +408,9 @@ __code struct ao_cmds       ao_base_cmds[] = {
        { ao_reboot,    "r eboot\0Reboot" },
 #if HAS_VERSION
        { version,      "v\0Version" },
+#endif
+#if HAS_BOOT_LOADER
+       { ao_loader,    "X\0Switch to boot loader" },
 #endif
        { 0,    NULL },
 };
index fe392ce164715d6ac528e12e42e30f2076d3ba8e..7f12963f00f9fee5137a8992f3cc5b9dae8bfd21 100644 (file)
@@ -28,6 +28,7 @@ INC = \
 #STACK_GUARD_DEF=-DHAS_STACK_GUARD=1
 
 ALTOS_SRC = \
+       ao_boot_chain.c \
        ao_interrupt.c \
        ao_product.c \
        ao_romconfig.c \
index e84a7675b905cd5e6c961b1c59b01fa26556f8b4..d1f825db7cc0baf886eb59ff144e321b98ae2647 100644 (file)
@@ -56,7 +56,7 @@ OBJ=$(SRC:.c=.o)
 
 all: $(ELF) $(IHX)
 
-LDFLAGS=-L../stm -Wl,-Taltos-application.ld
+LDFLAGS=-L../stm -Wl,-Taltos.ld
 
 $(ELF): Makefile $(OBJ)
        $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $@ $(OBJ) $(SAT_CLIB) -lgcc
index ec572fdc204a8a8871046085b91a73ac6f981a50..5677cdf46d3b5ed2261b94f5a10ce21aab21fdb0 100644 (file)
@@ -169,13 +169,6 @@ ao_event(void)
 
 }
 
-static void
-ao_boot_loader(void)
-{
-       flush();
-       ao_boot_reboot((uint32_t *) 0);
-}
-
 __code struct ao_cmds ao_demo_cmds[] = {
        { ao_dma_test,  "D\0DMA test" },
        { ao_spi_write, "W\0SPI write" },
@@ -183,7 +176,6 @@ __code struct ao_cmds ao_demo_cmds[] = {
        { ao_i2c_write, "i\0I2C write" },
        { ao_temp, "t\0Show temp" },
        { ao_event, "e\0Monitor event queue" },
-       { ao_boot_loader, "L\0Reboot to boot loader" },
        { 0, NULL }
 };
 
index 1c00675bd8f1eca76abd0364f96b53809010173d..8fb56f7bf36de0c0041b8d03de715a01b3a46994 100644 (file)
@@ -75,6 +75,5 @@
 #define AO_BOOT_APPLICATION_PIN                0
 #define AO_BOOT_APPLICATION_VALUE      1
 #define AO_BOOT_APPLICATION_MODE       0
-#define AO_BOOT_APPLICATION_BASE       ((uint32_t *) 0x1000)
 
 #endif /* _AO_PINS_H_ */
diff --git a/src/stm/altos-application.ld b/src/stm/altos-application.ld
deleted file mode 100644 (file)
index 6affc37..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright © 2012 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.
- */
-
-MEMORY {
-       rom (rx) : ORIGIN = 0x08001000, LENGTH = 124K
-       ram (!w) : ORIGIN = 0x20000000, LENGTH = 16K
-}
-
-INCLUDE registers.ld
-
-EXTERN (stm_interrupt_vector)
-
-SECTIONS {
-       /*
-        * Rom contents
-        */
-
-       .text ORIGIN(rom) : {
-               __text_start__ = .;
-               *(.interrupt)   /* Interrupt vectors */
-
-               . = ORIGIN(rom) + 0x100;
-
-
-               /* Ick. What I want is to specify the
-                * addresses of some global constants so
-                * that I can find them across versions
-                * of the application. I can't figure out
-                * how to make gnu ld do that, so instead
-                * we just load the two files that include
-                * these defines in the right order here and
-                * expect things to 'just work'. Don't change
-                * the contents of those files, ok?
-                */
-               ao_romconfig.o(.romconfig*)
-               ao_product.o(.romconfig*)
-               *(.text*)       /* Executable code */
-               *(.rodata*)     /* Constants */
-
-       } > rom
-
-       .ARM.exidx : {
-               *(.ARM.exidx* .gnu.linkonce.armexidx.*)
-       } > rom
-       __text_end__ = .;
-
-       /* Boot data which must live at the start of ram so that
-        * the application and bootloader share the same addresses.
-        * This must be all uninitialized data
-        */
-       .boot (NOLOAD) : {
-               __boot_start__ = .;
-               *(.boot)
-               . = ALIGN(4);
-               __boot_end__ = .;
-       } >ram
-
-       /* Data -- relocated to RAM, but written to ROM
-        */
-       .data : {
-               __data_start__ = .;
-               *(.data)        /* initialized data */
-               . = ALIGN(4);
-               __data_end__ = .;
-       } >ram AT>rom
-
-       .bss : {
-               __bss_start__ = .;
-               *(.bss)
-               *(COMMON)
-               . = ALIGN(4);
-               __bss_end__ = .;
-       } >ram
-
-       PROVIDE(__stack__ = ORIGIN(ram) + LENGTH(ram));
-       PROVIDE(end = .);
-}
-
-ENTRY(start);
-
-
index d218e992ad8aa5e835c951d94bd8b97e93e6cac1..3106cc3b7ca83dcc6b3e54600ad039abb2884324 100644 (file)
@@ -16,7 +16,7 @@
  */
 
 MEMORY {
-       rom (rx) : ORIGIN = 0x08000000, LENGTH = 128K
+       rom (rx) : ORIGIN = 0x08001000, LENGTH = 124K
        ram (!w) : ORIGIN = 0x20000000, LENGTH = 15872
        stack (!w) : ORIGIN = 0x20003e00, LENGTH = 512
 }
@@ -36,9 +36,19 @@ SECTIONS {
 
                . = ORIGIN(rom) + 0x100;
 
+
+               /* Ick. What I want is to specify the
+                * addresses of some global constants so
+                * that I can find them across versions
+                * of the application. I can't figure out
+                * how to make gnu ld do that, so instead
+                * we just load the two files that include
+                * these defines in the right order here and
+                * expect things to 'just work'. Don't change
+                * the contents of those files, ok?
+                */
                ao_romconfig.o(.romconfig*)
                ao_product.o(.romconfig*)
-
                *(.text*)       /* Executable code */
                *(.rodata*)     /* Constants */
 
@@ -46,21 +56,34 @@ SECTIONS {
 
        .ARM.exidx : {
                *(.ARM.exidx* .gnu.linkonce.armexidx.*)
-               __text_end__ = .;
        } > rom
+       __text_end__ = .;
+
+       /* Boot data which must live at the start of ram so that
+        * the application and bootloader share the same addresses.
+        * This must be all uninitialized data
+        */
+       .boot (NOLOAD) : {
+               __boot_start__ = .;
+               *(.boot)
+               . = ALIGN(4);
+               __boot_end__ = .;
+       } >ram
 
        /* Data -- relocated to RAM, but written to ROM
         */
-       .data ORIGIN(ram) : AT (ADDR(.ARM.exidx) + SIZEOF (.ARM.exidx)) {
+       .data : {
                __data_start__ = .;
                *(.data)        /* initialized data */
+               . = ALIGN(4);
                __data_end__ = .;
-               __bss_start__ = .;
-       } >ram
+       } >ram AT>rom
 
        .bss : {
+               __bss_start__ = .;
                *(.bss)
                *(COMMON)
+               . = ALIGN(4);
                __bss_end__ = .;
        } >ram
 
index 27a942f219f42b6303820f8f4e77bb64e1ebefa1..cc83eac27fe1bd86cabb05c19d853a92300174f4 100644 (file)
@@ -129,5 +129,10 @@ extern const uint32_t      ao_radio_cal;
 void
 ao_adc_init();
 
+#define AO_BOOT_APPLICATION_BASE       ((uint32_t *) 0x1000)
+#define AO_BOOT_LOADER_BASE            ((uint32_t *) 0x0)
+#define HAS_BOOT_LOADER                        1
+
 #endif /* _AO_ARCH_H_ */
 
+
index 3e8c50bae89e15bd549baba91978b4012a225a86..862e8755b27abe1f95993c6e7daa171f2f5aed6c 100644 (file)
@@ -30,4 +30,9 @@ ao_boot_check_chain(void);
 void
 ao_boot_reboot(uint32_t *base);
 
+static inline void
+ao_boot_loader(void) {
+       ao_boot_reboot(AO_BOOT_LOADER_BASE);
+}
+
 #endif /* _AO_BOOT_H_ */
index aae3766077acf78ce9343ed35a03414b6e8facc8..2c41235bc1e049538798365f4f0d037438fa6051 100644 (file)
@@ -33,6 +33,7 @@ INC = \
 #STACK_GUARD_DEF=-DHAS_STACK_GUARD=1
 
 ALTOS_SRC = \
+       ao_boot_chain.c \
        ao_interrupt.c \
        ao_product.c \
        ao_romconfig.c \
index a4a83d0224ec09b3acb221d14e36626131ac8025..240833082bdf7c7f80dc790856feab4ef88dbd4a 100644 (file)
@@ -30,6 +30,7 @@ INC = \
 #PROFILE_DEF=-DAO_PROFILE=1
 
 ALTOS_SRC = \
+       ao_boot_chain.c \
        ao_interrupt.c \
        ao_product.c \
        ao_romconfig.c \
index 16393ea068e6e517bb3283dda1ee8c76241fc53b..a72d08f213a16da7577c5ce1a2f3688990570ad4 100644 (file)
@@ -45,6 +45,7 @@ INC = \
 #STACK_GUARD_DEF=-DHAS_STACK_GUARD=1
 
 ALTOS_SRC = \
+       ao_boot_chain.c \
        ao_interrupt.c \
        ao_product.c \
        ao_romconfig.c \
index fbeeb75c4124def091fdff6bcd281cdbf3ffb5d5..f16ef268f416f8551e7ff451e20af3a7e15546a8 100644 (file)
@@ -28,6 +28,7 @@ INC = \
 #STACK_GUARD_DEF=-DHAS_STACK_GUARD=1
 
 ALTOS_SRC = \
+       ao_boot_chain.c \
        ao_interrupt.c \
        ao_product.c \
        ao_romconfig.c \