summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/pc386/console/console.c
diff options
context:
space:
mode:
authorJennifer Averett <Jennifer.Averett@OARcorp.com>2012-02-01 14:32:28 -0600
committerJoel Sherrill <joel.sherrill@oarcorp.com>2012-02-01 14:32:28 -0600
commit441b90e6c950cff5ecb63ebf8308e0a755d1a2bb (patch)
tree3d10d20754dbd8affec36de47c95e9db453fc237 /c/src/lib/libbsp/i386/pc386/console/console.c
parentFix spelling error and improve comment. (diff)
downloadrtems-441b90e6c950cff5ecb63ebf8308e0a755d1a2bb.tar.bz2
Correct run-time selection of console port.
This was broken by conversion of console driver to libchip style.
Diffstat (limited to 'c/src/lib/libbsp/i386/pc386/console/console.c')
-rw-r--r--c/src/lib/libbsp/i386/pc386/console/console.c543
1 files changed, 0 insertions, 543 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/console/console.c b/c/src/lib/libbsp/i386/pc386/console/console.c
deleted file mode 100644
index 97e8b8f759..0000000000
--- a/c/src/lib/libbsp/i386/pc386/console/console.c
+++ /dev/null
@@ -1,543 +0,0 @@
-/*-------------------------------------------------------------------------+
-| This file contains the PC386 console I/O package.
-+--------------------------------------------------------------------------+
-| (C) Copyright 1997 -
-| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
-|
-| http://pandora.ist.utl.pt
-|
-| Instituto Superior Tecnico * Lisboa * PORTUGAL
-+--------------------------------------------------------------------------+
-| Disclaimer:
-|
-| This file is provided "AS IS" without warranty of any kind, either
-| expressed or implied.
-+--------------------------------------------------------------------------+
-| This code was based on code from the go32 BSP and was copyright by OAR.
-| Subsequent modifications are also copyright OAR.
-|
-| COPYRIGHT (c) 1989-2011.
-| On-Line Applications Research Corporation (OAR).
-|
-| The license and distribution terms for this file may be
-| found in the file LICENSE in this distribution or at
-| http://www.rtems.com/license/LICENSE.
-|
-|
-| $Id$
-+--------------------------------------------------------------------------*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <unistd.h>
-
-#include <bsp.h>
-#include <bsp/irq.h>
-#include <rtems/libio.h>
-#include <termios.h>
-#include <rtems/termiostypes.h>
-#include <uart.h>
-#include <libcpu/cpuModel.h>
-
-#include <rtems/mw_uid.h>
-#include <rtems/mouse_parser.h>
-#include <rtems/keyboard.h>
-
-/*
- * Possible value for console input/output :
- * BSP_CONSOLE_PORT_CONSOLE
- * BSP_UART_COM1
- * BSP_UART_COM2
- *
- * Note:
- * 1. Currently BSPPrintkPort, cannot be assigned to COM2,
- * it will be fixed soon.
- *
- * 2. If both BSPConsolePort and BSPPrintkport are assigned
- * to same serial device it does not work that great
- */
-
-#if (USE_COM1_AS_CONSOLE == 1)
-int BSPConsolePort = BSP_UART_COM1;
-int BSPPrintkPort = BSP_UART_COM1;
-#else
-int BSPConsolePort = BSP_CONSOLE_PORT_CONSOLE;
-int BSPPrintkPort = BSP_CONSOLE_PORT_CONSOLE;
-#endif
-
-int BSPBaseBaud = 115200;
-int BSPCmdBaud = 9600;
-
-
-/* printk support */
-BSP_output_char_function_type BSP_output_char =
- (BSP_output_char_function_type) _IBMPC_outch;
-
-BSP_polling_getchar_function_type BSP_poll_char = BSP_wait_polled_input;
-
-/*-------------------------------------------------------------------------+
-| External Prototypes
-+--------------------------------------------------------------------------*/
-static int conSetAttr(int minor, const struct termios *);
-
-/*
- * Keyboard Interrupt Configuration
- */
-static void
-isr_on(const rtems_irq_connect_data *unused)
-{
- return;
-}
-
-static void
-isr_off(const rtems_irq_connect_data *unused)
-{
- return;
-}
-
-static int
-isr_is_on(const rtems_irq_connect_data *irq)
-{
- return BSP_irq_enabled_at_i8259s(irq->name);
-}
-
-static rtems_irq_connect_data console_isr_data =
- {BSP_KEYBOARD,
- keyboard_interrupt,
- 0,
- isr_on,
- isr_off,
- isr_is_on};
-
-static ssize_t
-ibmpc_console_write(int minor, const char *buf, size_t len)
-{
- size_t count;
- for (count = 0; count < len; count++)
- {
- _IBMPC_outch( buf[ count ] );
- if( buf[ count ] == '\n')
- _IBMPC_outch( '\r' ); /* LF = LF + CR */
- }
- return count;
-}
-
-int kbd_poll_read( int minor )
-{
- if( rtems_kbpoll() )
- {
- int c = getch();
- return c;
- }
- return -1;
-}
-
-/* provide default that does nothing */
-extern void
-BSP_runtime_console_select(int *, int *) __attribute__((weak));
-
-/* provide routine to select console; this
- * is called very early so that early boot
- * messages also make it to the redirected
- * device.
- */
-void
-BSP_console_select(void)
-{
- const char* opt;
-
- /*
- * Check the command line for the type of mode the console is.
- */
- opt = bsp_cmdline_arg ("--console=");
-
- if (opt)
- {
- const char* comma;
-
- opt += sizeof ("--console=") - 1;
- if (strncmp (opt, "console", sizeof ("console") - 1) == 0)
- {
- BSPConsolePort = BSP_CONSOLE_PORT_CONSOLE;
- BSPPrintkPort = BSP_CONSOLE_PORT_CONSOLE;
- }
- else if (strncmp (opt, "com1", sizeof ("com1") - 1) == 0)
- {
- BSPConsolePort = BSP_UART_COM1;
- BSPPrintkPort = BSP_UART_COM1;
- }
- else if (strncmp (opt, "com2", sizeof ("com2") - 1) == 0)
- {
- BSPConsolePort = BSP_UART_COM2;
- BSPPrintkPort = BSP_UART_COM2;
- }
-
- comma = strchr (opt, ',');
-
- if (comma)
- {
- comma += 1;
- if (strncmp (opt, "115200", sizeof ("115200") - 1) == 0)
- BSPCmdBaud = 115200;
- else if (strncmp (opt, "57600", sizeof ("57600") - 1) == 0)
- BSPCmdBaud = 57600;
- else if (strncmp (opt, "38400", sizeof ("38400") - 1) == 0)
- BSPCmdBaud = 38400;
- else if (strncmp (opt, "19200", sizeof ("19200") - 1) == 0)
- BSPCmdBaud = 19200;
- else if (strncmp (opt, "9600", sizeof ("9600") - 1) == 0)
- BSPCmdBaud = 9600;
- else if (strncmp (opt, "4800", sizeof ("4800") - 1) == 0)
- BSPCmdBaud = 9600;
- }
- }
-
- if ( BSP_runtime_console_select )
- BSP_runtime_console_select(&BSPPrintkPort, &BSPConsolePort);
-
-#ifdef RTEMS_RUNTIME_CONSOLE_SELECT
- /*
- * If no video card, fall back to serial port console
- */
-#include <crt.h>
- if((BSPConsolePort == BSP_CONSOLE_PORT_CONSOLE)
- && (*(unsigned char*) NB_MAX_ROW_ADDR == 0)
- && (*(unsigned short*)NB_MAX_COL_ADDR == 0)) {
- BSPConsolePort = BSP_UART_COM2;
- BSPPrintkPort = BSP_UART_COM1;
- }
-#endif
-
- if(BSPPrintkPort == BSP_UART_COM1)
- {
- printk("Initializing console on port COM1 %d-8-N-1\n\n", BSPCmdBaud);
- printk("Warning : This will be the last message on console\n");
-
- /*
- * FIXME: cast below defeats the very idea of having
- * function pointer types defined
- */
- BSP_output_char = (BSP_output_char_function_type)
- BSP_output_char_via_serial;
- BSP_poll_char = (BSP_polling_getchar_function_type)
- BSP_poll_char_via_serial;
- }
- else if(BSPPrintkPort != BSP_CONSOLE_PORT_CONSOLE)
- {
- printk("illegal assignement of printk channel");
- /* just skip; at this early stage we don't want
- * to call rtems_fatal_error_occurred().
- */
- }
-}
-
-/*-------------------------------------------------------------------------+
-| Console device driver INITIALIZE entry point.
-+--------------------------------------------------------------------------+
-| Initilizes the I/O console (keyboard + VGA display) driver.
-+--------------------------------------------------------------------------*/
-rtems_device_driver
-console_initialize(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
- rtems_status_code status;
-
-
- /* Initialize the KBD interface */
- kbd_init();
-
- /*
- * Set up TERMIOS
- */
- rtems_termios_initialize ();
-
- /*
- * The video was initialized in the start.s code and does not need
- * to be reinitialized.
- */
-
- if(BSPConsolePort == BSP_CONSOLE_PORT_CONSOLE)
- {
- /* Install keyboard interrupt handler */
- status = BSP_install_rtems_irq_handler(&console_isr_data);
-
- if (!status)
- {
- 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
- {
- /*
- * Do device-specific initialization
- */
- /* BSPCmdBaud-8-N-1 */
- BSP_uart_init(BSPConsolePort, BSPCmdBaud, CHR_8_BITS, 0, 0, 0);
-
- /* Set interrupt handler */
- if(BSPConsolePort == BSP_UART_COM1)
- {
- console_isr_data.name = BSP_UART_COM1_IRQ;
- console_isr_data.hdl = BSP_uart_termios_isr_com1;
-
- }
- else
- {
- assert(BSPConsolePort == BSP_UART_COM2);
- console_isr_data.name = BSP_UART_COM2_IRQ;
- console_isr_data.hdl = BSP_uart_termios_isr_com2;
- }
- status = BSP_install_rtems_irq_handler(&console_isr_data);
-
- if (!status){
- printk("Error installing serial console interrupt handler!\n");
- rtems_fatal_error_occurred(status);
- }
- /*
- * 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(BSPConsolePort == BSP_UART_COM1)
- {
- printk("Initialized console on port COM1 %d-8-N-1\n\n", BSPCmdBaud);
- }
- else
- {
- printk("Initialized console on port COM2 %d-8-N-1\n\n", BSPCmdBaud);
- }
- }
-
- if(BSPPrintkPort != BSP_CONSOLE_PORT_CONSOLE && BSPPrintkPort != BSP_UART_COM1)
- {
- printk("illegal assignement of printk channel");
- rtems_fatal_error_occurred (status);
- }
-
- return RTEMS_SUCCESSFUL;
-} /* console_initialize */
-
-static int console_open_count = 0;
-
-static int console_last_close(int major, int minor, void *arg)
-{
- BSP_remove_rtems_irq_handler (&console_isr_data);
-
- return 0;
-}
-
-static int ser_console_first_open(int major, int minor, void *arg)
-{
- /*
- * Pass data area info down to driver
- */
- BSP_uart_termios_set(BSPConsolePort,
- ((rtems_libio_open_close_args_t *)arg)->iop->data1);
-
- /* Enable interrupts on channel */
- BSP_uart_intr_ctrl(BSPConsolePort, BSP_UART_INTR_CTRL_TERMIOS);
-
- return 0;
-}
-
-/*-------------------------------------------------------------------------+
-| Console device driver OPEN entry point
-+--------------------------------------------------------------------------*/
-rtems_device_driver
-console_open(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
- rtems_status_code status;
- static rtems_termios_callbacks cb =
- {
- NULL, /* firstOpen */
- console_last_close, /* lastClose */
- NULL, /* pollRead */
- BSP_uart_termios_write_com1, /* write */
- conSetAttr, /* setAttributes */
- NULL, /* stopRemoteTx */
- NULL, /* startRemoteTx */
- 1 /* outputUsesInterrupts */
- };
-
- if(BSPConsolePort == BSP_CONSOLE_PORT_CONSOLE)
- {
-
- /* Let's set the routines for termios to poll the
- * Kbd queue for data
- */
- cb.pollRead = kbd_poll_read;
- cb.outputUsesInterrupts = 0;
- /* write the "echo" if it is on */
- cb.write = ibmpc_console_write;
-
- cb.setAttributes = NULL;
- ++console_open_count;
- status = rtems_termios_open (major, minor, arg, &cb);
- if(status != RTEMS_SUCCESSFUL)
- {
- printk("Error openning console device\n");
- }
- return status;
- }
-
- if(BSPConsolePort == BSP_UART_COM2)
- {
- cb.write = BSP_uart_termios_write_com2;
- }
-
- cb.firstOpen = ser_console_first_open;
-
- status = rtems_termios_open (major, minor, arg, &cb);
-
- if(status != RTEMS_SUCCESSFUL)
- {
- printk("Error openning console device\n");
- return status;
- }
-
- return RTEMS_SUCCESSFUL;
-}
-
-/*-------------------------------------------------------------------------+
-| Console device driver CLOSE entry point
-+--------------------------------------------------------------------------*/
-rtems_device_driver
-console_close(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
- return rtems_termios_close (arg);
-} /* console_close */
-
-/*-------------------------------------------------------------------------+
-| Console device driver READ entry point.
-+--------------------------------------------------------------------------+
-| Read characters from the I/O console. We only have stdin.
-+--------------------------------------------------------------------------*/
-rtems_device_driver
-console_read(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg)
-{
- return rtems_termios_read( arg );
-} /* console_read */
-
-/*-------------------------------------------------------------------------+
-| Console device driver WRITE entry point.
-+--------------------------------------------------------------------------+
-| Write characters to the I/O console. Stderr and stdout are the same.
-+--------------------------------------------------------------------------*/
-rtems_device_driver
-console_write(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg)
-{
- rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
- char *buffer = rw_args->buffer;
- int maximum = rw_args->count;
-
- if(BSPConsolePort != BSP_CONSOLE_PORT_CONSOLE)
- {
- return rtems_termios_write (arg);
- }
-
- /* write data to VGA */
- ibmpc_console_write( minor, buffer, maximum );
- rw_args->bytes_moved = maximum;
- return RTEMS_SUCCESSFUL;
-} /* console_write */
-
-/*
- * Handle ioctl request.
- */
-rtems_device_driver
-console_control(rtems_device_major_number major,
- rtems_device_minor_number minor,
- void * arg
-)
-{
- rtems_libio_ioctl_args_t *args = arg;
- switch (args->command)
- {
- default:
- if( vt_ioctl( args->command, (unsigned long)args->buffer ) != 0 )
- return rtems_termios_ioctl (arg);
- break;
-
- case MW_UID_REGISTER_DEVICE:
- printk( "SerialMouse: reg=%s\n", args->buffer );
- register_kbd_msg_queue( args->buffer, 0 );
- break;
-
- case MW_UID_UNREGISTER_DEVICE:
- unregister_kbd_msg_queue( 0 );
- break;
- }
- args->ioctl_return = 0;
- return RTEMS_SUCCESSFUL;
-}
-
-static int
-conSetAttr(int minor, const struct termios *t)
-{
- unsigned long baud, databits, parity, stopbits;
-
- baud = rtems_termios_baud_to_number(t->c_cflag & CBAUD);
- if ( baud > 115200 )
- return RTEMS_INVALID_NUMBER;
-
- if (t->c_cflag & PARENB) {
- /* Parity is enabled */
- if (t->c_cflag & PARODD) {
- /* Parity is odd */
- parity = PEN;
- }
- else {
- /* Parity is even */
- parity = PEN | EPS;
- }
- }
- else {
- /* No parity */
- parity = 0;
- }
-
- switch (t->c_cflag & CSIZE) {
- case CS5: databits = CHR_5_BITS; break;
- case CS6: databits = CHR_6_BITS; break;
- case CS7: databits = CHR_7_BITS; break;
- default: /* just to avoid warnings -- all cases are covered. */
- case CS8: databits = CHR_8_BITS; break;
- }
-
- if (t->c_cflag & CSTOPB) {
- /* 2 stop bits */
- stopbits = STB;
- }
- else {
- /* 1 stop bit */
- stopbits = 0;
- }
-
- BSP_uart_set_attributes(BSPConsolePort, baud, databits, parity, stopbits);
-
- return 0;
-}