summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m68k
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1997-10-23 15:11:27 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1997-10-23 15:11:27 +0000
commitedd1329f41637a070c26e8773e812014535f3223 (patch)
treec4ab0ff15ca156afdf2f1010a5302fa0b06c47d5 /c/src/lib/libbsp/m68k
parentAdded prototype for console_reserve_resources. (diff)
downloadrtems-edd1329f41637a070c26e8773e812014535f3223.tar.bz2
Overhauled console driver to use termios and to simultaneously support
both ports.
Diffstat (limited to 'c/src/lib/libbsp/m68k')
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/console/console.c294
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/include/bsp.h19
-rw-r--r--c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c6
3 files changed, 170 insertions, 149 deletions
diff --git a/c/src/lib/libbsp/m68k/dmv152/console/console.c b/c/src/lib/libbsp/m68k/dmv152/console/console.c
index 407c9378e4..137b93481d 100644
--- a/c/src/lib/libbsp/m68k/dmv152/console/console.c
+++ b/c/src/lib/libbsp/m68k/dmv152/console/console.c
@@ -1,5 +1,9 @@
/*
- * This file contains the DMV152 console IO package.
+ * This file contains the TTY driver for the serial ports on the DMV152.
+ * The serial ports use a Zilog Z8530.
+ *
+ * NOTE: This driver uses the termios pseudo driver.
+ * This driver is polled only.
*
* COPYRIGHT (c) 1989-1997.
* On-Line Applications Research Corporation (OAR).
@@ -12,115 +16,175 @@
* $Id$
*/
-#define D152_INIT
-
#include <bsp.h>
#include <rtems/libio.h>
-
-/* console_initialize
- *
- * This routine initializes the console IO driver.
- *
- * Input parameters: NONE
- *
- * Output parameters: NONE
+#include <stdlib.h>
+#include <assert.h>
+
+/*
+ * console_outbyte_polled
*
- * Return values:
+ * This routine transmits a character using polling.
*/
-
-rtems_device_driver console_initialize(
- rtems_device_major_number major,
- rtems_device_minor_number minor,
- void *arg
+
+void console_outbyte_polled(
+ int port,
+ char ch
)
{
- rtems_status_code status;
-
- status = rtems_io_register_name(
- "/dev/console",
- major,
- (rtems_device_minor_number) 0
- );
-
- if (status != RTEMS_SUCCESSFUL)
- rtems_fatal_error_occurred(status);
-
- return RTEMS_SUCCESSFUL;
+ rtems_unsigned32 control;
+ rtems_unsigned32 data;
+ rtems_unsigned8 rr_0;
+
+ if ( port == 0 ) {
+ control = CONSOLE_CONTROL_A;
+ data = CONSOLE_DATA_A;
+ } else {
+ control = CONSOLE_CONTROL_B;
+ data = CONSOLE_DATA_B;
+ }
+
+ for ( ; ; ) {
+ Z8x30_READ_CONTROL( control, RR_0, rr_0 );
+ if ( (rr_0 & RR_0_TX_BUFFER_EMPTY) != 0 )
+ break;
+ }
+
+ Z8x30_WRITE_DATA( control, ch );
}
-/* inbyte
- *
- * This routine reads a character from the SCC.
- *
- * Input parameters: NONE
- *
- * Output parameters: NONE
+/*
+ * console_inbyte_nonblocking
*
- * Return values:
- * character read from SCC
+ * This routine polls for a character.
*/
-char inbyte( void )
+int console_inbyte_nonblocking(
+ int port,
+ char *c
+)
{
- rtems_unsigned8 rr_0;
- char ch;
-
- for ( ; ; ) {
- Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
- if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) != 0 )
- break;
+ rtems_unsigned32 control;
+ rtems_unsigned32 data;
+ rtems_unsigned8 rr_0;
+ char ch;
+
+ if ( port == 0 ) {
+ control = CONSOLE_CONTROL_A;
+ data = CONSOLE_DATA_A;
+ } else {
+ control = CONSOLE_CONTROL_B;
+ data = CONSOLE_DATA_B;
}
- Z8x30_READ_DATA( CONSOLE_DATA, ch );
- return ( ch );
+ Z8x30_READ_CONTROL( control, RR_0, rr_0 );
+ if ( !(rr_0 & RR_0_RX_DATA_AVAILABLE) )
+ return 0;
+
+ Z8x30_READ_DATA( data, ch );
+ return ch;
}
-/* outbyte
+/*
+ * DEBUG_puts
*
- * This routine transmits a character out the SCC. It supports
- * XON/XOFF flow control.
+ * This should be safe in the event of an error. It attempts to insure
+ * that no TX empty interrupts occur while it is doing polled IO. Then
+ * it restores the state of that external interrupt.
*
* Input parameters:
- * ch - character to be transmitted
+ * string - pointer to debug output string
*
* Output parameters: NONE
+ *
+ * Return values: NONE
*/
-void outbyte(
- char ch
+void DEBUG_puts(
+ char *string
)
{
- rtems_unsigned8 rr_0;
- char flow_control;
+ char *s;
- for ( ; ; ) {
- Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
- if ( (rr_0 & RR_0_TX_BUFFER_EMPTY) != 0 )
- break;
- }
+ /* should disable interrupts here */
+ for ( s = string ; *s ; s++ )
+ console_outbyte_polled( 0, *s );
- for ( ; ; ) {
- Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
- if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 )
- break;
+ console_outbyte_polled( 0, '\r' );
+ console_outbyte_polled( 0, '\n' );
+ /* should enable interrupts here */
+}
+
+
+/*
+ * Console Termios Support Entry Points
+ *
+ */
- Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
+int console_write_support (int minor, char *buf, int len)
+{
+ int nwrite = 0;
- if ( flow_control == XOFF )
- do {
- do {
- Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
- } while ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 );
- Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
- } while ( flow_control != XON );
+ while (nwrite < len) {
+ console_outbyte_polled( minor, *buf++ );
+ nwrite++;
}
+ return nwrite;
+}
- Z8x30_WRITE_DATA( CONSOLE_DATA, ch );
+void console_reserve_resources(
+ rtems_configuration_table *configuration
+)
+{
+ rtems_termios_reserve_resources( configuration, 2 );
}
/*
- * Open entry point
+ * Console Device Driver Entry Points
+ *
*/
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+ rtems_device_minor_number console_minor;
+
+ rtems_termios_initialize();
+
+ /*
+ * Register Device Names
+ */
+
+#if (USE_CHANNEL_A == 1)
+ console_minor = 0;
+#elif (USE_CHANNEL_B == 1)
+ console_minor = 1;
+#else
+#error "DMV152 Console Driver -- no console port configured!!!"
+#endif
+
+ status = rtems_io_register_name( "/dev/console", major, console_minor );
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ status = rtems_io_register_name( "/dev/console_a", major, 0 );
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ status = rtems_io_register_name( "/dev/console_b", major, 1 );
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ /*
+ * Initialize Hardware
+ */
+
+ return RTEMS_SUCCESSFUL;
+}
rtems_device_driver console_open(
rtems_device_major_number major,
@@ -128,94 +192,54 @@ rtems_device_driver console_open(
void * arg
)
{
+ rtems_status_code sc;
+
+ assert( minor <= 1 );
+ if ( minor > 2 )
+ return RTEMS_INVALID_NUMBER;
+
+ sc = rtems_termios_open (major, minor, arg,
+ NULL,
+ NULL,
+ console_inbyte_nonblocking,
+ console_write_support);
+
return RTEMS_SUCCESSFUL;
}
-/*
- * Close entry point
- */
-
rtems_device_driver console_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
- return RTEMS_SUCCESSFUL;
+ return rtems_termios_close (arg);
}
-
-/*
- * read bytes from the serial port. 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;
- 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_read (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
)
{
- 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');
- }
- outbyte( buffer[ count ] );
- }
-
- rw_args->bytes_moved = maximum;
- return 0;
+ return rtems_termios_write (arg);
}
-
-/*
- * IO Control entry point
- */
-
+
rtems_device_driver console_control(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
)
{
- return RTEMS_SUCCESSFUL;
+ return rtems_termios_ioctl (arg);
}
+
diff --git a/c/src/lib/libbsp/m68k/dmv152/include/bsp.h b/c/src/lib/libbsp/m68k/dmv152/include/bsp.h
index b4ecf521be..ec14a97beb 100644
--- a/c/src/lib/libbsp/m68k/dmv152/include/bsp.h
+++ b/c/src/lib/libbsp/m68k/dmv152/include/bsp.h
@@ -127,23 +127,14 @@ extern "C" {
#define TIMER 0x0c000000
#define TIMER_VECTOR 0x4D
-#if (USE_CHANNEL_A == 1)
-#define CONSOLE_CONTROL 0x0C800005
-#define CONSOLE_DATA 0x0C800007
-#elif (USE_CHANNEL_B == 1)
-#define CONSOLE_CONTROL 0x0C800001
-#define CONSOLE_DATA 0x0C800003
-#endif
+#define CONSOLE_CONTROL_A 0x0C800005
+#define CONSOLE_DATA_A 0x0C800007
+#define CONSOLE_CONTROL_B 0x0C800001
+#define CONSOLE_DATA_B 0x0C800003
/* Structures */
-#ifdef D152_INIT
-#undef EXTERN
-#define EXTERN
-#else
-#undef EXTERN
-#define EXTERN extern
-#endif
+ /* none */
/* miscellaneous stuff assumed to exist */
diff --git a/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c b/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c
index 1426b8bc43..add628efc3 100644
--- a/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c
+++ b/c/src/lib/libbsp/m68k/dmv152/startup/bspstart.c
@@ -219,6 +219,12 @@ int main(
BSP_Configuration.RTEMS_api_configuration->maximum_regions++;
/*
+ * Account for the console's resources
+ */
+
+ console_reserve_resources( &BSP_Configuration );
+
+ /*
* Add 1 extension for newlib libc
*/