summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/a29k/portsw/console
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1996-09-18 21:13:10 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1996-09-18 21:13:10 +0000
commit0836603ae84d389f3d5e09c92ea83d06ec88cd23 (patch)
tree42774f9013f8a96e7cf67b9aecb66346c41ff114 /c/src/lib/libbsp/a29k/portsw/console
parentadded cast (diff)
downloadrtems-0836603ae84d389f3d5e09c92ea83d06ec88cd23.tar.bz2
new files submitted by Craig Lebakken (lebakken@minn.net) and Derrick Ostertag
(ostertag@transition.com)
Diffstat (limited to 'c/src/lib/libbsp/a29k/portsw/console')
-rw-r--r--c/src/lib/libbsp/a29k/portsw/console/concntl.h16
-rw-r--r--c/src/lib/libbsp/a29k/portsw/console/console.c302
-rw-r--r--c/src/lib/libbsp/a29k/portsw/console/serial.c217
-rw-r--r--c/src/lib/libbsp/a29k/portsw/console/serial.h8
4 files changed, 543 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/a29k/portsw/console/concntl.h b/c/src/lib/libbsp/a29k/portsw/console/concntl.h
new file mode 100644
index 0000000000..f3b3f5e4d7
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/console/concntl.h
@@ -0,0 +1,16 @@
+/*
+ * $Id$
+ */
+
+typedef enum
+{
+ CON_KBHIT,
+ CON_GET_RAW_BYTE,
+ CON_SEND_RAW_BYTE
+} console_ioctl_t;
+
+typedef struct
+{
+ console_ioctl_t ioctl_type;
+ unsigned32 param;
+} console_ioctl_request_t;
diff --git a/c/src/lib/libbsp/a29k/portsw/console/console.c b/c/src/lib/libbsp/a29k/portsw/console/console.c
new file mode 100644
index 0000000000..f7b461664a
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/console/console.c
@@ -0,0 +1,302 @@
+/*
+ * This file contains the template for a console IO package.
+ *
+ * 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.
+ *
+ * $Id$
+ */
+
+#define NO_BSP_INIT
+
+
+/* only one of the following can be defined */
+#define SERIAL_INPUT /* use serial input */
+/* #define HIF_INPUT */ /* use HIF input */
+
+#if defined(SERIAL_INPUT) && defined(HIF_INPUT)
+#error SERIAL_INPUT and HIF_INPUT cannot both be defined!!!
+#endif
+
+/* both of the following can be defined */
+#define SERIAL_OUTPUT /* remove to disable serial port console output */
+/* #define HIF_OUTPUT */ /* remove to disable HIF console output */
+
+#include <bsp.h>
+#include <rtems/libio.h>
+#include "serial.h"
+#include "concntl.h"
+
+#ifndef lint
+static char _sccsid[] = "@(#)console.c 09/12/96 1.13\n";
+#endif
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ if ( arg )
+ {
+ if ( console_duartinit(minor,*(unsigned32*)arg) )
+ return RTEMS_INVALID_NUMBER;
+ }
+ else
+ {
+ if ( console_duartinit(1,9600) || console_duartinit(0,9600) )
+ {
+ return RTEMS_INVALID_NUMBER;
+ }
+ }
+
+ 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;
+}
+
+
+/* is_character_ready
+ *
+ * This routine returns TRUE if a character is available.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+rtems_boolean is_character_ready(
+ char *ch
+)
+{
+ *ch = '\0'; /* return NULL for no particular reason */
+ return(TRUE);
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the SOURCE.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from SOURCE
+ */
+
+char inbyte( unsigned int minor )
+{
+ /*
+ * If polling, wait until a character is available.
+ */
+#ifdef HIF_INPUT
+ char retch;
+ _read( 1, &retch, 1 );
+ return retch;
+#endif
+#ifdef SERIAL_INPUT
+ return console_sps_getc( minor );
+#endif
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the SOURCE. It may support
+ * XON/XOFF flow control.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte( unsigned int minor,
+ char ch
+)
+{
+ /*
+ * If polling, wait for the transmitter to be ready.
+ * Check for flow control requests and process.
+ * Then output the character.
+ */
+
+#ifdef SERIAL_OUTPUT
+ console_sps_putc( minor, ch );
+#endif
+
+ /*
+ * Carriage Return/New line translation.
+ */
+
+ if ( ch == '\n' )
+ outbyte( minor, '\r' );
+}
+
+
+/*
+ * Open entry point
+ */
+
+rtems_device_driver console_open(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ 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;
+}
+
+/*
+ * 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;
+ unsigned8 *buffer;
+ unsigned32 maximum;
+ unsigned32 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(minor);
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
+ outbyte( minor, '\n' ); /* newline */
+ break;
+ }
+ else if (buffer[ count ] == '\b' && count > 0 )
+ {
+ outbyte( minor, '\b' ); /* move back one space */
+ outbyte( minor, ' ' ); /* erase the character */
+ outbyte( minor, '\b' ); /* move back one space */
+ count-=2;
+ }
+ else
+ outbyte( minor, buffer[ count ] ); /* echo the character */
+ }
+
+ rw_args->bytes_moved = count;
+ return (count > 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
+}
+
+/*
+ * 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;
+ unsigned8 *buffer;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
+
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
+
+#ifdef HIF_OUTPUT
+ _write( 0, buffer, maximum );
+#endif
+#ifdef SERIAL_OUTPUT
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte(minor,'\r');
+ }
+ outbyte( minor,buffer[ count ] );
+ }
+#endif
+
+ rw_args->bytes_moved = maximum;
+ return 0;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ if (!arg)
+ return RTEMS_INVALID_ADDRESS;
+
+ switch( ((console_ioctl_request_t *)arg)->ioctl_type )
+ {
+ case CON_KBHIT:
+ /* check if keyboard was hit */
+ ((console_ioctl_request_t *)arg)->param = console_sps_kbhit(minor);
+ break;
+
+ case CON_GET_RAW_BYTE:
+ ((console_ioctl_request_t *)arg)->param = inbyte(minor);
+ break;
+
+ case CON_SEND_RAW_BYTE:
+ outbyte(minor, ((console_ioctl_request_t *)arg)->param);
+ break;
+
+ default:
+ break;
+ }
+
+ return RTEMS_SUCCESSFUL;
+}
diff --git a/c/src/lib/libbsp/a29k/portsw/console/serial.c b/c/src/lib/libbsp/a29k/portsw/console/serial.c
new file mode 100644
index 0000000000..4b07dd19ae
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/console/serial.c
@@ -0,0 +1,217 @@
+/*
+ * $Id$
+ */
+
+#include "serial.h"
+#include "rtems.h"
+
+
+typedef unsigned char uchar ; /* Abbreviations */
+typedef unsigned short ushort ;
+typedef unsigned long ulong ;
+
+#if 0
+#define BAUDRate 9600 /* Fixed Uart baud rate */
+#endif
+
+#define SEND_WAIT 0x0100 /* Waiting to send character */
+
+#define TDR(i)
+
+
+/********************************************************************
+ *** 16552 specific DUART definitions.
+ *******************************************************************/
+
+
+typedef struct uart_16552 DUART ;
+
+#ifndef notdef
+struct uart_16552
+{
+ short u_short[8*2] ;
+} ;
+#define u_reg(n) u_short[2*(n)]
+
+#else
+
+struct uart_16552
+{
+ int u_int[8] ;
+} ;
+
+#define u_reg(n) u_int[(n)]
+#endif
+
+#define u_tdr u_reg(0) /* Transmit Data Register (write) */
+#define u_rdr u_reg(0) /* Receive Data Register (read) */
+#define u_dlr0 u_reg(0) /* Divisor Latch Register (lsb) */
+
+#define u_ier u_reg(1) /* Interrupt Enable Register */
+#define u_dlr1 u_reg(1) /* Divisor Latch Register (msb) */
+
+#define u_iir u_reg(2) /* Interrupt ID Register (read) */
+#define u_fcr u_reg(2) /* FIFO Control Register (write) */
+#define u_afr u_reg(2) /* Alternate Funct Reg (read/write) */
+
+#define u_lcr u_reg(3) /* Line Control Register */
+
+#define u_mcr u_reg(4) /* Modem Control Register */
+
+#define u_lsr u_reg(5) /* Line Status Register */
+
+#define u_msr u_reg(6) /* Modem Status Register */
+
+#define u_spr u_reg(7) /* Scratch Pad Register */
+
+#define uart1 ((volatile DUART *)0x90000380)
+#define uart2 ((volatile DUART *)0x90000300)
+
+#define NUM_UARTS 2
+static volatile DUART * duart[NUM_UARTS] = { uart1, uart2 };
+
+
+extern void display_msg(void);
+/*extern int sprintf();*/
+
+
+#define board_rev_reg ((volatile short *)0x90000080)
+
+static unsigned int shift_val = 0;
+
+/***********************************************************************
+ *** 16552 DUART initialization routine.
+ ***********************************************************************/
+
+int
+console_duartinit(unsigned int uart_num, unsigned int BAUDRate)
+{
+ register uchar tmp;
+ unsigned int board_rev = *board_rev_reg & 0xff;
+
+ switch( BAUDRate )
+ {
+ case 1200:
+ case 2400:
+ case 9600:
+ case 19200:
+ case 38400:
+ case 57600:
+ break;
+ default:
+ /* unknown baud rate */
+ return FALSE;
+ }
+
+ /* the board rev register should never be 0xff.
+ if it equals 0xff, assume that we're on old hardware
+ that needs all values shifted by 8. */
+ if ( board_rev == 0xff )
+ shift_val = 8;
+ else
+ shift_val = 0;
+
+ if ( uart_num >= NUM_UARTS )
+ return -1;
+
+ duart[uart_num]->u_lcr = 0x80<<shift_val ; /* Set DLAB bit to 1 */
+
+ duart[uart_num]->u_dlr0 = ((115200 / BAUDRate) >> 0)<<shift_val ; /* Set baud */
+ duart[uart_num]->u_dlr1 = ((115200 / BAUDRate) >> 8)<<shift_val ; /* rate */
+
+ duart[uart_num]->u_lcr = 0x03<<shift_val ; /* 8 bits, no parity, 1 stop */
+
+ duart[uart_num]->u_mcr = 0x0b<<shift_val ; /* Assert RTS, DTR & OUT2 */
+
+ duart[uart_num]->u_fcr = 0x00<<shift_val ; /* Clear 16552 FIFOs */
+ /* Is the following write of 0x01 needed? */
+ /* Let's try it without... */
+ duart[uart_num]->u_fcr = 0xc7<<shift_val ; /* Enable 16552 FIFOs */
+
+ duart[uart_num]->u_ier = 0x07<<shift_val ; /* Enable transmit/receive ints */
+
+ tmp = duart[uart_num]->u_lsr ; /* Re-arm interrupts */
+ tmp = duart[uart_num]->u_rdr ;
+ tmp = duart[uart_num]->u_msr ;
+
+ return(0);
+}
+
+ /*------------ end of duartinit function ----------------*/
+
+
+ /***********************************************************************
+ *** Transmit character to host.
+ ***********************************************************************/
+
+int console_sps_putc(unsigned int uart_num, int ch)
+{
+ register unsigned short stat;
+
+ if ( uart_num >= NUM_UARTS )
+ return -1;
+
+ /*
+ * Pause until there is room in the UART transmit
+ * buffer.
+ */
+
+ do {
+ stat = duart[uart_num]->u_lsr>>shift_val;
+ } while (!(stat & 0x40));
+
+ /*
+ * Transmit data. (Junk)
+ */
+
+ TDR(ch)
+
+ duart[uart_num]->u_tdr = ch<<shift_val ;
+
+ return ch;
+
+}
+
+
+ /***********************************************************************
+ *** Read character from host.
+ ***********************************************************************/
+
+int console_sps_getc(unsigned int uart_num)
+{
+ register unsigned short stat;
+ register int ch;
+
+ if ( uart_num >= NUM_UARTS )
+ return -1;
+
+ stat = duart[uart_num]->u_lsr>>shift_val;
+ while (!(stat & 0x01))
+ {
+ rtems_task_wake_after( RTEMS_YIELD_PROCESSOR );
+ stat = duart[uart_num]->u_lsr>>shift_val;
+ }
+
+ ch = duart[uart_num]->u_rdr>>shift_val;
+
+ return ch;
+}
+
+ /***********************************************************************
+ *** check character from host.
+ ***********************************************************************/
+
+int console_sps_kbhit(unsigned int uart_num)
+{
+ register unsigned short stat;
+
+ if ( uart_num >= NUM_UARTS )
+ return -1;
+
+ stat = duart[uart_num]->u_lsr>>shift_val;
+ return ((stat & 0x01));
+}
+
+
+
+
diff --git a/c/src/lib/libbsp/a29k/portsw/console/serial.h b/c/src/lib/libbsp/a29k/portsw/console/serial.h
new file mode 100644
index 0000000000..f57787dc17
--- /dev/null
+++ b/c/src/lib/libbsp/a29k/portsw/console/serial.h
@@ -0,0 +1,8 @@
+/*
+ * $Id$
+ */
+
+int console_duartinit(unsigned int uart_num, unsigned int BAUDRate);
+int console_sps_putc(unsigned int uart_num, int ch);
+int console_sps_getc(unsigned int uart_num);
+int console_sps_kbhit(unsigned int uart_num);