altos: Make stm-flash capable of switching to application
authorKeith Packard <keithp@keithp.com>
Mon, 11 Mar 2013 04:02:59 +0000 (21:02 -0700)
committerKeith Packard <keithp@keithp.com>
Wed, 8 May 2013 03:15:43 +0000 (20:15 -0700)
This shrinks the base OS load down a bit as well so that stm-flash
fits comfortably in the first 8kB of memory.

Signed-off-by: Keith Packard <keithp@keithp.com>
src/core/ao_cmd.c
src/core/ao_task.c
src/core/ao_task.h
src/stm-demo/Makefile
src/stm-flash/ao_pins.h
src/stm-flash/ao_stm_flash.c
src/stm/altos-application.ld [new file with mode: 0644]
src/stm/altos-loader.ld [new file with mode: 0644]
src/stm/ao_boot.h [new file with mode: 0644]
src/stm/ao_interrupt.c

index 6eed08d91931a401da9d4c325e9f3f34b247eb1a..7da2384f8c9d5a155112a83dda61949211640709 100644 (file)
@@ -16,6 +16,7 @@
  */
 
 #include "ao.h"
+#include "ao_task.h"
 
 __pdata uint16_t ao_cmd_lex_i;
 __pdata uint32_t ao_cmd_lex_u32;
@@ -262,6 +263,11 @@ ao_reboot(void)
        ao_panic(AO_PANIC_REBOOT);
 }
 
+#ifndef HAS_VERSION
+#define HAS_VERSION 1
+#endif
+
+#if HAS_VERSION
 static void
 version(void)
 {
@@ -289,6 +295,7 @@ version(void)
 #endif
        printf("software-version %s\n", ao_version);
 }
+#endif
 
 #ifndef NUM_CMDS
 #define NUM_CMDS       11
@@ -382,10 +389,14 @@ __xdata struct ao_task ao_cmd_task;
 
 __code struct ao_cmds  ao_base_cmds[] = {
        { help,         "?\0Help" },
+#if HAS_TASK_INFO
        { ao_task_info, "T\0Tasks" },
+#endif
        { echo,         "E <0 off, 1 on>\0Echo" },
        { ao_reboot,    "r eboot\0Reboot" },
+#if HAS_VERSION
        { version,      "v\0Version" },
+#endif
        { 0,    NULL },
 };
 
index c24c992927782438e35cba1871e2d643be656760..0aad650898d9c54dddca6d53e6fa2c799aec89d8 100644 (file)
@@ -512,6 +512,7 @@ ao_exit(void)
        /* we'll never get back here */
 }
 
+#if HAS_TASK_INFO
 void
 ao_task_info(void)
 {
@@ -528,6 +529,7 @@ ao_task_info(void)
        ao_task_validate();
 #endif
 }
+#endif
 
 void
 ao_start_scheduler(void)
index 50bfb220f081571572bbaab82395c1d0e29b1813..1a4b5b6ba94ca5c604e6a6cc139844514243f26e 100644 (file)
 #include <ao_list.h>
 #endif
 
+#ifndef HAS_TASK_INFO
+#define HAS_TASK_INFO 1
+#endif
+
 /* An AltOS task */
 struct ao_task {
        __xdata void *wchan;            /* current wait channel (NULL if running) */
index 3b1b671b27294d50e01dec5dd0a67b3445380476..ab12f47b588d2a5647c2ff7f5ef89686310fe013 100644 (file)
@@ -53,7 +53,7 @@ OBJ=$(SRC:.c=.o)
 
 all: $(PROG)
 
-LDFLAGS=-L../stm -Wl,-Taltos.ld
+LDFLAGS=-L../stm -Wl,-Taltos-application.ld
 
 $(PROG): Makefile $(OBJ)
        $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ) $(SAT_CLIB) -lgcc
index b232f373db699ba37bba2b62b0aa358319fbdd1a..ca53d844cd86af4924cd470602411d8ea9185571 100644 (file)
@@ -20,7 +20,9 @@
 
 #define HAS_TASK_QUEUE         0
 
