diff options
author | Jennifer Averett <Jennifer.Averett@OARcorp.com> | 2005-04-18 17:37:50 +0000 |
---|---|---|
committer | Jennifer Averett <Jennifer.Averett@OARcorp.com> | 2005-04-18 17:37:50 +0000 |
commit | c163605f8086c09c9007fae3d98bb379e4d75d01 (patch) | |
tree | f7949c465df1888ab08ffc90e06cfa1d5564ed92 /c | |
parent | 2005-04-18 Eric Valette <eric.valette@free.fr> (diff) | |
download | rtems-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')
-rw-r--r-- | c/src/ChangeLog | 5 | ||||
-rw-r--r-- | c/src/libchip/serial/ns16550.c | 63 |
2 files changed, 68 insertions, 0 deletions
diff --git a/c/src/ChangeLog b/c/src/ChangeLog index 8b5fded3b5..6fd6b7600d 100644 --- a/c/src/ChangeLog +++ b/c/src/ChangeLog @@ -1,3 +1,8 @@ +2005-04-18 Jennifer Averett <jennifer.averett@oarcorp.com> + + * libchip/serial/ns16550.c: Modified + ISR to work with PPC new exception processing + 2005-03-14 Joel Sherrill <joel@OARcorp.com> * libchip/network/dec21140.c, libchip/network/elnk.c, 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 * |