summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/arm/edb7312/irq/irq.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-04-30 14:48:52 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-04-30 14:48:52 +0000
commit6e6886d5812e9824a7402bee7362ed5da80c452e (patch)
treee9fc092d1882d26d703efdb648fc20f63c4c6e86 /c/src/lib/libbsp/arm/edb7312/irq/irq.c
parent2010-04-30 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-6e6886d5812e9824a7402bee7362ed5da80c452e.tar.bz2
2010-04-30 Sebastian Huber <sebastian.huber@embedded-brains.de>
* irq/bsp_irq_init.c: Removed file. * Makefile.am, preinstall.am: Reflect change above. Added generic interrupt support modules. * include/bsp.h: Define BSP_FEATURE_IRQ_EXTENSION. * startup/bspstart.c, irq/bsp_irq_asm.S, clock/clockdrv.c, network/network.c: Interrupt support changes.
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/arm/edb7312/irq/irq.c230
1 files changed, 131 insertions, 99 deletions
diff --git a/c/src/lib/libbsp/arm/edb7312/irq/irq.c b/c/src/lib/libbsp/arm/edb7312/irq/irq.c
index 6232a1913c..1f3d1f7211 100644
--- a/c/src/lib/libbsp/arm/edb7312/irq/irq.c
+++ b/c/src/lib/libbsp/arm/edb7312/irq/irq.c
@@ -1,6 +1,8 @@
/*
* Cirrus EP7312 Intererrupt handler
*
+ * Copyright (c) 2010 embedded brains GmbH.
+ *
* Copyright (c) 2002 by Jay Monkman <jtm@smoothsmoothie.com>
*
* Copyright (c) 2002 by Charlie Steader <charlies@poliac.com>
@@ -13,141 +15,171 @@
*
* $Id$
*/
+
#include <bsp.h>
-#include <irq.h>
-#include <rtems/score/thread.h>
-#include <rtems/score/apiext.h>
-#include <ep7312.h>
+#include <bsp/irq.h>
+#include <bsp/irq-generic.h>
-/*
- * This function check that the value given for the irq line
- * is valid.
- */
+#include <ep7312.h>
-static int isValidInterrupt(int irq)
+void edb7312_interrupt_dispatch(rtems_vector_number vector)
{
- if ( (irq < 0) || (irq > BSP_MAX_INT))
- return 0;
- return 1;
+ bsp_interrupt_handler_dispatch(vector);
}
-/*
- * -------------------- RTEMS Single Irq Handler Mngt Routines ----------------
- */
-
-int BSP_install_rtems_irq_handler (const rtems_irq_connect_data* irq)
+rtems_status_code bsp_interrupt_vector_enable(rtems_vector_number vector)
{
- rtems_irq_hdl *HdlTable;
- rtems_interrupt_level level;
-
- if (!isValidInterrupt(irq->name)) {
- return 0;
- }
- /*
- * Check if default handler is actually connected. If not issue an error.
- */
- HdlTable = (rtems_irq_hdl *) VECTOR_TABLE;
- if (*(HdlTable + irq->name) != default_int_handler) {
- return 0;
- }
-
- rtems_interrupt_disable(level);
-
- /*
- * store the new handler
- */
- *(HdlTable + irq->name) = irq->hdl;
-
- /*
- * unmask interrupt
- */
- if(irq->name >= BSP_EXTFIQ && irq->name <= BSP_SSEOTI)
+ if(vector >= BSP_EXTFIQ && vector <= BSP_SSEOTI)
{
/* interrupt managed by INTMR1 and INTSR1 */
- *EP7312_INTMR1 |= (1 << irq->name);
+ *EP7312_INTMR1 |= (1 << vector);
}
- else if(irq->name >= BSP_KBDINT && irq->name <= BSP_SS2TX)
+ else if(vector >= BSP_KBDINT && vector <= BSP_SS2TX)
{
/* interrupt managed by INTMR2 and INTSR2 */
- *EP7312_INTMR2 |= (1 << (irq->name - 16));
+ *EP7312_INTMR2 |= (1 << (vector - 16));
}
- else if(irq->name >= BSP_UTXINT2 && irq->name <= BSP_URXINT2)
+ else if(vector >= BSP_UTXINT2 && vector <= BSP_URXINT2)
{
/* interrupt managed by INTMR2 and INTSR2 */
- *EP7312_INTMR2 |= (1 << (irq->name - 7));
+ *EP7312_INTMR2 |= (1 << (vector - 7));
}
- else if(irq->name == BSP_DAIINT)
+ else if(vector == BSP_DAIINT)
{
/* interrupt managed by INTMR3 and INTSR3 */
- *EP7312_INTMR3 |= (1 << (irq->name - 21));
+ *EP7312_INTMR3 |= (1 << (vector - 21));
}
- /*
- * Enable interrupt on device
- */
- if(irq->on)
- {
- irq->on(irq);
- }
-
- rtems_interrupt_enable(level);
-
- return 1;
+ return RTEMS_SUCCESSFUL;
}
-int BSP_remove_rtems_irq_handler (const rtems_irq_connect_data* irq)
+rtems_status_code bsp_interrupt_vector_disable(rtems_vector_number vector)
{
- rtems_irq_hdl *HdlTable;
- rtems_interrupt_level level;
-
- if (!isValidInterrupt(irq->name)) {
- return 0;
- }
- /*
- * Check if the handler is actually connected. If not issue an error.
- */
- HdlTable = (rtems_irq_hdl *) VECTOR_TABLE;
- if (*(HdlTable + irq->name) != irq->hdl) {
- return 0;
- }
- rtems_interrupt_disable(level);
-
- /*
- * mask interrupt
- */
- if(irq->name >= BSP_EXTFIQ && irq->name <= BSP_SSEOTI)
+ if(vector >= BSP_EXTFIQ && vector <= BSP_SSEOTI)
{
/* interrupt managed by INTMR1 and INTSR1 */
- *EP7312_INTMR1 &= ~(1 << irq->name);
+ *EP7312_INTMR1 &= ~(1 << vector);
}
- else if(irq->name >= BSP_KBDINT && irq->name <= BSP_SS2TX)
+ else if(vector >= BSP_KBDINT && vector <= BSP_SS2TX)
{
/* interrupt managed by INTMR2 and INTSR2 */
- *EP7312_INTMR2 &= ~(1 << (irq->name - 16));
+ *EP7312_INTMR2 &= ~(1 << (vector - 16));
}
- else if(irq->name >= BSP_UTXINT2 && irq->name <= BSP_URXINT2)
+ else if(vector >= BSP_UTXINT2 && vector <= BSP_URXINT2)
{
/* interrupt managed by INTMR2 and INTSR2 */
- *EP7312_INTMR2 &= ~(1 << (irq->name - 7));
+ *EP7312_INTMR2 &= ~(1 << (vector - 7));
}
- else if(irq->name == BSP_DAIINT)
+ else if(vector == BSP_DAIINT)
{
/* interrupt managed by INTMR3 and INTSR3 */
- *EP7312_INTMR3 &= ~(1 << (irq->name - 21));
+ *EP7312_INTMR3 &= ~(1 << (vector - 21));
}
- /*
- * Disable interrupt on device
- */
- if(irq->off)
- irq->off(irq);
-
- /*
- * restore the default irq value
- */
- *(HdlTable + irq->name) = default_int_handler;
+ return RTEMS_SUCCESSFUL;
+}
- rtems_interrupt_enable(level);
+rtems_status_code bsp_interrupt_facility_initialize(void)
+{
+ uint32_t int_stat = 0;
+
+ /* mask all interrupts */
+ *EP7312_INTMR1 = 0x0;
+ *EP7312_INTMR2 = 0x0;
+ *EP7312_INTMR3 = 0x0;
+
+ /* clear all pending interrupt status' */
+ int_stat = *EP7312_INTSR1;
+ if(int_stat & EP7312_INTR1_EXTFIQ)
+ {
+ }
+ if(int_stat & EP7312_INTR1_BLINT)
+ {
+ *EP7312_BLEOI = 0xFFFFFFFF;
+ }
+ if(int_stat & EP7312_INTR1_WEINT)
+ {
+ *EP7312_TEOI = 0xFFFFFFFF;
+ }
+ if(int_stat & EP7312_INTR1_MCINT)
+ {
+ }
+ if(int_stat & EP7312_INTR1_CSINT)
+ {
+ *EP7312_COEOI = 0xFFFFFFFF;
+ }
+ if(int_stat & EP7312_INTR1_EINT1)
+ {
+ }
+ if(int_stat & EP7312_INTR1_EINT2)
+ {
+ }
+ if(int_stat & EP7312_INTR1_EINT3)
+ {
+ }
+ if(int_stat & EP7312_INTR1_TC1OI)
+ {
+ *EP7312_TC1EOI = 0xFFFFFFFF;
+ }
+ if(int_stat & EP7312_INTR1_TC2OI)
+ {
+ *EP7312_TC2EOI = 0xFFFFFFFF;
+ }
+ if(int_stat & EP7312_INTR1_RTCMI)
+ {
+ *EP7312_RTCEOI = 0xFFFFFFFF;
+ }
+ if(int_stat & EP7312_INTR1_TINT)
+ {
+ *EP7312_TEOI = 0xFFFFFFFF;
+ }
+ if(int_stat & EP7312_INTR1_URXINT1)
+ {
+ }
+ if(int_stat & EP7312_INTR1_UTXINT1)
+ {
+ }
+ if(int_stat & EP7312_INTR1_UMSINT)
+ {
+ *EP7312_UMSEOI = 0xFFFFFFFF;
+ }
+ if(int_stat & EP7312_INTR1_SSEOTI)
+ {
+ *EP7312_SYNCIO;
+ }
+ int_stat = *EP7312_INTSR1;
+
+ int_stat = *EP7312_INTSR2;
+ if(int_stat & EP7312_INTR2_KBDINT)
+ {
+ *EP7312_KBDEOI = 0xFFFFFFFF;
+ }
+ if(int_stat & EP7312_INTR2_SS2RX)
+ {
+ }
+ if(int_stat & EP7312_INTR2_SS2TX)
+ {
+ }
+ if(int_stat & EP7312_INTR2_URXINT2)
+ {
+ }
+ if(int_stat & EP7312_INTR2_UTXINT2)
+ {
+ }
+ int_stat = *EP7312_INTSR2;
+
+ int_stat = *EP7312_INTSR3;
+ if(int_stat & EP7312_INTR2_DAIINT)
+ {
+ }
+ int_stat = *EP7312_INTSR3;
+
+ _CPU_ISR_install_vector(ARM_EXCEPTION_IRQ, arm_exc_interrupt, NULL);
+
+ return RTEMS_SUCCESSFUL;
+}
- return 1;
+void bsp_interrupt_handler_default(rtems_vector_number vector)
+{
+ printk("spurious interrupt: %u\n", vector);
}