-#define AO_HSE                 8000000
+/* Bridge SB17 on the board and use the MCO from the other chip */
+#define AO_HSE         8000000
+#define AO_HSE_BYPASS          1
 
 /* PLLVCO = 96MHz (so that USB will work) */
 #define AO_PLLMUL              12
 #define AO_TICK_SIGNED         int32_t
 
 #define HAS_TASK_INFO          0
+#define HAS_VERSION            0
 
-#define AO_BOOT_APPLICATION_GPIO       stm_gpiob
-#define AO_BOOT_APPLICATION_PIN                5
-#define AO_BOOT_APPLICATION_VALUE      0
-#define AO_BOOT_APPLICATION_MODE       AO_EXTI_MODE_PULL_UP
+#define AO_BOOT_APPLICATION_GPIO       stm_gpioa
+#define AO_BOOT_APPLICATION_PIN                0
+#define AO_BOOT_APPLICATION_VALUE      1
+#define AO_BOOT_APPLICATION_MODE       0
 #define AO_BOOT_APPLICATION_BASE       0x2000
 
 #endif /* _AO_PINS_H_ */
index 81ae86df2523acdd9b9bd7c44ea311b041d8d506..e2d7ec65a4b463a1f337702771607302ea5b0943 100644 (file)
@@ -17,7 +17,6 @@
 
 #include "ao.h"
 #include <ao_exti.h>
-<<<<<<< HEAD
 #include <ao_boot.h>
 #include <ao_flash_stm.h>
 
@@ -118,48 +117,23 @@ __code struct ao_cmds ao_flash_cmds[] = {
        { ao_block_read, "R <addr>\0Read block. Returns 256 bytes" },
        { 0, NULL },
 };
-=======
 
-void
-ao_panic(uint8_t c)
-{
-}
-
-void
-ao_test(void)
-{
-       char    c;
-
-       for (;;) {
-               c = ao_usb_getchar();
-               ao_usb_putchar(c);
-               ao_usb_flush();
-       }
-}
-
-struct ao_task ao_test_task;
->>>>>>> 5187bb4... Add STM self-flashing loader
 
 int
 main(void)
 {
        ao_clock_init();
-<<<<<<< HEAD
 
        ao_task_init();
 
-=======
->>>>>>> 5187bb4... Add STM self-flashing loader
        ao_timer_init();
 //     ao_dma_init();
        ao_cmd_init();
 //     ao_exti_init();
        ao_usb_init();
 
-<<<<<<< HEAD
        ao_cmd_register(&ao_flash_cmds[0]);
-=======
->>>>>>> 5187bb4... Add STM self-flashing loader
+       ao_cmd_register(&ao_flash_cmds[0]);
        ao_start_scheduler();
        return 0;
 }
