From d6a314bed737d3f4142f814454d5462f842f1e4f Mon Sep 17 00:00:00 2001 From: chrysn Date: Mon, 27 Feb 2012 14:00:34 +0100 Subject: efm32: make all interrupts usable in vector table * define weak symbol for ${irq_name}_isr * put them in the rom vector table * declare reset_vector weak in case someone wants to insert code there * remove null_handler (null handlers should be only requested explicitly, and finding out why the chip gets stuck is easier than determining whether or not a no-op interrupt handler was executed) --- lib/efm32/tinygecko/vector.c | 93 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 80 insertions(+), 13 deletions(-) (limited to 'lib/efm32/tinygecko/vector.c') diff --git a/lib/efm32/tinygecko/vector.c b/lib/efm32/tinygecko/vector.c index 624785e..fb8fbd4 100644 --- a/lib/efm32/tinygecko/vector.c +++ b/lib/efm32/tinygecko/vector.c @@ -18,6 +18,7 @@ * along with this program. If not, see . */ +#include #include #define WEAK __attribute__ ((weak)) @@ -26,10 +27,9 @@ extern unsigned _etext, _data, _edata, _ebss, _stack; void main(void); -void reset_handler(void); void blocking_handler(void); -void null_handler(void); +void WEAK reset_handler(void); void WEAK nmi_handler(void); void WEAK hard_fault_handler(void); void WEAK mem_manage_handler(void); @@ -40,6 +40,29 @@ void WEAK debug_monitor_handler(void); void WEAK pend_sv_handler(void); void WEAK sys_tick_handler(void); +void WEAK dma_isr(void); +void WEAK gpio_even_isr(void); +void WEAK timer0_isr(void); +void WEAK usart0_rx_isr(void); +void WEAK usart0_tx_isr(void); +void WEAK acmp01_isr(void); +void WEAK adc0_isr(void); +void WEAK dac0_isr(void); +void WEAK i2c0_isr(void); +void WEAK gpio_odd_isr(void); +void WEAK timer1_isr(void); +void WEAK usart1_rx_isr(void); +void WEAK usart1_tx_isr(void); +void WEAK lesense_isr(void); +void WEAK leuart0_isr(void); +void WEAK letimer0_isr(void); +void WEAK pcnt0_isr(void); +void WEAK rtc_isr(void); +void WEAK cmu_isr(void); +void WEAK vcmp_isr(void); +void WEAK lcd_isr(void); +void WEAK msc_isr(void); +void WEAK aes_isr(void); __attribute__ ((section(".vectors"))) efm32_vector_table_t vector_table = { @@ -53,9 +76,34 @@ efm32_vector_table_t vector_table = { .sv_call = sv_call_handler, .pend_sv = pend_sv_handler, .systick = sys_tick_handler, + .irq = { + [IRQ_DMA] = dma_isr, + [IRQ_GPIO_EVEN] = gpio_even_isr, + [IRQ_TIMER0] = timer0_isr, + [IRQ_USART0_RX] = usart0_rx_isr, + [IRQ_USART0_TX] = usart0_tx_isr, + [IRQ_ACMP01] = acmp01_isr, + [IRQ_ADC0] = adc0_isr, + [IRQ_DAC0] = dac0_isr, + [IRQ_I2C0] = i2c0_isr, + [IRQ_GPIO_ODD] = gpio_odd_isr, + [IRQ_TIMER1] = timer1_isr, + [IRQ_USART1_RX] = usart1_rx_isr, + [IRQ_USART1_TX] = usart1_tx_isr, + [IRQ_LESENSE] = lesense_isr, + [IRQ_LEUART0] = leuart0_isr, + [IRQ_LETIMER0] = letimer0_isr, + [IRQ_PCNT0] = pcnt0_isr, + [IRQ_RTC] = rtc_isr, + [IRQ_CMU] = cmu_isr, + [IRQ_VCMP] = vcmp_isr, + [IRQ_LCD] = lcd_isr, + [IRQ_MSC] = msc_isr, + [IRQ_AES] = aes_isr, + } }; -void reset_handler(void) +void WEAK reset_handler(void) { volatile unsigned *src, *dest; @@ -76,17 +124,36 @@ void blocking_handler(void) while (1) ; } -void null_handler(void) -{ - /* Do nothing. */ -} - -#pragma weak nmi_handler = null_handler +#pragma weak nmi_handler = blocking_handler #pragma weak hard_fault_handler = blocking_handler #pragma weak mem_manage_handler = blocking_handler #pragma weak bus_fault_handler = blocking_handler #pragma weak usage_fault_handler = blocking_handler -#pragma weak sv_call_handler = null_handler -#pragma weak debug_monitor_handler = null_handler -#pragma weak pend_sv_handler = null_handler -#pragma weak sys_tick_handler = null_handler +#pragma weak sv_call_handler = blocking_handler +#pragma weak debug_monitor_handler = blocking_handler +#pragma weak pend_sv_handler = blocking_handler +#pragma weak sys_tick_handler = blocking_handler + +#pragma weak dma_isr = blocking_handler +#pragma weak gpio_even_isr = blocking_handler +#pragma weak timer0_isr = blocking_handler +#pragma weak usart0_rx_isr = blocking_handler +#pragma weak usart0_tx_isr = blocking_handler +#pragma weak acmp01_isr = blocking_handler +#pragma weak adc0_isr = blocking_handler +#pragma weak dac0_isr = blocking_handler +#pragma weak i2c0_isr = blocking_handler +#pragma weak gpio_odd_isr = blocking_handler +#pragma weak timer1_isr = blocking_handler +#pragma weak usart1_rx_isr = blocking_handler +#pragma weak usart1_tx_isr = blocking_handler +#pragma weak lesense_isr = blocking_handler +#pragma weak leuart0_isr = blocking_handler +#pragma weak letimer0_isr = blocking_handler +#pragma weak pcnt0_isr = blocking_handler +#pragma weak rtc_isr = blocking_handler +#pragma weak cmu_isr = blocking_handler +#pragma weak vcmp_isr = blocking_handler +#pragma weak lcd_isr = blocking_handler +#pragma weak msc_isr = blocking_handler +#pragma weak aes_isr = blocking_handler -- cgit v1.2.3