source: rtems/c/src/lib/libbsp/i386/force386/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 Sep 11, 1995 at 7:35:39 PM

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: 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  return maximum;
270}
271 
272/*
273 *  IO Control entry point
274 */
275 
276rtems_device_driver console_control(
277  rtems_device_major_number major,
278  rtems_device_minor_number minor,
279  void                    * arg
280)
281{
282  return RTEMS_SUCCESSFUL;
283}
284
Note: See TracBrowser for help on using the repository browser.