summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/i386/go32/console/console.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/i386/go32/console/console.c')
-rw-r--r--c/src/lib/libbsp/i386/go32/console/console.c186
1 files changed, 186 insertions, 0 deletions
diff --git a/c/src/lib/libbsp/i386/go32/console/console.c b/c/src/lib/libbsp/i386/go32/console/console.c
new file mode 100644
index 0000000000..d7e5641e22
--- /dev/null
+++ b/c/src/lib/libbsp/i386/go32/console/console.c
@@ -0,0 +1,186 @@
+/*
+ * This file contains the go32 console IO package.
+ *
+ * $Id$
+ */
+
+#define IBMPC_INIT
+
+#include <stdlib.h>
+
+#include <rtems.h>
+#include "console.h"
+#include "bsp.h"
+
+#include <dpmi.h>
+#include <go32.h>
+
+/* console_cleanup
+ *
+ * This routine is called at exit to clean up the console hardware.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+void console_cleanup( void )
+{
+ /* nothing */
+}
+
+/* console_initialize
+ *
+ * This routine initializes the console IO driver.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ */
+
+/* Set this if console I/O should use go32 (DOS) read/write calls. */
+/* Otherwise, direct hardware accesses will be used. */
+int _IBMPC_Use_Go32_IO = 0;
+
+static rtems_isr_entry old_keyboard_isr = NULL;
+extern void _IBMPC_keyboard_isr( rtems_unsigned32 interrupt );
+
+
+rtems_device_driver console_initialize(
+ rtems_device_major_number major,
+ rtems_device_minor_number minor,
+ void *arg,
+ rtems_id self,
+ rtems_unsigned32 *status
+)
+{
+ if ( _IBMPC_Use_Go32_IO ) {
+ /* Nothing. We let DOS and go32 do all the work. */
+ } else {
+ /* Grap the keyboard interrupt so DOS doesn't steal our */
+ /* keystrokes. */
+ rtems_status_code status;
+ status = rtems_interrupt_catch( _IBMPC_keyboard_isr, 9,
+ &old_keyboard_isr );
+ if ( status ) {
+ int write( int, void *, int );
+ void exit( int );
+ char msg[] = "error initializing keyboard\n";
+ write( 2, msg, sizeof msg - 1 );
+ exit( 1 );
+ }
+ }
+
+ atexit( console_cleanup );
+}
+
+
+/* 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
+)
+{
+ return _IBMPC_chrdy( ch ) ? TRUE : FALSE;
+}
+
+/* inbyte
+ *
+ * This routine reads a character from the UART.
+ *
+ * Input parameters: NONE
+ *
+ * Output parameters: NONE
+ *
+ * Return values:
+ * character read from UART
+ */
+
+char inbyte( void )
+{
+ char ch = _IBMPC_inch();
+#if 1
+ /* Echo character to screen */
+ void outbyte( char ch );
+ outbyte( ch );
+ if ( ch == '\r' )
+ outbyte( '\n' );
+#endif
+ return ch;
+}
+
+/* outbyte
+ *
+ * This routine transmits a character out the port.
+ *
+ * Input parameters:
+ * ch - character to be transmitted
+ *
+ * Output parameters: NONE
+ */
+
+void outbyte( char ch )
+{
+ _IBMPC_outch( ch );
+}
+
+/*
+ * __read -- read bytes from the console. Ignore fd, since
+ * we only have stdin.
+ */
+
+int __read(
+ int fd,
+ char *buf,
+ int nbytes
+)
+{
+ int i = 0;
+
+ for ( i = 0; i < nbytes; i++ ) {
+ buf[i] = inbyte();
+ if ( buf[i] == '\r' ) {
+ /* What if this goes past the end of the buffer? We're hosed. [bhc] */
+ buf[i++] = '\n';
+ buf[i] = '\0';
+ break;
+ }
+ }
+ return i;
+}
+
+/*
+ * __write -- write bytes to the console. Ignore fd, since
+ * stdout and stderr are the same. Since we have no filesystem,
+ * open will only return an error.
+ */
+
+int __write(
+ int fd,
+ char *buf,
+ int nbytes
+)
+{
+ int i;
+
+ for (i = 0; i < nbytes; i++) {
+ if (*(buf + i) == '\n') {
+ outbyte ('\r');
+ }
+ outbyte (*(buf + i));
+ }
+ return (nbytes);
+}