diff --git a/src/stm/altos-application.ld b/src/stm/altos-application.ld
new file mode 100644 (file)
index 0000000..63a3be0
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * 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 = 0x08002000, LENGTH = 120K
+       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;
+
+               ao_romconfig.o(.romconfig*)
+               ao_product.o(.romconfig*)
+
+               *(.text*)       /* Executable code */
+               *(.rodata*)     /* Constants */
+
+       } > rom
+
+       .ARM.exidx : {
+               *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+               __text_end__ = .;
+       } > rom
+
+       /* Data -- relocated to RAM, but written to ROM
+        */
+       .data ORIGIN(ram) : AT (ADDR(.ARM.exidx) + SIZEOF (.ARM.exidx)) {
+               __data_start__ = .;
+               *(.data)        /* initialized data */
+               __data_end__ = .;
+               __bss_start__ = .;
+       } >ram
+
+       .bss : {
+               *(.bss)
+               *(COMMON)
+               __bss_end__ = .;
+       } >ram
+
+       PROVIDE(__stack__ = ORIGIN(ram) + LENGTH(ram));
+       PROVIDE(end = .);
+}
+
+ENTRY(start);
+
+
diff --git a/src/stm/altos-loader.ld b/src/stm/altos-loader.ld
new file mode 100644 (file)
index 0000000..2d71b4e
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * 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 = 0x08000000, LENGTH = 8K
+       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;
+
+               ao_romconfig.o(.romconfig*)
+               ao_product.o(.romconfig*)
+
+               *(.text*)       /* Executable code */
+               *(.rodata*)     /* Constants */
+
+       } > rom
+
+       .ARM.exidx : {
+               *(.ARM.exidx* .gnu.linkonce.armexidx.*)
+               __text_end__ = .;
+       } > rom
+
+       /* Data -- relocated to RAM, but written to ROM
+        */
+       .data ORIGIN(ram) : AT (ADDR(.ARM.exidx) + SIZEOF (.ARM.exidx)) {
+               __data_start__ = .;
+               *(.data)        /* initialized data */
+               __data_end__ = .;
+               __bss_start__ = .;
+       } >ram
+
+       .bss : {
+               *(.bss)
+               *(COMMON)
+               __bss_end__ = .;
+       } >ram
+
+       PROVIDE(__stack__ = ORIGIN(ram) + LENGTH(ram));
+       PROVIDE(end = .);
+}
+
+ENTRY(start);
+
+
diff --git a/src/stm/ao_boot.h b/src/stm/ao_boot.h
new file mode 100644 (file)
index 0000000..863d8e0
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * 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_BOOT_H_
+#define _AO_BOOT_H_
+
+void
+ao_reboot_application(void);
+
+#endif /* _AO_BOOT_H_ */
index 12763a305737623de75ad2c61757cbb9f445567e..9e7562193c37d1567b11ef5fd1d8ed56ad5671cf 100644 (file)
@@ -42,12 +42,45 @@ const void *stm_interrupt_vector[];
 
 #ifdef AO_BOOT_APPLICATION_PIN
 #include <ao_exti.h>
+
+#define AO_BOOT_APPLICATION            0x5a5aa5a5
+#define AO_BOOT_APPLICATION_CHECK      0xc3c33c3c
+
+static uint32_t        ao_boot_application;
+static uint32_t        ao_boot_application_check;
+
+static void
+ao_boot_chain(void) {
+       uint32_t        sp;
+       uint32_t        pc;
+
+       sp = BOOT_FETCH(0);
+       pc = BOOT_FETCH(4);
+       asm ("mov sp, %0" : : "r" (sp));
+       asm ("mov lr, %0" : : "r" (pc));
+       asm ("bx lr");
+}
+
+void
+ao_reboot_application(void)
+{
+       ao_boot_application = AO_BOOT_APPLICATION;
+       ao_boot_application_check = AO_BOOT_APPLICATION_CHECK;
+       ao_arch_reboot();
+}
+
 #endif
 
 void start(void) {
 #ifdef AO_BOOT_APPLICATION_PIN
        uint16_t v;
 
+       if (ao_boot_application == AO_BOOT_APPLICATION &&
+           ao_boot_application_check == AO_BOOT_APPLICATION_CHECK) {
+               ao_boot_application = 0;
+               ao_boot_application_check = 0;
+               ao_boot_chain();
+       }
        /* Enable power interface clock */
        stm_rcc.apb1enr |= (1 << STM_RCC_APB1ENR_PWREN);
        
@@ -63,16 +96,7 @@ void start(void) {
        ao_disable_port(&AO_BOOT_APPLICATION_GPIO);
        stm_rcc.apb1enr &= ~(1 << STM_RCC_APB1ENR_PWREN);
        if (v == AO_BOOT_APPLICATION_VALUE)
-       {
-               uint32_t        sp;
-               uint32_t        pc;
-
-               sp = BOOT_FETCH(0);
-               pc = BOOT_FETCH(4);
-               asm ("mov sp, %0" : : "r" (sp));
-               asm ("mov lr, %0" : : "r" (pc));
-               asm ("bx lr");
-       }
+               ao_boot_chain();
 #endif
 
        /* Set interrupt vector table offset */