* STM32L definitions and code fragments for AltOS
*/
-#define AO_STACK_SIZE 256
+#define AO_STACK_SIZE 512
+
+#define AO_LED_TYPE uint16_t
+
+#ifndef AO_TICK_TYPE
+#define AO_TICK_TYPE uint16_t
+#define AO_TICK_SIGNED int16_t
+#endif
/* Various definitions to make GCC look more like SDCC */
#define __xdata
#define __code const
#define __reentrant
-#define __critical
#define __interrupt(n)
#define __at(n)
-#define ao_arch_reboot() /* XXX */
+#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")
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))
+/*
+ * 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 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); \
- uint16_t a = (uint16_t) start; \
- int i; \
- \
- /* Return address */ \
- ARM_PUSH32(sp, a); \
- \
- /* Invalid link register */ \
- ARM_PUSH32(sp, 0xffffffff); \
- \
- /* Clear register values */ \
- i = 13; \
- while (i--) \
- ARM_PUSH32(sp, 0); \
- \
- /* PSR with interrupts enabled */ \
- ARM_PUSH32(sp, 0x01000000); \
- task->sp = sp; \
-} while (0);
-
-#define ao_arch_save_regs() do { \
- asm("push {r0-r12,lr}\n"); \
- cli(); \
- asm("mrs r0,psr" "\n\t" "push {r0}"); \
- sei(); \
- } while (0)
-
-#define ao_arch_save_stack() do { \
- uint32_t sp; \
- asm("mov %0,sp" : "=&r" (sp) ); \
- ao_cur_task->sp = (uint32_t *) (sp); \
- } 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; \
- cli(); \
- asm("mov sp, %0" : : "r" (sp) ); \
- asm("pop {r0}" "\n\t" "msr psr,r0"); \
- asm("pop {r0-r12,lr}\n"); \
- asm("bx lr"); \
- } while(0)
-
-#define ao_arch_critical(b) do { cli(); do { b } while (0); sei(); } while (0)
-
-#define AO_ARM_NUM_ADC 12
-
-struct ao_adc {
- uint16_t tick; /* tick when the sample was read */
- uint16_t adc[AO_ARM_NUM_ADC]; /* samples */
-};
+#define ao_arch_block_interrupts() asm("cpsid i")
+#define ao_arch_release_interrupts() asm("cpsie i")
+
+
+/*
+ * 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_PLLSRC STM_HSI_FREQ
+#endif
+
+#define AO_PLLVCO (AO_PLLSRC * AO_PLLMUL)
+#define AO_SYSCLK (AO_PLLVCO / AO_PLLDIV)
+#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
+#else
+#define AO_TIM23467_CLK (2 * AO_PCLK1)
+#endif
+
+#if AO_APB2_PRESCALER == 1
+#define AO_TIM91011_CLK AO_PCLK2
+#else
+#define AO_TIM91011_CLK (2 * AO_PCLK2)
+#endif
+
+#define AO_STM_NVIC_HIGH_PRIORITY 4
+#define AO_STM_NVIC_CLOCK_PRIORITY 6
+#define AO_STM_NVIC_MED_PRIORITY 8
+#define AO_STM_NVIC_LOW_PRIORITY 10
+
+void ao_lcd_stm_init(void);
+
+void ao_lcd_font_init(void);
+
+void ao_lcd_font_string(char *s);
+
+extern const uint32_t ao_radio_cal;
+
+void
+ao_adc_init();
+
+#define AO_BOOT_APPLICATION_BASE ((uint32_t *) 0x08001000)
+#define AO_BOOT_LOADER_BASE ((uint32_t *) 0x0)
+#define HAS_BOOT_LOADER 1
#endif /* _AO_ARCH_H_ */
+