source: rtems/c/src/lib/libbsp/i386/force386/console/console.c @ 3652ad35

4.104.114.84.95
Last change on this file since 3652ad35 was 3652ad35, checked in by Joel Sherrill <joel.sherrill@…>, on Sep 19, 1995 at 2:53:29 PM

Minor bug fixes to get all targets compilable and running. The
single biggest changes were the expansion of the workspace size
macro to include other types of objects and the increase in the
minimum stack size for most CPUs.

  • Property mode set to 100644
File size: 5.3 KB
Line 
1/*
2 *  This file contains the Force CPU386 console IO package.
3 *
4 *  COPYRIGHT (c) 1989, 1990, 1991, 1992, 1993, 1994.
5 *  On-Line Applications Research Corporation (OAR).
6 *  All rights assigned to U.S. Government, 1994.
7 *
8 *  This material may be reproduced by or for the U.S. Government pursuant
9 *  to the copyright license under the clause at DFARS 252.227-7013.  This
10 *  notice must appear in all copies of this file and its derivatives.
11 *
12 *  $Id$
13 */
14
15#define F386_INIT
16
17#include <bsp.h>
18#include <rtems/libio.h>
19
20#include <stdlib.h>
21
22/*  console_cleanup
23 *
24 *  This routine is called at exit to clean up the console hardware.
25 *
26 *  Input parameters: NONE
27 *
28 *  Output parameters:  NONE
29 *
30 *  Return values:
31 */
32
33void console_cleanup( void )
34{
35  register rtems_unsigned8 ignored;
36  /*
37   *  FORCE technical support mentioned that it may be necessary to
38   *  read the DUSCC RX_BUFFER port four times to remove all junk.
39   *  This code is a little more paranoid.
40   */
41
42   inport_byte( RX_BUFFER, ignored );
43   inport_byte( RX_BUFFER, ignored );
44   inport_byte( RX_BUFFER, ignored );
45   inport_byte( RX_BUFFER, ignored );
46   inport_byte( RX_BUFFER, ignored );
47}
48
49/*  console_initialize
50 *
51 *  This routine initializes the console IO driver.
52 *
53 *  Input parameters: NONE
54 *
55 *  Output parameters:  NONE
56 *
57 *  Return values:
58 */
59
60rtems_device_driver console_initialize(
61  rtems_device_major_number  major,
62  rtems_device_minor_number  minor,
63  void                      *arg
64)
65{
66  rtems_status_code status;
67
68  /*
69   *  flush the console now and at exit.  Just in case.
70   */
71
72  console_cleanup();
73
74  status = rtems_io_register_name(
75    "/dev/console",
76    major,
77    (rtems_device_minor_number) 0
78  );
79 
80  if (status != RTEMS_SUCCESSFUL)
81    rtems_fatal_error_occurred(status);
82
83  atexit( console_cleanup );
84
85  return RTEMS_SUCCESSFUL;
86}
87
88
89/*  is_character_ready
90 *
91 *  This routine returns TRUE if a character is available.
92 *
93 *  Input parameters: NONE
94 *
95 *  Output parameters:  NONE
96 *
97 *  Return values:
98 */
99
100rtems_boolean is_character_ready(
101  char *ch
102)
103{
104  register rtems_unsigned8 status;
105
106  inport_byte( RX_STATUS, status );
107
108  if ( Is_rx_ready( status ) ) {
109     inport_byte( RX_BUFFER,  status );
110     *ch = status;
111     return TRUE;
112  }
113  return FALSE;
114}
115
116/*  inbyte
117 *
118 *  This routine reads a character from the UART.
119 *
120 *  Input parameters: NONE
121 *
122 *  Output parameters:  NONE
123 *
124 *  Return values:
125 *    character read from UART
126 */
127
128char inbyte( void )
129{
130  register rtems_unsigned8 status;
131  char                     ch;
132
133  do {
134    inport_byte( RX_STATUS, status );
135  } while ( !Is_rx_ready( status ) );
136
137#if ( PORTB == 1 )
138  /*
139   *  Force example code resets the Channel B Receiver here.
140   *  It appears to cause XON's to be lost.
141   */
142
143   /* outport_byte( RX_STATUS, 0x10 );  */
144#endif
145
146  inport_byte( RX_BUFFER, ch );
147
148  return ch;
149}
150
151/*  outbyte
152 *
153 *  This routine transmits a character out the port.  It supports
154 *  XON/XOFF flow control.
155 *
156 *  Input parameters:
157 *    ch  - character to be transmitted
158 *
159 *  Output parameters:  NONE
160 */
161
162void outbyte(
163  char ch
164)
165{
166  rtems_unsigned8 status;
167
168  do {
169    inport_byte( TX_STATUS, status );
170  } while ( !Is_tx_ready( status ) );
171
172#if 0
173  while ( is_character_ready( &status ) == TRUE ) {      /* must be an XOFF */
174    if ( status == XOFF )
175      do {
176        while ( is_character_ready( &status ) == FALSE ) ;
177      } while ( status != XON );
178  }
179#endif
180
181  outport_byte( TX_BUFFER, ch );
182}
183
184/*
185 *  Open entry point
186 */
187 
188rtems_device_driver console_open(
189  rtems_device_major_number major,
190  rtems_device_minor_number minor,
191  void                    * arg
192)
193{
194  return RTEMS_SUCCESSFUL;
195}
196 
197/*
198 *  Close entry point
199 */
200 
201rtems_device_driver console_close(
202  rtems_device_major_number major,
203  rtems_device_minor_number minor,
204  void                    * arg
205)
206{
207  return RTEMS_SUCCESSFUL;
208}
209
210/*
211 * read bytes from the serial port. We only have stdin.
212 */
213 
214rtems_device_driver console_read(
215  rtems_device_major_number major,
216  rtems_device_minor_number minor,
217  void                    * arg
218)
219{
220  rtems_libio_rw_args_t *rw_args;
221  char *buffer;
222  int maximum;
223  int count = 0;
224 
225  rw_args = (rtems_libio_rw_args_t *) arg;
226 
227  buffer = rw_args->buffer;
228  maximum = rw_args->count;
229 
230  for (count = 0; count < maximum; count++) {
231    buffer[ count ] = inbyte();
232    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
233      buffer[ count++ ]  = '\n';
234      buffer[ count ]  = 0;
235      break;
236    }
237  }
238 
239  rw_args->bytes_moved = count;
240  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
241}
242 
243/*
244 * write bytes to the serial port. Stdout and stderr are the same.
245 */
246 
247rtems_device_driver console_write(
248  rtems_device_major_number major,
249  rtems_device_minor_number minor,
250  void                    * arg
251)
252{
253  int count;
254  int maximum;
255  rtems_libio_rw_args_t *rw_args;
256  char *buffer;
257 
258  rw_args = (rtems_libio_rw_args_t *) arg;
259 
260  buffer = rw_args->buffer;
261  maximum = rw_args->count;
262 
263  for (count = 0; count < maximum; count++) {
264    if ( buffer[ count ] == '\n') {
265      outbyte('\r');
266    }
267    outbyte( buffer[ count ] );
268  }
269
270  rw_args->bytes_moved = maximum;
271  return 0;
272}
273 
274/*
275 *  IO Control entry point
276 */
277 
278rtems_device_driver console_control(
279  rtems_device_major_number major,
280  rtems_device_minor_number minor,
281  void                    * arg
282)
283{
284  return RTEMS_SUCCESSFUL;
285}
286
Note: See TracBrowser for help on using the repository browser.