From 67a2288991ce3662a588ee83c0bea9c9efae5f1e Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 23 Jul 1998 22:02:34 +0000 Subject: Patch from Eric VALETTE : Here is a enhanced version of my previous patch. This patch enables to potentially share the new interrupt management code for all Intel targets (pc386, go32 and force386) bsp. Note : this patch is complete only for pc386. It still needs to be completed for go32 and force386. I carrefully checked that anything needed is in for force386 (only some function name changes for IDT manipulation and GDT segment manipulation). But anyway I will not be able to test any of theses targets... --- c/src/lib/libbsp/i386/pc386/console/console.c | 46 ++++++++++++++++----------- 1 file changed, 27 insertions(+), 19 deletions(-) (limited to 'c/src/lib/libbsp/i386/pc386/console/console.c') diff --git a/c/src/lib/libbsp/i386/pc386/console/console.c b/c/src/lib/libbsp/i386/pc386/console/console.c index 29ec37ec56..c8d9a2c4f4 100644 --- a/c/src/lib/libbsp/i386/pc386/console/console.c +++ b/c/src/lib/libbsp/i386/pc386/console/console.c @@ -45,17 +45,20 @@ int PC386ConsolePort = PC386_CONSOLE_PORT_CONSOLE; static int conSetAttr(int minor, const struct termios *); -/*-------------------------------------------------------------------------+ -| Constants -+--------------------------------------------------------------------------*/ -#define KEYBOARD_IRQ 0x01 /* Keyboard IRQ. */ - - /*-------------------------------------------------------------------------+ | External Prototypes +--------------------------------------------------------------------------*/ -extern rtems_isr _IBMPC_keyboard_isr(rtems_vector_number); - /* keyboard (IRQ 0x01) Interrupt Service Routine (defined in 'inch.c') */ +extern void _IBMPC_keyboard_isr(void); +extern void _IBMPC_keyboard_isr_on(const rtems_irq_connect_data*); +extern void _IBMPC_keyboard_isr_off(const rtems_irq_connect_data*); +extern int _IBMPC_keyboard_isr_is_on(const rtems_irq_connect_data*); + +static rtems_irq_connect_data console_isr_data = {PC_386_KEYBOARD, + _IBMPC_keyboard_isr, + _IBMPC_keyboard_isr_on, + _IBMPC_keyboard_isr_off, + _IBMPC_keyboard_isr_is_on}; + extern rtems_boolean _IBMPC_scankey(char *); /* defined in 'inch.c' */ @@ -164,9 +167,9 @@ console_initialize(rtems_device_major_number major, { /* Install keyboard interrupt handler */ - status = PC386_installRtemsIrqHandler(KEYBOARD_IRQ, _IBMPC_keyboard_isr); - - if (status != RTEMS_SUCCESSFUL) + status = pc386_install_rtems_irq_handler(&console_isr_data); + + if (!status) { printk("Error installing keyboard interrupt handler!\n"); rtems_fatal_error_occurred(status); @@ -198,16 +201,18 @@ console_initialize(rtems_device_major_number major, /* Set interrupt handler */ if(PC386ConsolePort == PC386_UART_COM1) { - status = PC386_installRtemsIrqHandler(PC386_UART_COM1_IRQ, - PC386_uart_termios_isr_com1); + console_isr_data.name = PC386_UART_COM1_IRQ; + console_isr_data.hdl = PC386_uart_termios_isr_com1; + } else { assert(PC386ConsolePort == PC386_UART_COM2); - - status = PC386_installRtemsIrqHandler(PC386_UART_COM2_IRQ, - PC386_uart_termios_isr_com2); + console_isr_data.name = PC386_UART_COM2_IRQ; + console_isr_data.hdl = PC386_uart_termios_isr_com2; } + + status =pc386_install_rtems_irq_handler(&console_isr_data); /* * Register the device */ @@ -291,12 +296,15 @@ console_close(rtems_device_major_number major, rtems_device_minor_number minor, void *arg) { + rtems_device_driver res = RTEMS_SUCCESSFUL; + if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE) { - return rtems_termios_close (arg); + res = rtems_termios_close (arg); } - - return RTEMS_SUCCESSFUL; + pc386_remove_rtems_irq_handler (&console_isr_data); + + return res; } /* console_close */ -- cgit v1.2.3