*
* 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.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* STM32L definitions and code fragments for AltOS
*/
-#define AO_STACK_SIZE 1024
+#ifndef AO_STACK_SIZE
+#define AO_STACK_SIZE 512
+#endif
-#define AO_LED_TYPE uint16_t
+#define AO_PORT_TYPE uint16_t
/* Various definitions to make GCC look more like SDCC */
#define ao_arch_naked_declare __attribute__((naked))
#define ao_arch_naked_define
-#define __pdata
-#define __data
-#define __xdata
-#define __code const
-#define __reentrant
-#define __critical
#define __interrupt(n)
#define __at(n)
-#define CORTEX_M3_AIRCR ((uint32_t *) 0xe000ed0c)
-
-#define ao_arch_reboot() (*((uint32_t *) 0xe000ed0c) = 0x05fa0004)
+#define ao_arch_reboot() \
+ (stm_scb.aircr = ((STM_SCB_AIRCR_VECTKEY_KEY << STM_SCB_AIRCR_VECTKEY) | \
+ (1 << STM_SCB_AIRCR_SYSRESETREQ)))
#define ao_arch_nop() asm("nop")
#define ao_arch_interrupt(n) /* nothing */
-#undef putchar
-#undef getchar
-#define putchar(c) ao_putchar(c)
-#define getchar ao_getchar
-
-extern void putchar(char c);
-extern char getchar(void);
-extern void ao_avr_stdio_init(void);
-
-extern const uint16_t ao_serial_number;
-
-#define ARM_PUSH32(stack, val) (*(--(stack)) = (val))
-
-#define ao_arch_task_members\
- uint32_t *sp; /* saved stack pointer */
-
-#define cli() asm("cpsid i")
-#define sei() asm("cpsie i")
-
-#define ao_arch_init_stack(task, start) do { \
- uint32_t *sp = (uint32_t *) (task->stack + AO_STACK_SIZE); \
- uint32_t a = (uint32_t) start; \
- int i; \
- \
- /* Return address (goes into LR) */ \
- ARM_PUSH32(sp, a); \
- \
- /* Clear register values r0-r12 */ \
- i = 13; \
- while (i--) \
- ARM_PUSH32(sp, 0); \
- \
- /* APSR */ \
- ARM_PUSH32(sp, 0); \
- \
- /* PRIMASK with interrupts enabled */ \
- ARM_PUSH32(sp, 0); \
- \
- task->sp = sp; \
-} while (0);
-
-#define ao_arch_save_regs() do { \
- /* Save general registers */ \
- asm("push {r0-r12,lr}\n"); \
- \
- /* Save APSR */ \
- asm("mrs r0,apsr"); \
- asm("push {r0}"); \
- \
- /* Save PRIMASK */ \
- asm("mrs r0,primask"); \
- asm("push {r0}"); \
- \
- /* Enable interrupts */ \
- sei(); \
- } while (0)
-
-#define ao_arch_save_stack() do { \
- uint32_t *sp; \
- asm("mov %0,sp" : "=&r" (sp) ); \
- ao_cur_task->sp = (sp); \
- if ((uint8_t *) sp < ao_cur_task->stack) \
- ao_panic (AO_PANIC_STACK); \
- } while (0)
-
-#define ao_arch_isr_stack() /* nothing */
-
-#define ao_arch_cpu_idle() do { \
- asm("wfi"); \
- } while (0)
-
-#define ao_arch_restore_stack() do { \
- uint32_t sp; \
- sp = (uint32_t) ao_cur_task->sp; \
- \
- /* Switch stacks */ \
- asm("mov sp, %0" : : "r" (sp) ); \
- \
- /* Restore PRIMASK */ \
- asm("pop {r0}"); \
- asm("msr primask,r0"); \
- \
- /* Restore APSR */ \
- asm("pop {r0}"); \
- asm("msr apsr,r0"); \
- \
- /* Restore general registers */ \
- asm("pop {r0-r12,lr}\n"); \
- \
- /* Return to calling function */ \
- asm("bx lr"); \
- } while(0)
-
-#define ao_arch_critical(b) do { cli(); do { b } while (0); sei(); } while (0)
+/*
+ * ao_romconfig.c
+ */
+
+#define AO_ROMCONFIG_SYMBOL __attribute__((section(".romconfig"))) const
/*
* For now, we're running at a weird frequency
*/
+#ifndef AO_HSE
+#error High speed frequency undefined
+#endif
+
#if AO_HSE
#define AO_PLLSRC AO_HSE
#else
#define AO_HCLK (AO_SYSCLK / AO_AHB_PRESCALER)
#define AO_PCLK1 (AO_HCLK / AO_APB1_PRESCALER)
#define AO_PCLK2 (AO_HCLK / AO_APB2_PRESCALER)
+#define AO_SYSTICK (AO_HCLK / 8)
#if AO_APB1_PRESCALER == 1
#define AO_TIM23467_CLK AO_PCLK1
#define AO_TIM91011_CLK (2 * AO_PCLK2)
#endif
-void ao_lcd_stm_init(void);
-
-void ao_lcd_font_init(void);
-
-void ao_lcd_font_string(char *s);
-
-char
-ao_serial1_getchar(void);
-
-void
-ao_serial1_putchar(char c);
+/* The stm32l implements only 4 bits of the priority fields */
-char
-ao_serial1_pollchar(void);
+#if AO_NONMASK_INTERRUPT
+#define AO_STM_NVIC_NONMASK_PRIORITY 0x00
-void
-ao_serial1_set_speed(uint8_t speed);
+/* Set the basepri register to this value to mask all
+ * non-maskable priorities
+ */
+#define AO_STM_NVIC_BASEPRI_MASK 0x10
+#endif
-char
-ao_serial2_getchar(void);
+#define AO_STM_NVIC_HIGH_PRIORITY 0x40
+#define AO_STM_NVIC_MED_PRIORITY 0x80
+#define AO_STM_NVIC_LOW_PRIORITY 0xC0
+#define AO_STM_NVIC_CLOCK_PRIORITY 0xf0
-void
-ao_serial2_putchar(char c);
+void ao_lcd_stm_init(void);
-char
-ao_serial2_pollchar(void);
+void ao_lcd_font_init(void);
-void
-ao_serial2_set_speed(uint8_t speed);
+void ao_lcd_font_string(char *s);
-char
-ao_serial3_getchar(void);
+extern const uint32_t ao_radio_cal;
void
-ao_serial3_putchar(char c);
+ao_adc_init(void);
-char
-ao_serial3_pollchar(void);
-
-void
-ao_serial3_set_speed(uint8_t speed);
+/* ADC maximum reported value */
+#define AO_ADC_MAX 4095
-extern uint32_t ao_radio_cal;
+#define AO_BOOT_APPLICATION_BASE ((uint32_t *) 0x08001000)
+#define AO_BOOT_APPLICATION_BOUND ((uint32_t *) (0x08000000 + stm_flash_size()))
+#define AO_BOOT_LOADER_BASE ((uint32_t *) 0x08000000)
+#define HAS_BOOT_LOADER 1
-void
-ao_adc_init();
+#ifndef AO_LED_TYPE
+#define AO_LED_TYPE uint16_t
+#endif
#endif /* _AO_ARCH_H_ */
+