diff options
Diffstat (limited to 'c/src/lib/libbsp/i386/i386ex/console')
-rw-r--r-- | c/src/lib/libbsp/i386/i386ex/console/console.c | 576 |
1 files changed, 341 insertions, 235 deletions
diff --git a/c/src/lib/libbsp/i386/i386ex/console/console.c b/c/src/lib/libbsp/i386/i386ex/console/console.c index c535d7efad..84458d5028 100644 --- a/c/src/lib/libbsp/i386/i386ex/console/console.c +++ b/c/src/lib/libbsp/i386/i386ex/console/console.c @@ -1,295 +1,401 @@ -/* - * This file contains the i386ex console IO package. - * - * COPYRIGHT (c) 1989-1998. - * On-Line Applications Research Corporation (OAR). - * Copyright assigned to U.S. Government, 1994. - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.OARcorp.com/rtems/license.html. - * - * $Id$ - */ +/*-------------------------------------------------------------------------+ +| console.c v1.1 - i386ex BSP - 1997/08/07 ++--------------------------------------------------------------------------+ +| This file contains the i386ex console I/O package. It is just a termios +| wrapper. ++--------------------------------------------------------------------------+ +| (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 is based on: +| console.c,v 1.4 1995/12/19 20:07:23 joel Exp - go32 BSP +| console.c,v 1.15 pc386 BSP +| With the following copyright notice: +| ************************************************************************** +| * COPYRIGHT (c) 1989-1998. +| * On-Line Applications Research Corporation (OAR). +| * Copyright assigned to U.S. Government, 1994. +| * +| * The license and distribution terms for this file may be +| * found in found in the file LICENSE in this distribution or at +| * http://www.OARcorp.com/rtems/license.html. +| ************************************************************************** +| +| $Id$ ++--------------------------------------------------------------------------*/ + +#include <stdio.h> +#include <stdlib.h> +#include <assert.h> -#define F386_INIT +/* workaround for gcc development tools */ +#undef __assert +void __assert (const char *file, int line, const char *msg); #include <bsp.h> +#include <irq.h> #include <rtems/libio.h> -#include <bspIo.h> -#include <stdlib.h> +#include <termios.h> +#include <uart.h> +#include <libcpu/cpuModel.h> -#include "../start/80386ex.h" - -/* console_cleanup - * - * This routine is called at exit to clean up the console hardware. - * - * Input parameters: NONE - * - * Output parameters: NONE - * - * Return values: +/* + * Possible value for console input/output : + * BSP_UART_COM1 + * BSP_UART_COM2 + * BSP_CONSOLE_PORT_CONSOLE is not valid in this BSP. + * All references to either keyboard or video handling have been removed. */ -void console_cleanup( void ) -{ - register rtems_unsigned8 ignored; +int BSPConsolePort = BSP_UART_COM2; +int BSPBaseBaud = 781250; +int BSP_poll_read(int); + +extern BSP_polling_getchar_function_type BSP_poll_char; -/* clear the read buffer */ +static int conSetAttr(int minor, const struct termios *); +static void isr_on(const rtems_irq_connect_data *); +static void isr_off(const rtems_irq_connect_data *); +static int isr_is_on(const rtems_irq_connect_data *); + +/* + * Change references to com2 if required. + */ - inport_byte( RBR0, ignored ); +static rtems_irq_connect_data console_isr_data = +{ BSP_UART_COM2_IRQ, + BSP_uart_termios_isr_com2, + isr_on, + isr_off, + isr_is_on}; +static void +isr_on(const rtems_irq_connect_data *unused) +{ + return; +} + +static void +isr_off(const rtems_irq_connect_data *unused) +{ + return; } -/* console_initialize - * - * This routine initializes the console IO driver. - * - * Input parameters: NONE - * - * Output parameters: NONE - * - * Return values: - */ +static int +isr_is_on(const rtems_irq_connect_data *irq) +{ + return BSP_irq_enabled_at_i8259s(irq->name); +} -rtems_device_driver console_initialize( - rtems_device_major_number major, - rtems_device_minor_number minor, - void *arg -) +void console_reserve_resources(rtems_configuration_table *conf) { - rtems_status_code status; + rtems_termios_reserve_resources(conf, 1); + return; +} +void __assert (const char *file, int line, const char *msg) +{ + static char exit_msg[] = "EXECUTIVE SHUTDOWN! Any key to reboot..."; + unsigned char ch; + /* - * flush the console now and at exit. Just in case. + * Note we cannot call exit or printf from here, + * assert can fail inside ISR too */ - console_cleanup(); + /* + * Close console + */ + __rtems_close(2); + __rtems_close(1); + __rtems_close(0); + + printk("\nassert failed: %s: ", file); + printk("%d: ", line); + printk("%s\n\n", msg); + printk(exit_msg); + ch = BSP_poll_char(); + printk("\nShould jump to reset now!\n"); +} - status = rtems_io_register_name( - "/dev/console", - major, - (rtems_device_minor_number) 0 - ); - - if (status != RTEMS_SUCCESSFUL) + +/*-------------------------------------------------------------------------+ +| 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; + + /* + * Set up TERMIOS + */ + rtems_termios_initialize (); + + /* + * Do device-specific initialization + */ + + /* 9600-8-N-1, no hardware flow control */ + BSP_uart_init(BSPConsolePort, 9600, 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); - - atexit( console_cleanup ); + } + /* + * 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 9600-8-N-1\n\n"); + } + else + { + printk("Initialized console on port COM2 9600-8-N-1\n\n"); + } return RTEMS_SUCCESSFUL; -} +} /* console_initialize */ -/* is_character_ready - * - * This routine returns TRUE if a character is available. - * - * Input parameters: NONE - * - * Output parameters: NONE - * - * Return values: - */ +static int console_open_count = 0; -rtems_boolean is_character_ready( - char *ch -) +static int console_last_close(int major, int minor, void *arg) { - register rtems_unsigned8 status; + BSP_remove_rtems_irq_handler (&console_isr_data); - inport_byte( LSR1, status ); - - if ( Is_rx_ready( status ) ) { - inport_byte( RBR1, status ); - *ch = status; - return TRUE; - } - return FALSE; + return 0; } -/* - * Wait for an input. May be used before intr are ON. - */ -char BSP_wait_polled_input( void ) +/*-------------------------------------------------------------------------+ +| Console device driver OPEN entry point ++--------------------------------------------------------------------------*/ +rtems_device_driver +console_open(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) { - char c; - while (!is_character_ready(&c)) - continue; - - return c; -} - -/* inbyte - * - * This routine reads a character from the UART. - * - * Input parameters: NONE - * - * Output parameters: NONE - * - * Return values: - * character read from UART - */ + rtems_status_code status; + static rtems_termios_callbacks cb = + { + NULL, /* firstOpen */ + console_last_close, /* lastClose */ + NULL, /* poll read */ + BSP_uart_termios_write_com2, /* write */ + conSetAttr, /* setAttributes */ + NULL, /* stopRemoteTx */ + NULL, /* startRemoteTx */ + 1 /* outputUsesInterrupts */ + }; + + if(BSPConsolePort == BSP_UART_COM2) + { + cb.write = BSP_uart_termios_write_com2; + } -char inbyte( void ) -{ - register rtems_unsigned8 status; - char ch; + status = rtems_termios_open (major, minor, arg, &cb); - do { - inport_byte( LSR1, status ); - } while ( !( status & 0x01 ));/* s/b while ( !( Is_rx_ready( status ) ) ); */ + if(status != RTEMS_SUCCESSFUL) + { + printk("Error openning console device\n"); + return status; + } - inport_byte( RBR1, ch ); + /* + * 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 ch; + return RTEMS_SUCCESSFUL; } -/* outbyte - * - * This routine transmits a character out the port. It supports - * XON/XOFF flow control. - * - * Input parameters: - * ch - character to be transmitted - * - * Output parameters: NONE - */ - -void outbyte( - char ch -) +/*-------------------------------------------------------------------------+ +| Console device driver CLOSE entry point ++--------------------------------------------------------------------------*/ +rtems_device_driver +console_close(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) { - rtems_unsigned8 status; - do { - inport_byte( LSR1, status ); - } while ( ! ( 0x40 & status ) ); /* ( Is_tx_ready( status ) ) );*/ - -/* - * GDB will NOT use XON/XOFF protocol - */ - - -#ifdef USE_XON + return (rtems_termios_close (arg)); - while ( is_character_ready( &status ) == TRUE ) { - if ( status == XOFF ) - do { - while ( is_character_ready( &status ) == FALSE ) ; - } while ( status != XON ); - } +} /* console_close */ -#endif + +/*-------------------------------------------------------------------------+ +| 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) +{ + rtems_status_code sc; + printf("read the console\n"); - outport_byte( TBR1, ch ); + sc = rtems_termios_read (arg); -} + if ( sc != RTEMS_SUCCESSFUL ) + printf("console_read: fails %s\n",rtems_status_text(sc)); -/* - * Open entry point - */ + return sc; + +} /* console_read */ -rtems_device_driver console_open( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) + +/*-------------------------------------------------------------------------+ +| 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) { - return RTEMS_SUCCESSFUL; -} + return rtems_termios_write (arg); -/* - * Close entry point - */ - -rtems_device_driver console_close( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return RTEMS_SUCCESSFUL; -} +} /* console_write */ + + /* - * read bytes from the serial port. We only have stdin. + * Handle ioctl request. */ - -rtems_device_driver console_read( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg +rtems_device_driver +console_control(rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg ) -{ - rtems_libio_rw_args_t *rw_args; - char *buffer; - int maximum; - int count = 0; - - rw_args = (rtems_libio_rw_args_t *) arg; - - buffer = rw_args->buffer; - maximum = rw_args->count; - - for (count = 0; count < maximum; count++) { - buffer[ count ] = inbyte(); - if (buffer[ count ] == '\n' || buffer[ count ] == '\r') { - buffer[ count++ ] = '\n'; - break; - } - } - - rw_args->bytes_moved = count; - return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED; +{ + return rtems_termios_ioctl (arg); } -/* - * write bytes to the serial port. Stdout and stderr are the same. - */ - -rtems_device_driver console_write( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) +static int +conSetAttr(int minor, const struct termios *t) { - int count; - int maximum; - rtems_libio_rw_args_t *rw_args; - char *buffer; - - rw_args = (rtems_libio_rw_args_t *) arg; - - buffer = rw_args->buffer; - maximum = rw_args->count; - - for (count = 0; count < maximum; count++) { - if ( buffer[ count ] == '\n') { - outbyte('\r'); + 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; } - outbyte( buffer[ count ] ); - } - - rw_args->bytes_moved = maximum; + + BSP_uart_set_baud(BSPConsolePort, baud); + return 0; } - + /* - * IO Control entry point + * BSP initialization */ - -rtems_device_driver console_control( - rtems_device_major_number major, - rtems_device_minor_number minor, - void * arg -) -{ - return RTEMS_SUCCESSFUL; -} -BSP_output_char_function_type BSP_output_char = outbyte; -BSP_polling_getchar_function_type BSP_poll_char = BSP_wait_polled_input; +BSP_output_char_function_type BSP_output_char = + (BSP_output_char_function_type) BSP_output_char_via_serial; + +BSP_polling_getchar_function_type BSP_poll_char = + (BSP_polling_getchar_function_type) BSP_poll_char_via_serial; +int BSP_poll_read(int ttyMinor){ + + return BSP_poll_char_via_serial(); +} |