source: rtems/c/src/lib/libbsp/i386/go32/console/console.c @ 3a4ae6c

4.104.114.84.95
Last change on this file since 3a4ae6c was 3a4ae6c, checked in by Joel Sherrill <joel.sherrill@…>, on 09/11/95 at 19:35:39

The word "RTEMS" almost completely removed from the core.

Configuration Table Template file added and all tests
modified to use this. All gvar.h and conftbl.h files
removed from test directories.

Configuration parameter maximum_devices added.

Core semaphore and mutex handlers added and RTEMS API Semaphore
Manager updated to reflect this.

Initialization sequence changed to invoke API specific initialization
routines. Initialization tasks table now owned by RTEMS Tasks Manager.

Added user extension for post-switch.

Utilized user extensions to implement API specific functionality
like signal dispatching.

Added extensions to the System Initialization Thread so that an
API can register a function to be invoked while the system
is being initialized. These are largely equivalent to the
pre-driver and post-driver hooks.

Added the Modules file oar-go32_p5, modified oar-go32, and modified
the file make/custom/go32.cfg to look at an environment varable which
determines what CPU model is being used.

All BSPs updated to reflect named devices and clock driver's IOCTL
used by the Shared Memory Driver. Also merged clock isr into
main file and removed ckisr.c where possible.

Updated spsize to reflect new and moved variables.

Makefiles for the executive source and include files updated to show
break down of files into Core, RTEMS API, and Neither.

Header and inline files installed into subdirectory based on whether
logically in the Core or a part of the RTEMS API.

  • Property mode set to 100644
