summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/pc386/console/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/i386/pc386/console/console.c')
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/console.c346
1 files changed, 250 insertions, 96 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/console/console.c b/c/src/lib/libbsp/i386/pc386/console/console.c
index 1689f5c546..8698ea8136 100644
--- a/c/src/lib/libbsp/i386/pc386/console/console.c
+++ b/c/src/lib/libbsp/i386/pc386/console/console.c
@@ -33,10 +33,17 @@
#include <stdlib.h>
+#include <assert.h>
#include <bsp.h>
#include <irq.h>
#include <rtems/libio.h>
+#include <termios.h>
+#include <pc386uart.h>
+
+int PC386ConsolePort = PC386_CONSOLE_PORT_CONSOLE;
+
+static int conSetAttr(int minor, const struct termios *);
/*-------------------------------------------------------------------------+
| Constants
@@ -51,74 +58,25 @@ extern rtems_isr _IBMPC_keyboard_isr(rtems_vector_number);
/* keyboard (IRQ 0x01) Interrupt Service Routine (defined in 'inch.c') */
-/*-------------------------------------------------------------------------+
-| Functions
-+--------------------------------------------------------------------------*/
-/*-------------------------------------------------------------------------+
-| Function: console_cleanup
-| Description: This routine is called at exit to clean up the console
-| hardware.
-| Global Variables: None.
-| Arguments: None.
-| Returns: Nothing.
-+--------------------------------------------------------------------------*/
-void
-console_cleanup(void)
+void console_reserve_resources(rtems_configuration_table *conf)
{
- /* nothing */
-} /* console_cleanup */
-
-
-/*-------------------------------------------------------------------------+
-| Function: is_character_ready
-| Description: Check if a character is available for input, and if so
-| return it.
-| Global Variables: None.
-| Arguments: c - character read if available, otherwise unchanged.
-| Returns: TRUE if there was a character available for input,
-| FALSE otherwise.
-+--------------------------------------------------------------------------*/
-rtems_boolean
-is_character_ready(char *c)
-{
- return (_IBMPC_chrdy(c) ? TRUE : FALSE);
-} /* is_character_ready */
-
+ if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+ {
+ rtems_termios_reserve_resources(conf, 1);
+ }
+ return;
+}
-/*-------------------------------------------------------------------------+
-| Function: inbyte
-| Description: Read a character from the console (keyboard).
-| Global Variables: None.
-| Arguments: None.
-| Returns: Caracter read from the console.
-+--------------------------------------------------------------------------*/
-unsigned char
-inbyte(void)
+void __assert(const char *file, int line, const char *msg)
{
- char c = _IBMPC_inch();
-
- /* Echo character to screen */
- _IBMPC_outch(c);
- if (c == '\r')
- _IBMPC_outch('\n'); /* CR = CR + LF */
+ printk("assert failed: %s: ", file);
+ printk("%d: ", line);
+ printk("%s\n", msg);
- return c;
-} /* inbyte */
-
-
-/*-------------------------------------------------------------------------+
-| Function: outbyte
-| Description: Write a character to the console (display).
-| Global Variables: None.
-| Arguments: Character to be written.
-| Returns: Nothing.
-+--------------------------------------------------------------------------*/
-void
-outbyte(char c)
-{
- _IBMPC_outch(c);
-} /* outbyte */
+ exit(1);
+ return;
+}
/*-------------------------------------------------------------------------+
| Console device driver INITIALIZE entry point.
@@ -135,26 +93,74 @@ console_initialize(rtems_device_major_number major,
/* Initialize video */
_IBMPC_initVideo();
- /* Install keyboard interrupt handler */
- status = PC386_installRtemsIrqHandler(KEYBOARD_IRQ, _IBMPC_keyboard_isr);
-
- if (status != RTEMS_SUCCESSFUL)
- {
- printk("Error installing keyboard interrupt handler!\n");
- rtems_fatal_error_occurred(status);
- }
+ if(PC386ConsolePort == PC386_CONSOLE_PORT_CONSOLE)
+ {
- status =
- rtems_io_register_name("/dev/console", major, (rtems_device_minor_number)0);
-
- if (status != RTEMS_SUCCESSFUL)
- {
- printk("Error registering console device!\n");
- rtems_fatal_error_occurred(status);
- }
+ /* Install keyboard interrupt handler */
+ status = PC386_installRtemsIrqHandler(KEYBOARD_IRQ, _IBMPC_keyboard_isr);
+
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ printk("Error installing keyboard interrupt handler!\n");
+ rtems_fatal_error_occurred(status);
+ }
+
+ status = rtems_io_register_name("/dev/console", major, 0);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ printk("Error registering console device!\n");
+ rtems_fatal_error_occurred(status);
+ }
+ printk("Initialized console on port CONSOLE\n\n");
+ }
+ else
+ {
+ /*
+ * Set up TERMIOS
+ */
+ rtems_termios_initialize ();
+
+ /*
+ * Do device-specific initialization
+ */
+
+ /* 9600-8-N-1 */
+ PC386_uart_init(PC386ConsolePort, 9600, 0);
+
+
+ /* Set interrupt handler */
+ if(PC386ConsolePort == PC386_UART_COM1)
+ {
+ status = PC386_installRtemsIrqHandler(PC386_UART_COM1_IRQ,
+ PC386_uart_termios_isr_com1);
+ }
+ else
+ {
+ assert(PC386ConsolePort == PC386_UART_COM2);
+
+ status = PC386_installRtemsIrqHandler(PC386_UART_COM2_IRQ,
+ PC386_uart_termios_isr_com2);
+ }
+ /*
+ * Register the device
+ */
+ status = rtems_io_register_name ("/dev/console", major, 0);
+ if (status != RTEMS_SUCCESSFUL)
+ {
+ printk("Error registering console device!\n");
+ rtems_fatal_error_occurred (status);
+ }
+
+ if(PC386ConsolePort == PC386_UART_COM1)
+ {
+ printk("Initialized console on port COM1 9600-8-N-1\n\n");
+ }
+ else
+ {
+ printk("Initialized console on port COM2 9600-8-N-1\n\n");
+ }
+ }
- atexit(console_cleanup);
-
return RTEMS_SUCCESSFUL;
} /* console_initialize */
@@ -164,12 +170,51 @@ console_initialize(rtems_device_major_number major,
+--------------------------------------------------------------------------*/
rtems_device_driver
console_open(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
+ rtems_device_minor_number minor,
+ void *arg)
{
- return RTEMS_SUCCESSFUL;
-} /* console_open */
+ rtems_status_code status;
+ static rtems_termios_callbacks cb =
+ {
+ NULL, /* firstOpen */
+ NULL, /* lastClose */
+ NULL, /* pollRead */
+ PC386_uart_termios_write_com1, /* write */
+ conSetAttr, /* setAttributes */
+ NULL, /* stopRemoteTx */
+ NULL, /* startRemoteTx */
+ 1 /* outputUsesInterrupts */
+ };
+
+ if(PC386ConsolePort == PC386_CONSOLE_PORT_CONSOLE)
+ {
+ return RTEMS_SUCCESSFUL;
+ }
+ if(PC386ConsolePort == PC386_UART_COM2)
+ {
+ cb.write = PC386_uart_termios_write_com2;
+ }
+
+ status = rtems_termios_open (major, minor, arg, &cb);
+
+ if(status != RTEMS_SUCCESSFUL)
+ {
+ printk("Error openning console device\n");
+ return status;
+ }
+
+ /*
+ * Pass data area info down to driver
+ */
+ PC386_uart_termios_set(PC386ConsolePort,
+ ((rtems_libio_open_close_args_t *)arg)->iop->data1);
+
+ /* Enable interrupts on channel */
+ PC386_uart_intr_ctrl(PC386ConsolePort, PC386_UART_INTR_CTRL_TERMIOS);
+
+ return RTEMS_SUCCESSFUL;
+}
/*-------------------------------------------------------------------------+
| Console device driver CLOSE entry point
@@ -179,6 +224,11 @@ console_close(rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg)
{
+ if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+ {
+ return rtems_termios_close (arg);
+ }
+
return RTEMS_SUCCESSFUL;
} /* console_close */
@@ -196,10 +246,24 @@ console_read(rtems_device_major_number major,
rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
char *buffer = rw_args->buffer;
int count, maximum = rw_args->count;
+
+ if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+ {
+ return rtems_termios_read (arg);
+ }
for (count = 0; count < maximum; count++)
{
- buffer[count] = inbyte();
+ /* Get character */
+ buffer[count] = _IBMPC_inch_sleep();
+
+ /* Echo character to screen */
+ _IBMPC_outch(buffer[count]);
+ if (buffer[count] == '\r')
+ {
+ _IBMPC_outch('\n'); /* CR = CR + LF */
+ }
+
if (buffer[count] == '\n' || buffer[count] == '\r')
{
/* What if this goes past the end of the buffer? We're hosed. [bhc] */
@@ -227,12 +291,17 @@ console_write(rtems_device_major_number major,
rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
char *buffer = rw_args->buffer;
int count, maximum = rw_args->count;
+
+ if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+ {
+ return rtems_termios_write (arg);
+ }
for (count = 0; count < maximum; count++)
{
- outbyte(buffer[count]);
+ _IBMPC_outch(buffer[count]);
if (buffer[count] == '\n')
- outbyte('\r'); /* LF = LF + CR */
+ _IBMPC_outch('\r'); /* LF = LF + CR */
}
rw_args->bytes_moved = maximum;
@@ -240,13 +309,98 @@ console_write(rtems_device_major_number major,
} /* console_write */
-/*-------------------------------------------------------------------------+
-| Console device driver CONTROL entry point
-+--------------------------------------------------------------------------*/
-rtems_device_driver
+
+/*
+ * Handle ioctl request.
+ */
+rtems_device_driver
console_control(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
+ {
+ return rtems_termios_ioctl (arg);
+ }
+
return RTEMS_SUCCESSFUL;
-} /* console_control */
+}
+
+static int
+conSetAttr(int minor, const struct termios *t)
+{
+ int baud;
+
+ switch (t->c_cflag & CBAUD)
+ {
+ case B50:
+ baud = 50;
+ break;
+ case B75:
+ baud = 75;
+ break;
+ case B110:
+ baud = 110;
+ break;
+ case B134:
+ baud = 134;
+ break;
+ case B150:
+ baud = 150;
+ break;
+ case B200:
+ baud = 200;
+ break;
+ case B300:
+ baud = 300;
+ break;
+ case B600:
+ baud = 600;
+ break;
+ case B1200:
+ baud = 1200;
+ break;
+ case B1800:
+ baud = 1800;
+ break;
+ case B2400:
+ baud = 2400;
+ break;
+ case B4800:
+ baud = 4800;
+ break;
+ case B9600:
+ baud = 9600;
+ break;
+ case B19200:
+ baud = 19200;
+ break;
+ case B38400:
+ baud = 38400;
+ break;
+ case B57600:
+ baud = 57600;
+ break;
+ case B115200:
+ baud = 115200;
+ break;
+ default:
+ baud = 0;
+ rtems_fatal_error_occurred (RTEMS_INTERNAL_ERROR);
+ return 0;
+ }
+
+ PC386_uart_set_baud(PC386ConsolePort, baud);
+
+ return 0;
+}
+
+
+
+
+
+
+
+
+