summaryrefslogtreecommitdiffstats
path: root/c/src/libchip
diff options
context:
space:
mode:
authorJennifer Averett <Jennifer.Averett@OARcorp.com>2005-04-18 17:37:50 +0000
committerJennifer Averett <Jennifer.Averett@OARcorp.com>2005-04-18 17:37:50 +0000
commitc163605f8086c09c9007fae3d98bb379e4d75d01 (patch)
treef7949c465df1888ab08ffc90e06cfa1d5564ed92 /c/src/libchip
parent2005-04-18 Eric Valette <eric.valette@free.fr> (diff)
downloadrtems-c163605f8086c09c9007fae3d98bb379e4d75d01.tar.bz2
2005-04-18 Jennifer Averett <jennifer.averett@oarcorp.com>
* libchip/serial/ns16550.c: Modified ISR to work with PPC new exception processing
Diffstat (limited to 'c/src/libchip')
-rw-r--r--c/src/libchip/serial/ns16550.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/c/src/libchip/serial/ns16550.c b/c/src/libchip/serial/ns16550.c
index d98cd01f1f..01110f394a 100644
--- a/c/src/libchip/serial/ns16550.c
+++ b/c/src/libchip/serial/ns16550.c
@@ -67,7 +67,13 @@ console_fns ns16550_fns_polled = {
FALSE /* deviceOutputUsesInterrupts */
};
+#if defined(__PPC__)
+#ifdef _OLD_EXCEPTIONS
extern void set_vector( rtems_isr_entry, rtems_vector_number, int );
+#else
+#include <bsp/irq.h>
+#endif
+#endif
/*
* ns16550_init
@@ -510,6 +516,9 @@ NS16550_STATIC void ns16550_process(
} while((ucInterruptId&0xf)!=0x1);
}
+#if defined(__PPC__)
+#ifdef _OLD_EXCEPTIONS
+
/*
* ns16550_isr
*/
@@ -528,6 +537,26 @@ NS16550_STATIC rtems_isr ns16550_isr(
}
}
+#else
+
+NS16550_STATIC rtems_isr ns16550_isr(
+ void *entry
+)
+{
+ console_tbl *ptr = entry;
+ int minor;
+
+ for(minor=0;minor<Console_Port_Count;minor++) {
+ if( &Console_Port_Tbl[minor] == ptr ) {
+ ns16550_process(minor);
+ }
+ }
+
+}
+
+#endif
+#endif
+
/*
* ns16550_enable_interrupts
*
@@ -554,6 +583,8 @@ NS16550_STATIC void ns16550_enable_interrupts(
* This routine initializes the port to operate in interrupt driver mode.
*/
+#if defined(__PPC__)
+#ifdef _OLD_EXCEPTIONS
NS16550_STATIC void ns16550_initialize_interrupts(int minor)
{
ns16550_init(minor);
@@ -561,10 +592,42 @@ NS16550_STATIC void ns16550_initialize_interrupts(int minor)
Console_Port_Data[minor].bActive = FALSE;
set_vector(ns16550_isr, Console_Port_Tbl[minor].ulIntVector, 1);
+
+ ns16550_enable_interrupts(minor, NS16550_ENABLE_ALL_INTR);
+}
+#else
+
+static void null_fun(){}
+
+NS16550_STATIC void ns16550_initialize_interrupts(int minor)
+{
+ rtems_irq_connect_data IrqData = {0,
+ ns16550_isr,
+ &Console_Port_Data[minor],
+ (rtems_irq_enable)null_fun,
+ (rtems_irq_disable)null_fun,
+ (rtems_irq_is_enabled)null_fun,
+ NULL
+ };
+
+ ns16550_init(minor);
+
+ Console_Port_Data[minor].bActive = FALSE;
+
+ IrqData.name = (rtems_irq_symbolic_name)(
+ (unsigned int)BSP_PCI_IRQ0 + Console_Port_Tbl[minor].ulIntVector );
+
+ if (!BSP_install_rtems_shared_irq_handler (&IrqData)) {
+ printk("Error installing interrupt handler!\n");
+ rtems_fatal_error_occurred(1);
+ }
ns16550_enable_interrupts(minor, NS16550_ENABLE_ALL_INTR);
}
+#endif
+#endif
+
/*
* ns16550_write_support_int
*