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 ++++++++++++++++----------- c/src/lib/libbsp/i386/pc386/console/inch.c | 31 +++++++++++++++--- 2 files changed, 54 insertions(+), 23 deletions(-) (limited to 'c/src/lib/libbsp/i386/pc386/console') 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 */ diff --git a/c/src/lib/libbsp/i386/pc386/console/inch.c b/c/src/lib/libbsp/i386/pc386/console/inch.c index 9159e62ab4..39c29f93e0 100644 --- a/c/src/lib/libbsp/i386/pc386/console/inch.c +++ b/c/src/lib/libbsp/i386/pc386/console/inch.c @@ -210,6 +210,17 @@ _IBMPC_scankey(char *outChar) return TRUE; } /* _IBMPC_scankey */ +void _IBMPC_keyboard_isr_on(const rtems_irq_connect_data* unused) +{} +void _IBMPC_keyboard_isr_off(const rtems_irq_connect_data* unused) +{} + +int _IBMPC_keyboard_isr_is_on(const rtems_irq_connect_data* irq) +{ + return pc386_irq_enabled_at_i8259s (irq->name); +} + + /*-------------------------------------------------------------------------+ | Function: _IBMPC_keyboard_isr @@ -218,8 +229,7 @@ _IBMPC_scankey(char *outChar) | Arguments: vector - standard RTEMS argument - see documentation. | Returns: standard return value - see documentation. +--------------------------------------------------------------------------*/ -rtems_isr -_IBMPC_keyboard_isr(rtems_vector_number vector) +void _IBMPC_keyboard_isr() { if (_IBMPC_scankey(&kbd_buffer[kbd_last])) { @@ -231,8 +241,6 @@ _IBMPC_keyboard_isr(rtems_vector_number vector) kbd_last = next; } } - - PC386_ackIrq(vector - PC386_IRQ_VECTOR_BASE); /* Mark interrupt as handled. */ } /* _IBMPC_keyboard_isr */ @@ -281,6 +289,21 @@ _IBMPC_inch(void) return c; } /* _IBMPC_inch */ + + /* + * Routine that can be used before interrupt management is initialized. + */ + +char +debugPollingGetChar(void) +{ + char c; + while (!_IBMPC_scankey(&c)) + continue; + + return c; +} + /*-------------------------------------------------------------------------+ | Function: _IBMPC_inch_sleep | Description: If charcter is ready return it, otherwise sleep until -- cgit v1.2.3