diff options
Diffstat (limited to 'c/src/lib/libbsp/i386/pc386/console/console.c')
-rw-r--r-- | c/src/lib/libbsp/i386/pc386/console/console.c | 250 |
1 files changed, 250 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i386/pc386/console/console.c b/c/src/lib/libbsp/i386/pc386/console/console.c new file mode 100644 index 0000000000..220b56f4a4 --- /dev/null +++ b/c/src/lib/libbsp/i386/pc386/console/console.c @@ -0,0 +1,250 @@ +/*-------------------------------------------------------------------------+ +| console.c v1.1 - PC386 BSP - 1997/08/07 ++--------------------------------------------------------------------------+ +| 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 is based on: +| console.c,v 1.4 1995/12/19 20:07:23 joel Exp - go32 BSP +| With the following copyright notice: +| ************************************************************************** +| * COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994. * +| * On-Line Applications Research Corporation (OAR). * +| * All rights assigned to U.S. Government, 1994. * +| * * +| * This material may be reproduced by or for the U.S. Government pursuant * +| * to the copyright license under the clause at DFARS 252.227-7013. This * +| * notice must appear in all copies of this file and its derivatives. * +| ************************************************************************** ++--------------------------------------------------------------------------*/ + + +#include <stdlib.h> + +#include <bsp.h> +#include <irq.h> +#include <rtems/libio.h> + +/*-------------------------------------------------------------------------+ +| 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') */ + + +/*-------------------------------------------------------------------------+ +| 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) +{ + /* 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 */ + + +/*-------------------------------------------------------------------------+ +| 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) +{ + char c = _IBMPC_inch(); + + /* Echo character to screen */ + _IBMPC_outch(c); + if (c == '\r') + _IBMPC_outch('\n'); /* CR = CR + LF */ + + 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 */ + + +/*-------------------------------------------------------------------------+ +| 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 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); + } + + 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); + } + + atexit(console_cleanup); + + return RTEMS_SUCCESSFUL; +} /* console_initialize */ + + +/*-------------------------------------------------------------------------+ +| Console device driver OPEN entry point ++--------------------------------------------------------------------------*/ +rtems_device_driver +console_open(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) +{ + return RTEMS_SUCCESSFUL; +} /* console_open */ + + +/*-------------------------------------------------------------------------+ +| 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_SUCCESSFUL; +} /* 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) +{ + rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg; + char *buffer = rw_args->buffer; + int count, maximum = rw_args->count; + + for (count = 0; count < maximum; count++) + { + buffer[count] = inbyte(); + if (buffer[count] == '\n' || buffer[count] == '\r') + { + /* What if this goes past the end of the buffer? We're hosed. [bhc] */ + buffer[count++] = '\n'; + buffer[count] = '\0'; + break; + } + } + + rw_args->bytes_moved = count; + return ((count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED); +} /* 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 count, maximum = rw_args->count; + + for (count = 0; count < maximum; count++) + { + outbyte(buffer[count]); + if (buffer[count] == '\n') + outbyte('\r'); /* LF = LF + CR */ + } + + rw_args->bytes_moved = maximum; + return RTEMS_SUCCESSFUL; +} /* console_write */ + + +/*-------------------------------------------------------------------------+ +| Console device driver CONTROL entry point ++--------------------------------------------------------------------------*/ +rtems_device_driver +console_control(rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg) +{ + return RTEMS_SUCCESSFUL; +} /* console_control */ |