*/
#include "ao.h"
+#include "ao_task.h"
__pdata uint16_t ao_cmd_lex_i;
__pdata uint32_t ao_cmd_lex_u32;
ao_panic(AO_PANIC_REBOOT);
}
+#ifndef HAS_VERSION
+#define HAS_VERSION 1
+#endif
+
+#if HAS_VERSION
static void
version(void)
{
#endif
printf("software-version %s\n", ao_version);
}
+#endif
#ifndef NUM_CMDS
#define NUM_CMDS 11
__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 },
};
/* we'll never get back here */
}
+#if HAS_TASK_INFO
void
ao_task_info(void)
{
ao_task_validate();
#endif
}
+#endif
void
ao_start_scheduler(void)
#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) */
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
#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_ */
#include "ao.h"
#include <ao_exti.h>
-<<<<<<< HEAD
#include <ao_boot.h>
#include <ao_flash_stm.h>
{ 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;
}
--- /dev/null
+/*
+ * 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);
+
+
--- /dev/null
+/*
+ * 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);
+
+
--- /dev/null
+/*
+ * 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_ */
#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);
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 */