Move LCD string output code to ao_lcd_font.c
[fw/altos] / src / stm / ao_arch.h
index e6f54fdb30142d162b660a788c8d16132d5758ed..61e62f5dc703b3bcec1877c31b188ccf9adef475 100644 (file)
@@ -25,7 +25,7 @@
  * STM32L definitions and code fragments for AltOS
  */
 
-#define AO_STACK_SIZE  256
+#define AO_STACK_SIZE  1024
 
 /* Various definitions to make GCC look more like SDCC */
 
@@ -67,36 +67,48 @@ extern const uint16_t ao_serial_number;
 
 #define ao_arch_init_stack(task, start) do {                           \
                uint32_t        *sp = (uint32_t *) (task->stack + AO_STACK_SIZE); \
-               uint16_t        a = (uint16_t) start;                   \
+               uint32_t        a = (uint32_t) start;                   \
                int             i;                                      \
                                                                        \
-               /* Return address */                                    \
-               ARM_PUSH32(sp, a);                                      \
+               /* APSR */                                              \
+               ARM_PUSH32(sp, 0);                                      \
+                                                                       \
+               /* PRIMASK with interrupts enabled */                   \
+               ARM_PUSH32(sp, 0);                                      \
                                                                        \
-               /* Invalid link register */                             \
-               ARM_PUSH32(sp, 0xffffffff);                             \
+               /* Return address (goes into LR) */                     \
+               ARM_PUSH32(sp, a);                                      \
                                                                        \
-               /* Clear register values  */                            \
+               /* Clear register values r0-r12 */                      \
                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 {                                       \
+#define ao_arch_save_regs()    do {                                    \
+               uint32_t        apsr;                                   \
+               uint32_t        primask;                                \
+                                                                       \
+               /* Save APSR */                                         \
+               asm("mrs %0,apsr" : "=&r" (apsr));                      \
+               asm("push {%0}" : : "r" (apsr));                        \
+                                                                       \
+               /* Save PRIMASK */                                      \
+               asm("mrs %0,primask" : "=&r" (primask));                \
+               asm("push {%0}" : : "r" (primask));                     \
+                                                                       \
+               /* Save general registers */                            \
                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;                                     \
+               uint32_t        *sp;                                    \
                asm("mov %0,sp" : "=&r" (sp) );                         \
-               ao_cur_task->sp = (uint32_t *) (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 */
@@ -107,11 +119,25 @@ extern const uint16_t ao_serial_number;
 
 #define ao_arch_restore_stack() do { \
                uint32_t        sp;                                     \
+               uint32_t        primask;                                \
+               uint32_t        apsr;                                   \
                sp = (uint32_t) ao_cur_task->sp;                        \
-               cli();                                                  \
+                                                                       \
+               /* Switch stacks */                                     \
                asm("mov sp, %0" : : "r" (sp) );                        \
-               asm("pop {r0}" "\n\t" "msr psr,r0");                    \
+                                                                       \
+               /* Restore general registers */                         \
                asm("pop {r0-r12,lr}\n");                               \
+                                                                       \
+               /* Restore PRIMASK */                                   \
+               asm("pop {%0}" : "=&r" (primask) );                     \
+               asm("msr primask,%0" : : "r" (primask) );               \
+                                                                       \
+               /* Restore APSR */                                      \
+               asm("pop {%0}" : "=&r" (apsr) );                        \
+               asm("msr apsr,%0" : : "r" (apsr) );                     \
+                                                                       \
+               /* Return to calling function */                        \
                asm("bx lr");                                           \
        } while(0)
 
@@ -124,6 +150,16 @@ struct ao_adc {
        uint16_t        adc[AO_ARM_NUM_ADC];    /* samples */
 };
 
+/*
+ * For now, we're running at a weird frequency
+ */
+#define STM_APB1       (16000000 * 6 / 4)
+
+void ao_lcd_stm_init(void);
+
+void ao_lcd_font_init(void);
+
+void ao_lcd_font_string(char *s);
 
 #endif /* _AO_ARCH_H_ */