From 5752f930664a5c49d631eb4016a31b1a200431ec Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Sat, 25 Jul 1998 17:34:41 +0000 Subject: New file -- copied from dmv177 but same as ppcn_60x. --- c/src/lib/libbsp/shared/console.c | 290 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 c/src/lib/libbsp/shared/console.c (limited to 'c/src/lib/libbsp/shared') diff --git a/c/src/lib/libbsp/shared/console.c b/c/src/lib/libbsp/shared/console.c new file mode 100644 index 0000000000..1ca2282720 --- /dev/null +++ b/c/src/lib/libbsp/shared/console.c @@ -0,0 +1,290 @@ +/* + * This file contains the TTY driver for the PPCn_60x + * + * This driver uses the termios pseudo driver. + * + * COPYRIGHT (c) 1998 by Radstone Technology + * + * + * THIS FILE IS PROVIDED TO YOU, THE USER, "AS IS", WITHOUT WARRANTY OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK + * AS TO THE QUALITY AND PERFORMANCE OF ALL CODE IN THIS FILE IS WITH YOU. + * + * You are hereby granted permission to use, copy, modify, and distribute + * this file, provided that this notice, plus the above copyright notice + * and disclaimer, appears in all copies. Radstone Technology will provide + * no support for this code. + * + * COPYRIGHT (c) 1989-1997. + * 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$ + */ + +#include +#include +#include +#include +#include + +#include + +/* + * Load configuration table + */ + +extern console_data Console_Port_Data[]; +extern unsigned long Console_Port_Count; +extern rtems_device_minor_number Console_Port_Minor; + +/*PAGE + * + * console_open + * + * open a port as a termios console. + * + */ + +rtems_device_driver console_open( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_status_code status; + rtems_libio_open_close_args_t *args = arg; + rtems_libio_ioctl_args_t IoctlArgs; + struct termios Termios; + rtems_termios_callbacks Callbacks; + console_tbl *cptr; + + /* + * Verify the port number is valid. + */ + if ( minor > Console_Port_Count ) { + return RTEMS_INVALID_NUMBER; + } + + /* + * Open the port as a termios console driver. + */ + + cptr = &Console_Port_Tbl[minor]; + Callbacks.firstOpen = cptr->pDeviceFns->deviceFirstOpen; + Callbacks.lastClose = cptr->pDeviceFns->deviceLastClose; + Callbacks.pollRead = cptr->pDeviceFns->deviceRead; + Callbacks.write = cptr->pDeviceFns->deviceWrite; + Callbacks.setAttributes = cptr->pDeviceFns->deviceSetAttributes; + Callbacks.stopRemoteTx = cptr->pDeviceFlow->deviceStopRemoteTx; + Callbacks.startRemoteTx = cptr->pDeviceFlow->deviceStartRemoteTx; + Callbacks.outputUsesInterrupts = cptr->pDeviceFns->deviceOutputUsesInterrupts; + + /* XXX what about + * Console_Port_Tbl[minor].ulMargin, + * Console_Port_Tbl[minor].ulHysteresis); + */ + + status = rtems_termios_open ( major, minor, arg, &Callbacks ); + Console_Port_Data[minor].termios_data = args->iop->data1; + + if (minor!=Console_Port_Minor) { + /* + * If this is not the console we do not want ECHO and + * so forth + */ + IoctlArgs.iop=args->iop; + IoctlArgs.command=RTEMS_IO_GET_ATTRIBUTES; + IoctlArgs.buffer=&Termios; + rtems_termios_ioctl(&IoctlArgs); + Termios.c_lflag=ICANON; + IoctlArgs.command=RTEMS_IO_SET_ATTRIBUTES; + rtems_termios_ioctl(&IoctlArgs); + } + + if ( (args->iop->flags&LIBIO_FLAGS_READ) && + Console_Port_Tbl[minor].pDeviceFlow && + Console_Port_Tbl[minor].pDeviceFlow->deviceStartRemoteTx) { + Console_Port_Tbl[minor].pDeviceFlow->deviceStartRemoteTx(minor); + } + + return status; +} + +/*PAGE + * + * console_reserve_resources + * + * This routine uses the termios driver to reserve resources. + */ + +void console_reserve_resources( + rtems_configuration_table *configuration +) +{ + rtems_termios_reserve_resources( configuration, 4 ); +} + + +/*PAGE + * + * console_close + * + * This routine closes a port that has been opened as console. + */ + +rtems_device_driver console_close( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + rtems_libio_open_close_args_t *args = arg; + + if ( (args->iop->flags&LIBIO_FLAGS_READ) && + Console_Port_Tbl[minor].pDeviceFlow && + Console_Port_Tbl[minor].pDeviceFlow->deviceStopRemoteTx) { + Console_Port_Tbl[minor].pDeviceFlow->deviceStopRemoteTx(minor); + } + + return rtems_termios_close (arg); +} + +/*PAGE + * + * console_read + * + * This routine uses the termios driver to read a character. + */ + +rtems_device_driver console_read( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_read (arg); +} + +/*PAGE + * + * console_write + * + * this routine uses the termios driver to write a character. + */ + +rtems_device_driver console_write( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_write (arg); +} + +/*PAGE + * + * console_control + * + * this routine uses the termios driver to process io + */ + +rtems_device_driver console_control( + rtems_device_major_number major, + rtems_device_minor_number minor, + void * arg +) +{ + return rtems_termios_ioctl (arg); +} + +/*PAGE + * + * console_initialize + * + * Routine called to initialize the console device driver. + */ + +rtems_device_driver console_initialize( + rtems_device_major_number major, + rtems_device_minor_number minor, + void *arg +) +{ + rtems_status_code status; + + /* + * initialize the termio interface. + */ + + rtems_termios_initialize(); + + for (minor=0; minordeviceProbe(minor)) { + /* + * Use this device for the console + */ + break; + } + } + if ( minor==Console_Port_Count ) { + /* + * Failed to find a working device + */ + rtems_fatal_error_occurred(RTEMS_IO_ERROR); + } + + Console_Port_Minor=minor; + + /* + * Register Device Names + */ + status = rtems_io_register_name("/dev/console", major, Console_Port_Minor ); + if (status != RTEMS_SUCCESSFUL) { + rtems_fatal_error_occurred(status); + } + Console_Port_Tbl[minor].pDeviceFns->deviceInitialize(Console_Port_Minor); + + for (minor++;minordeviceProbe(minor)) { + status = rtems_io_register_name( + Console_Port_Tbl[minor].sDeviceName, + major, + minor ); + if (status != RTEMS_SUCCESSFUL) { + rtems_fatal_error_occurred(status); + } + + /* + * Initialize the hardware device. + */ + + Console_Port_Tbl[minor].pDeviceFns->deviceInitialize(minor); + + } + } + + return RTEMS_SUCCESSFUL; +} + + + -- cgit v1.2.3