CM3: generic IRQ management module.
authorarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Tue, 13 Apr 2010 13:13:34 +0000 (13:13 +0000)
committerarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Tue, 13 Apr 2010 13:13:34 +0000 (13:13 +0000)
Define an IRQ management module generic for all the Cortex-M3 family
processors.

Moreover, automatically set the appropriate priority and enable the IRQ
when registering an ISR via sysirq_setHandler().

git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3423 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/cpu/cortex-m3/drv/irq_cm3.c [new file with mode: 0644]
bertos/cpu/cortex-m3/drv/irq_cm3.h [new file with mode: 0644]
bertos/cpu/cortex-m3/drv/irq_lm3s.c [deleted file]
bertos/cpu/cortex-m3/drv/irq_lm3s.h [deleted file]
bertos/cpu/cortex-m3/drv/timer_lm3s.c
bertos/cpu/cortex-m3/hw/init_lm3s.c
examples/lm3s1968/lm3s1968.mk

diff --git a/bertos/cpu/cortex-m3/drv/irq_cm3.c b/bertos/cpu/cortex-m3/drv/irq_cm3.c
new file mode 100644 (file)
index 0000000..a21439a
--- /dev/null
@@ -0,0 +1,127 @@
+/**
+ * \file
+ * <!--
+ * This file is part of BeRTOS.
+ *
+ * Bertos 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; 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * As a special exception, you may use this file as part of a free software
+ * library without restriction.  Specifically, if other files instantiate
+ * templates or use macros or inline functions from this file, or you compile
+ * this file and link it with other files to produce an executable, this
+ * file does not by itself cause the resulting executable to be covered by
+ * the GNU General Public License.  This exception does not however
+ * invalidate any other reasons why the executable file might be covered by
+ * the GNU General Public License.
+ *
+ * Copyright 2010 Develer S.r.l. (http://www.develer.com/)
+ *
+ * -->
+ *
+ * \brief Cortex-M3 IRQ management.
+ *
+ * \author Andrea Righi <arighi@develer.com>
+ */
+
+#include <cfg/debug.h> /* ASSERT() */
+#include <cfg/log.h> /* LOG_ERR() */
+#include <cpu/irq.h>
+#include "irq_cm3.h"
+
+static void (*irq_table[NUM_INTERRUPTS])(void)
+                       __attribute__((section("vtable")));
+
+/* Priority register / IRQ number table */
+static const uint32_t nvic_prio_reg[] =
+{
+       /* System exception registers */
+       0, NVIC_SYS_PRI1, NVIC_SYS_PRI2, NVIC_SYS_PRI3,
+
+       /* External interrupts registers */
+       NVIC_PRI0, NVIC_PRI1, NVIC_PRI2, NVIC_PRI3,
+       NVIC_PRI4, NVIC_PRI5, NVIC_PRI6, NVIC_PRI7,
+       NVIC_PRI8, NVIC_PRI9, NVIC_PRI10, NVIC_PRI11,
+       NVIC_PRI12, NVIC_PRI13
+};
+
+/* Unhandled IRQ */
+static NAKED NORETURN void unhandled_isr(void)
+{
+       register uint32_t reg;
+
+       asm volatile ("mrs %0, ipsr" : "=r"(reg));
+       LOG_ERR("unhandled IRQ %lu\n", reg);
+       while (1)
+               PAUSE;
+}
+
+void sysirq_setPriority(sysirq_t irq, int prio)
+{
+       uint32_t pos = (irq & 3) * 8;
+       reg32_t reg = nvic_prio_reg[irq >> 2];
+       uint32_t val;
+
+       val = HWREG(reg);
+       val &= ~(0xff << pos);
+       val |= prio << pos;
+       HWREG(reg) = val;
+}
+
+static void sysirq_enable(sysirq_t irq)
+{
+       /* Enable the IRQ line (only for generic IRQs) */
+       if (irq >= 16 && irq < 48)
+               HWREG(NVIC_EN0) = 1 << (irq - 16);
+       else if (irq >= 48)
+               HWREG(NVIC_EN1) = 1 << (irq - 48);
+}
+
+void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler)
+{
+       cpu_flags_t flags;
+
+       ASSERT(irq < NUM_INTERRUPTS);
+
+       IRQ_SAVE_DISABLE(flags);
+       irq_table[irq] = handler;
+       sysirq_setPriority(irq, IRQ_PRIO);
+       sysirq_enable(irq);
+       IRQ_RESTORE(flags);
+}
+
+void sysirq_freeHandler(sysirq_t irq)
+{
+       cpu_flags_t flags;
+
+       ASSERT(irq < NUM_INTERRUPTS);
+
+       IRQ_SAVE_DISABLE(flags);
+       irq_table[irq] = unhandled_isr;
+       IRQ_RESTORE(flags);
+}
+
+void sysirq_init(void)
+{
+       cpu_flags_t flags;
+       int i;
+
+       IRQ_SAVE_DISABLE(flags);
+       for (i = 0; i < NUM_INTERRUPTS; i++)
+               irq_table[i] = unhandled_isr;
+
+       /* Update NVIC to point to the new vector table */
+       HWREG(NVIC_VTABLE) = (size_t)irq_table;
+       IRQ_RESTORE(flags);
+}
diff --git a/bertos/cpu/cortex-m3/drv/irq_cm3.h b/bertos/cpu/cortex-m3/drv/irq_cm3.h
new file mode 100644 (file)
index 0000000..a3f2ded
--- /dev/null
@@ -0,0 +1,57 @@
+/**
+ * \file
+ * <!--
+ * This file is part of BeRTOS.
+ *
+ * Bertos 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; 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
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * As a special exception, you may use this file as part of a free software
+ * library without restriction.  Specifically, if other files instantiate
+ * templates or use macros or inline functions from this file, or you compile
+ * this file and link it with other files to produce an executable, this
+ * file does not by itself cause the resulting executable to be covered by
+ * the GNU General Public License.  This exception does not however
+ * invalidate any other reasons why the executable file might be covered by
+ * the GNU General Public License.
+ *
+ * Copyright 2010 Develer S.r.l. (http://www.develer.com/)
+ *
+ * -->
+ *
+ * \brief IRQ management for the Cortex-M3 processor.
+ *
+ * \author Andrea Righi <arighi@develer.com>
+ */
+
+#ifndef DRV_CORTEX_M3_SYSIRQ_H
+#define DRV_CORTEX_M3_SYSIRQ_H
+
+#if CPU_CM3_LM3S
+       #include <io/lm3s.h>
+/*#elif  Add other families here */
+#else
+       #error Unknown CPU
+#endif
+
+typedef void (*sysirq_handler_t)(void);
+typedef unsigned int sysirq_t;
+
+void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler);
+void sysirq_setPriority(sysirq_t irq, int prio);
+void sysirq_freeHandler(sysirq_t irq);
+
+void sysirq_init(void);
+
+#endif /* DRV_CORTEX_M3_SYSIRQ_H */
diff --git a/bertos/cpu/cortex-m3/drv/irq_lm3s.c b/bertos/cpu/cortex-m3/drv/irq_lm3s.c
deleted file mode 100644 (file)
index 98112ca..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * \file
- * <!--
- * This file is part of BeRTOS.
- *
- * Bertos 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; 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
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- * As a special exception, you may use this file as part of a free software
- * library without restriction.  Specifically, if other files instantiate
- * templates or use macros or inline functions from this file, or you compile
- * this file and link it with other files to produce an executable, this
- * file does not by itself cause the resulting executable to be covered by
- * the GNU General Public License.  This exception does not however
- * invalidate any other reasons why the executable file might be covered by
- * the GNU General Public License.
- *
- * Copyright 2010 Develer S.r.l. (http://www.develer.com/)
- *
- * -->
- *
- * \brief Cortex-M3 IRQ management.
- *
- * \author Andrea Righi <arighi@develer.com>
- */
-
-#include <cfg/debug.h> /* ASSERT() */
-#include <cfg/log.h> /* LOG_ERR() */
-#include <cpu/irq.h>
-#include <io/lm3s.h>
-#include "irq_lm3s.h"
-
-static void (*irq_table[NUM_INTERRUPTS])(void)
-                       __attribute__((section("vtable")));
-
-/* Unhandled IRQ */
-static NAKED NORETURN void unhandled_isr(void)
-{
-       register uint32_t reg;
-
-       asm volatile ("mrs %0, ipsr" : "=r"(reg));
-       LOG_ERR("unhandled IRQ %lu\n", reg);
-       while (1)
-               PAUSE;
-}
-
-void sysirq_setPriority(sysirq_t irq, int prio)
-{
-       uint32_t pos = (irq & 3) * 8;
-       reg32_t reg;
-
-       switch (irq >> 2)
-       {
-       case 1:
-               reg = NVIC_SYS_PRI1;
-               break;
-       case 2:
-               reg = NVIC_SYS_PRI2;
-               break;
-       case 3:
-               reg = NVIC_SYS_PRI3;
-               break;
-       default:
-               ASSERT(0);
-               return;
-       }
-       HWREG(reg) &= ~(0xff << pos);
-       HWREG(reg) |= prio << pos;
-}
-
-void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler)
-{
-       cpu_flags_t flags;
-
-       ASSERT(irq < NUM_INTERRUPTS);
-
-       IRQ_SAVE_DISABLE(flags);
-       irq_table[irq] = handler;
-       sysirq_setPriority(irq, IRQ_PRIO);
-       IRQ_RESTORE(flags);
-}
-
-void sysirq_freeHandler(sysirq_t irq)
-{
-       cpu_flags_t flags;
-
-       ASSERT(irq < NUM_INTERRUPTS);
-
-       IRQ_SAVE_DISABLE(flags);
-       irq_table[irq] = unhandled_isr;
-       IRQ_RESTORE(flags);
-}
-
-void sysirq_init(void)
-{
-       cpu_flags_t flags;
-       int i;
-
-       IRQ_SAVE_DISABLE(flags);
-       for (i = 0; i < NUM_INTERRUPTS; i++)
-               irq_table[i] = unhandled_isr;
-
-       /* Update NVIC to point to the new vector table */
-       HWREG(NVIC_VTABLE) = (size_t)irq_table;
-       IRQ_RESTORE(flags);
-}
diff --git a/bertos/cpu/cortex-m3/drv/irq_lm3s.h b/bertos/cpu/cortex-m3/drv/irq_lm3s.h
deleted file mode 100644 (file)
index 8913183..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-/**
- * \file
- * <!--
- * This file is part of BeRTOS.
- *
- * Bertos 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; 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
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- * As a special exception, you may use this file as part of a free software
- * library without restriction.  Specifically, if other files instantiate
- * templates or use macros or inline functions from this file, or you compile
- * this file and link it with other files to produce an executable, this
- * file does not by itself cause the resulting executable to be covered by
- * the GNU General Public License.  This exception does not however
- * invalidate any other reasons why the executable file might be covered by
- * the GNU General Public License.
- *
- * Copyright 2010 Develer S.r.l. (http://www.develer.com/)
- *
- * -->
- *
- * \brief IRQ management for the Cortex M3 processor.
- *
- * \author Andrea Righi <arighi@develer.com>
- */
-
-#ifndef DRV_CORTEX_M3_SYSIRQ_H
-#define DRV_CORTEX_M3_SYSIRQ_H
-
-typedef void (*sysirq_handler_t)(void);
-typedef unsigned int sysirq_t;
-
-void sysirq_setHandler(sysirq_t irq, sysirq_handler_t handler);
-void sysirq_setPriority(sysirq_t irq, int prio);
-void sysirq_freeHandler(sysirq_t irq);
-
-void sysirq_init(void);
-
-#endif /* DRV_CORTEX_M3_SYSIRQ_H */
index 096bff92cbb6c6bc98d6e7c375a1db87b9f14e11..49b9fa8ec2e6ff373034424b40b669735350ab08 100644 (file)
@@ -38,7 +38,7 @@
 #include <cfg/debug.h>
 #include <cpu/irq.h>
 #include <io/lm3s.h>
