summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/pc386/console
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/console.c46
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/inch.c31
2 files changed, 54 insertions, 23 deletions
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
@@ -46,16 +46,19 @@ 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