X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=src%2Fstm%2Fao_arch.h;h=aee9df3c970d08b9d04d3d03df51229ae971abf0;hp=b3c0190da3f2f807ce60a8ac6d329fa8e479244e;hb=684741765117611b7d666efbdfafd87c6199752c;hpb=8ba5344514f8ed51f6fd69ca09f6c7035c4fd0da diff --git a/src/stm/ao_arch.h b/src/stm/ao_arch.h index b3c0190d..aee9df3c 100644 --- a/src/stm/ao_arch.h +++ b/src/stm/ao_arch.h @@ -3,7 +3,8 @@ * * 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 @@ -25,109 +26,120 @@ * STM32L definitions and code fragments for AltOS */ -#define AO_STACK_SIZE 256 +#ifndef AO_STACK_SIZE +#define AO_STACK_SIZE 512 +#endif + +#ifndef AO_TICK_TYPE +#define AO_TICK_TYPE uint16_t +#define AO_TICK_SIGNED int16_t +#endif + +#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 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") #define ao_arch_interrupt(n) /* nothing */ -#undef putchar -#undef getchar -#define putchar(c) ao_putchar(c) -#define getchar ao_getchar +/* + * ao_romconfig.c + */ -extern void putchar(char c); -extern char getchar(void); -extern void ao_avr_stdio_init(void); +#define AO_ROMCONFIG_VERSION 2 -extern const uint16_t ao_serial_number; +#define AO_ROMCONFIG_SYMBOL(a) __attribute__((section(".romconfig"))) const -#define ARM_PUSH32(stack, val) (*(--(stack)) = (val)) +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 */ -}; - /* * For now, we're running at a weird frequency */ -#define STM_APB1 (16000000 * 6 / 4) + +#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 + +/* The stm32l implements only 4 bits of the priority fields */ + +#if AO_NONMASK_INTERRUPT +#define AO_STM_NVIC_NONMASK_PRIORITY 0x00 + +/* Set the basepri register to this value to mask all + * non-maskable priorities + */ +#define AO_STM_NVIC_BASEPRI_MASK 0x10 +#endif + +#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_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(); + +/* ADC maximum reported value */ +#define AO_ADC_MAX 4095 + +#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 + +#ifndef AO_LED_TYPE +#define AO_LED_TYPE uint16_t +#endif #endif /* _AO_ARCH_H_ */ +