-#include <drv/irq_lm3s.h>
+#include <drv/irq_cm3.h>
 #include "timer_lm3s.h"
 
 INLINE void timer_hw_setPeriod(unsigned long period)
index caac9d0905cfcf5608603942fab56ebb4e610ff1..0c0a05b79b25dc6345a710c11b87efc13e1e44e4 100644 (file)
@@ -42,7 +42,7 @@
 #include <cpu/attr.h> /* PAUSE */
 #include <cpu/irq.h> /* IRQ_DISABLE */
 #include <cpu/types.h>
-#include <drv/irq_lm3s.h>
+#include <drv/irq_cm3.h>
 #include <drv/clock_lm3s.h>
 #include <io/lm3s.h>
 #include "switch_ctx_cm3.h"
index dbbea22b9c6ad6dd8e18d25a973ec4de14b27f07..e90b31d1fc1bed23397628a1a9b66ff9c2780b49 100644 (file)
@@ -41,11 +41,11 @@ lm3s1968_CSRC = \
        bertos/kern/preempt.c \
        bertos/kern/signal.c \
        bertos/cpu/cortex-m3/drv/gpio_lm3s.c \
-       bertos/cpu/cortex-m3/drv/irq_lm3s.c \
        bertos/cpu/cortex-m3/drv/timer_lm3s.c \
        bertos/cpu/cortex-m3/drv/clock_lm3s.c \
        bertos/cpu/cortex-m3/drv/kdebug_lm3s.c \
        bertos/cpu/cortex-m3/drv/ssi_lm3s.c \
+       bertos/cpu/cortex-m3/drv/irq_cm3.c \
        bertos/cpu/cortex-m3/hw/switch_ctx_cm3.c \
        bertos/cpu/cortex-m3/hw/init_lm3s.c