summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/m68k/mvme162/console/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/m68k/mvme162/console/console.c')
-rw-r--r--c/src/lib/libbsp/m68k/mvme162/console/console.c158
1 files changed, 123 insertions, 35 deletions
diff --git a/c/src/lib/libbsp/m68k/mvme162/console/console.c b/c/src/lib/libbsp/m68k/mvme162/console/console.c
index 0892f5f200..72595f3bce 100644
--- a/c/src/lib/libbsp/m68k/mvme162/console/console.c
+++ b/c/src/lib/libbsp/m68k/mvme162/console/console.c
@@ -21,10 +21,9 @@
#define M162_INIT
-#include <rtems.h>
-#include "console.h"
-#include "bsp.h"
-#include "ringbuf.h"
+#include <bsp.h>
+#include <rtems/libio.h>
+#include <ringbuf.h>
Ring_buffer_t Buffer[2];
@@ -54,12 +53,11 @@ rtems_isr C_Receive_ISR(rtems_vector_number vector)
rtems_device_driver console_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
- void *arg,
- rtems_id self,
- rtems_unsigned32 *status
+ void *arg
)
{
int i;
+ rtems_status_code status;
/*
* Initialise receiver interrupts on both ports
@@ -79,7 +77,34 @@ rtems_device_driver console_initialize(
mcchip->gen_control = 2; /* MIEN */
mcchip->SCC_int_ctl = 0x13; /* SCC IEN, IPL3 */
- *status = RTEMS_SUCCESSFUL;
+ status = rtems_io_register_name(
+ "/dev/console",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ status = rtems_io_register_name(
+ "/dev/tty00",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ status = rtems_io_register_name(
+ "/dev/tty01",
+ major,
+ (rtems_device_minor_number) 0
+ );
+
+ if (status != RTEMS_SUCCESSFUL)
+ rtems_fatal_error_occurred(status);
+
+ return RTEMS_SUCCESSFUL;
}
/*
@@ -100,7 +125,7 @@ rtems_boolean char_ready(int port, char *ch)
* Block on char input
*/
-char char_wait(int port)
+char inbyte(int port)
{
unsigned char tmp_char;
@@ -113,7 +138,7 @@ char char_wait(int port)
* XON/XOFF flow control.
*/
-void char_put(int port, char ch)
+void outbyte(int port, char ch)
{
while (1) {
if (ZREAD0(port) & TX_BUFFER_EMPTY) break;
@@ -122,45 +147,108 @@ void char_put(int port, char ch)
}
/*
- * Map port A (1) to stdin, stdout, and stderr.
- * Map everything else to port B (0).
+ * 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.
*/
-int __read(int fd, char *buf, int nbytes)
+rtems_device_driver console_read(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
{
- int i, port;
+ rtems_libio_rw_args_t *rw_args;
+ char *buffer;
+ int maximum;
+ int count = 0;
+
+ rw_args = (rtems_libio_rw_args_t *) arg;
- if ( fd <= 2 ) port = 1;
- else port = 0;
+ buffer = rw_args->buffer;
+ maximum = rw_args->count;
- for (i = 0; i < nbytes; i++) {
- *(buf + i) = char_wait(port);
- if ((*(buf + i) == '\n') || (*(buf + i) == '\r')) {
- (*(buf + i++)) = '\n';
- (*(buf + i)) = 0;
+ if ( minor > 1 )
+ return RTEMS_INVALID_NUMBER;
+
+ for (count = 0; count < maximum; count++) {
+ buffer[ count ] = inbyte( minor );
+ if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
+ buffer[ count++ ] = '\n';
+ buffer[ count ] = 0;
break;
}
}
- return (i);
+
+ rw_args->bytes_moved = count;
+ return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
}
/*
- * Map port A (1) to stdin, stdout, and stderr.
- * Map everything else to port B (0).
+ * write bytes to the serial port. Stdout and stderr are the same.
*/
-int __write(int fd, char *buf, int nbytes)
+rtems_device_driver console_write(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
{
- int i, port;
-
- if ( fd <= 2 ) port = 1;
- else port = 0;
-
- for (i = 0; i < nbytes; i++) {
- if (*(buf + i) == '\n') {
- char_put (port, '\r');
+ 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;
+
+ if ( minor > 1 )
+ return RTEMS_INVALID_NUMBER;
+
+ for (count = 0; count < maximum; count++) {
+ if ( buffer[ count ] == '\n') {
+ outbyte('\r', minor );
}
- char_put (port, *(buf + i));
+ outbyte( buffer[ count ], minor );
}
- return (nbytes);
+ return maximum;
+}
+
+/*
+ * IO Control entry point
+ */
+
+rtems_device_driver console_control(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void * arg
+)
+{
+ return RTEMS_SUCCESSFUL;
}