File size: 4.6 KB
Line 
1/*
2 *  This file contains the go32 console IO package.
3 *
4 *  $Id$
5 */
6
7#define IBMPC_INIT
8
9#include <stdlib.h>
10
11#include <bsp.h>
12#include <rtems/libio.h>
13
14#include <dpmi.h>
15#include <go32.h>
16
17/*  console_cleanup
18 *
19 *  This routine is called at exit to clean up the console hardware.
20 *
21 *  Input parameters: NONE
22 *
23 *  Output parameters:  NONE
24 *
25 *  Return values:
26 */
27
28void console_cleanup( void )
29{
30    /* nothing */
31}
32
33/*  console_initialize
34 *
35 *  This routine initializes the console IO driver.
36 *
37 *  Input parameters: NONE
38 *
39 *  Output parameters:  NONE
40 *
41 *  Return values:
42 */
43
44/* Set this if console I/O should use go32 (DOS) read/write calls.   */
45/* Otherwise, direct hardware accesses will be used.                 */
46
47int      _IBMPC_Use_Go32_IO  = 0;
48
49static rtems_isr_entry  old_keyboard_isr  = NULL;
50
51extern void    _IBMPC_keyboard_isr( rtems_unsigned32 interrupt );
52
53rtems_device_driver console_initialize(
54  rtems_device_major_number  major,
55  rtems_device_minor_number  minor,
56  void                      *arg
57)
58{
59  rtems_status_code status;
60
61  if ( _IBMPC_Use_Go32_IO )  {
62    /* Nothing.  We let DOS and go32 do all the work. */
63  } else {
64    /* Grap the keyboard interrupt so DOS doesn't steal our */
65    /* keystrokes.                                    */
66    rtems_status_code  status;
67
68    status =
69      rtems_interrupt_catch( _IBMPC_keyboard_isr, 9, &old_keyboard_isr );
70
71    if ( status )  {
72      int write( int, void *, int );
73      void exit( int );
74
75      char msg[] = "error initializing keyboard\n";
76      write( 2, msg, sizeof msg - 1 );
77      exit( 1 );
78    }
79  }
80
81  status = rtems_io_register_name(
82    "/dev/console",
83    major,
84    (rtems_device_minor_number) 0
85  );
86 
87  if (status != RTEMS_SUCCESSFUL)
88    rtems_fatal_error_occurred(status);
89 
90  atexit( console_cleanup );
91
92  return RTEMS_SUCCESSFUL;
93}
94
95
96/*  is_character_ready
97 *
98 *  This routine returns TRUE if a character is available.
99 *
100 *  Input parameters: NONE
101 *
102 *  Output parameters:  NONE
103 *
104 *  Return values:
105 */
106
107rtems_boolean is_character_ready(
108  char *ch
109)
110{
111    return _IBMPC_chrdy( ch ) ? TRUE : FALSE;
112}
113
114/*  inbyte
115 *
116 *  This routine reads a character from the UART.
117 *
118 *  Input parameters: NONE
119 *
120 *  Output parameters:  NONE
121 *
122 *  Return values:
123 *    character read from UART
124 */
125
126char inbyte( void )
127{
128    char ch = _IBMPC_inch();
129#if 1
130    /* Echo character to screen */
131    void outbyte( char ch );
132    outbyte( ch );
133    if ( ch == '\r' )
134      outbyte( '\n' );
135#endif
136    return ch;
137}
138
139/*  outbyte
140 *
141 *  This routine transmits a character out the port.
142 *
143 *  Input parameters:
144 *    ch  - character to be transmitted
145 *
146 *  Output parameters:  NONE
147 */
148
149void outbyte( char ch )
150{
151    _IBMPC_outch( ch );
152}
153
154/*
155 *  Open entry point
156 */
157 
158rtems_device_driver console_open(
159  rtems_device_major_number major,
160  rtems_device_minor_number minor,
161  void                    * arg
162)
163{
164  return RTEMS_SUCCESSFUL;
165}
166
167/*
168 *  Close entry point
169 */
170 
171rtems_device_driver console_close(
172  rtems_device_major_number major,
173  rtems_device_minor_number minor,
174  void                    * arg
175)
176{
177  return RTEMS_SUCCESSFUL;
178}
179 
180/*
181 * read bytes from the serial port. We only have stdin.
182 */
183 
184rtems_device_driver console_read(
185  rtems_device_major_number major,
186  rtems_device_minor_number minor,
187  void                    * arg
188)
189{
190  rtems_libio_rw_args_t *rw_args;
191  char *buffer;
192  int maximum;
193  int count = 0;
194 
195  rw_args = (rtems_libio_rw_args_t *) arg;
196 
197  buffer = rw_args->buffer;
198  maximum = rw_args->count;
199 
200  for (count = 0; count < maximum; count++) {
201    buffer[ count ] = inbyte();
202    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
203      /* What if this goes past the end of the buffer?  We're hosed. [bhc] */
204      buffer[ count++ ]  = '\n';
205      buffer[ count ]  = 0;
206      break;
207    }
208  }
209 
210  rw_args->bytes_moved = count;
211  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
212}
213 
214/*
215 * write bytes to the serial port. Stdout and stderr are the same.
216 */
217 
218rtems_device_driver console_write(
219  rtems_device_major_number major,
220  rtems_device_minor_number minor,
221  void                    * arg
222)
223{
224  int count;
225  int maximum;
226  rtems_libio_rw_args_t *rw_args;
227  char *buffer;
228 
229  rw_args = (rtems_libio_rw_args_t *) arg;
230 
231  buffer = rw_args->buffer;
232  maximum = rw_args->count;
233 
234  for (count = 0; count < maximum; count++) {
235    if ( buffer[ count ] == '\n') {
236      outbyte('\r');
237    }
238    outbyte( buffer[ count ] );
239  }
240  return maximum;
241}
242 
243/*
244 *  IO Control entry point
245 */
246 
247rtems_device_driver console_control(
248  rtems_device_major_number major,
249  rtems_device_minor_number minor,
250  void                    * arg
251)
252{
253  return RTEMS_SUCCESSFUL;
254}
255
Note: See TracBrowser for help on using the repository browser.