aboutsummaryrefslogtreecommitdiff
path: root/include/libopencm3
diff options
context:
space:
mode:
authorchrysn2012-10-18 12:26:41 +0200
committerchrysn2012-10-18 12:44:41 +0200
commita7f5f9f576977f97988b739fd98ff7f164edf156 (patch)
treeebc25df7e7841afde1f4c98af2f927841508956c /include/libopencm3
parent837de3ff9771ea03b5b54dda8ba7f77d404bdcdf (diff)
merge irq and nvic code using a script
Diffstat (limited to 'include/libopencm3')
-rw-r--r--include/libopencm3/efm32/tinygecko/Makefile2
-rw-r--r--include/libopencm3/efm32/tinygecko/irq.h130
-rw-r--r--include/libopencm3/efm32/tinygecko/irq.yaml28
-rwxr-xr-xinclude/libopencm3/efm32/tinygecko/irq2nvic_h92
4 files changed, 122 insertions, 130 deletions
diff --git a/include/libopencm3/efm32/tinygecko/Makefile b/include/libopencm3/efm32/tinygecko/Makefile
new file mode 100644
index 0000000..4ac5347
--- /dev/null
+++ b/include/libopencm3/efm32/tinygecko/Makefile
@@ -0,0 +1,2 @@
+nvic.h: irq.yaml
+ ./irq2nvic_h
diff --git a/include/libopencm3/efm32/tinygecko/irq.h b/include/libopencm3/efm32/tinygecko/irq.h
deleted file mode 100644
index f5263ae..0000000
--- a/include/libopencm3/efm32/tinygecko/irq.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * This file is part of the libopencm3 project.
- *
- * Copyright (C) 2012 chrysn <chrysn@fsfe.org>
- *
- * This library is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/** @file
- *
- * Definitions of interrupt names on EFM32 Tiny Gecko systems
- *
- * The names and numbers are taken from d0034_efm32tg_reference_manual.pdf table 4.1.
- */
-
-#ifndef LIBOPENCM3_EFM32_TINYGECKO_VECTOR_H
-#define LIBOPENCM3_EFM32_TINYGECKO_VECTOR_H
-
-#define IRQ_DMA 0
-#define IRQ_GPIO_EVEN 1
-#define IRQ_TIMER0 2
-#define IRQ_USART0_RX 3
-#define IRQ_USART0_TX 4
-#define IRQ_ACMP01 5
-#define IRQ_ADC0 6
-#define IRQ_DAC0 7
-#define IRQ_I2C0 8
-#define IRQ_GPIO_ODD 9
-#define IRQ_TIMER1 10
-#define IRQ_USART1_RX 11
-#define IRQ_USART1_TX 12
-#define IRQ_LESENSE 13
-#define IRQ_LEUART0 14
-#define IRQ_LETIMER0 15
-#define IRQ_PCNT0 16
-#define IRQ_RTC 17
-#define IRQ_CMU 18
-#define IRQ_VCMP 19
-#define IRQ_LCD 20
-#define IRQ_MSC 21
-#define IRQ_AES 22
-#define IRQ_COUNT 23 /**< See also d0002_efm32_cortex-m3_reference_manual.pdf's table 1.1's "number of interrupts" line, which shows that there are really no more interrupts and it is sufficient to allocate only 23 slots. */
-
-#define WEAK __attribute__ ((weak))
-
-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);
-
-#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
-
-#define IRQ_HANDLERS \
- [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,
-
-#endif
diff --git a/include/libopencm3/efm32/tinygecko/irq.yaml b/include/libopencm3/efm32/tinygecko/irq.yaml
new file mode 100644
index 0000000..16fa69c
--- /dev/null
+++ b/include/libopencm3/efm32/tinygecko/irq.yaml
@@ -0,0 +1,28 @@
+includeguard: LIBOPENCM3_EFM32_TINYGECKO_VECTOR_H
+partname_humanreadable: EFM32 Tiny Gecko series
+partname_doxygen: EFM32TG
+# The names and sequence are taken from d0034_efm32tg_reference_manual.pdf table 4.1.
+irqs:
+ - dma
+ - gpio_even
+ - timer0
+ - usart0_rx
+ - usart0_tx
+ - acmp01
+ - adc0
+ - dac0
+ - i2c0
+ - gpio_odd
+ - timer1
+ - usart1_rx
+ - usart1_tx
+ - lesense
+ - leuart0
+ - letimer0
+ - pcnt0
+ - rtc
+ - cmu
+ - vcmp
+ - lcd
+ - msc
+ - aes
diff --git a/include/libopencm3/efm32/tinygecko/irq2nvic_h b/include/libopencm3/efm32/tinygecko/irq2nvic_h
new file mode 100755
index 0000000..a7df16e
--- /dev/null
+++ b/include/libopencm3/efm32/tinygecko/irq2nvic_h
@@ -0,0 +1,92 @@
+#!/usr/bin/env python
+
+# This file is part of the libopencm3 project.
+#
+# Copyright (C) 2012 chrysn <chrysn@fsfe.org>
+#
+# This library is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Lesser General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with this library. If not, see <http://www.gnu.org/licenses/>.
+
+import sys
+import yaml
+
+template = '''\
+/* This file is part of the libopencm3 project.
+ *
+ * It was generated by the irq2nvic_h script.
+ */
+
+#ifndef {includeguard}
+#define {includeguard}
+
+/** @defgroup CM3_nvic_defines_{partname_doxygen} User interrupts for {partname_humanreadable}
+ @ingroup CM3_nvic_defines
+
+ @{{*/
+
+{irqdefinitions}
+
+#define NVIC_IRQ_COUNT {irqcount}
+
+/**@}}*/
+
+#define WEAK __attribute__ ((weak))
+
+/** @defgroup CM3_nvic_isrprototypes_{partname_doxygen} User interrupt service routines (ISR) prototypes for {partname_humanreadable}
+ @ingroup CM3_nvic_isrprototypes
+
+ @{{*/
+
+{isrprototypes}
+
+/**@}}*/
+
+/** @defgroup CM3_nvic_isrpragmas_{partname_doxygen} User interrupt service routines (ISR) defaults for {partname_humanreadable}
+ @ingroup CM3_nvic_isrpragmas
+
+ @{{*/
+
+{isrpragmas}
+
+/**@}}*/
+
+/* Initialization template for the interrupt vector table. This definition is
+ * used by the startup code generator (vector.c) to set the initial values for
+ * the interrupt handling routines to the chip family specific _isr weak
+ * symbols. */
+
+#define IRQ_HANDLERS \\
+ {vectortableinitialization}
+
+#endif /* {includeguard} */
+'''
+
+def convert(infile, outfile):
+ data = yaml.load(infile)
+
+ irq2name = list(enumerate(data['irqs']) if isinstance(data['irqs'], list) else data['irqs'].items())
+ irqnames = [v for (k,v) in irq2name]
+
+ data['irqdefinitions'] = "\n".join('#define NVIC_%s_IRQ %d'%(v.upper(),k) for (k,v) in irq2name)
+ data['irqcount'] = len(irq2name) # FIXME: what if it's a sparse dictionary?
+ data['isrprototypes'] = "\n".join('void WEAK %s_isr(void);'%name.lower() for name in irqnames)
+ data['isrpragmas'] = "\n".join('#pragma weak %s_isr = blocking_handler'%name.lower() for name in irqnames)
+ data['vectortableinitialization'] = ', \\\n '.join('[NVIC_%s_IRQ] = %s_isr'%(name.upper(), name.lower()) for name in irqnames)
+
+ outfile.write(template.format(**data))
+
+def main():
+ convert(open('irq.yaml'), open('nvic.h', 'w'))
+
+if __name__ == "__main__":
+ main()