source: rtems/c/src/lib/libbsp/m68k/mvme147/console/console.c @ f52111f

4.104.114.84.95
Last change on this file since f52111f was 08311cc3, checked in by Joel Sherrill <joel.sherrill@…>, on 11/17/99 at 17:51:34

Updated copyright notice.

  • Property mode set to 100644
File size: 4.7 KB
Line 
1/*
2 *  This file contains the MVME147 console IO package.
3 *
4 *  COPYRIGHT (c) 1989-1999.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 *  The license and distribution terms for this file may be
8 *  found in the file LICENSE in this distribution or at
9 *  http://www.OARcorp.com/rtems/license.html.
10 *
11 *  MVME147 port for TNI - Telecom Bretagne
12 *  by Dominique LE CAMPION (Dominique.LECAMPION@enst-bretagne.fr)
13 *  May 1996
14 *
15 *  This file was taken from the DMV152 bsp
16 *
17 *  $Id$
18 */
19
20#define M147_INIT
21
22#include <bsp.h>
23#include <rtems/libio.h>
24#include <zilog/z8530.h>
25
26
27/*  console_initialize
28 *
29 *  This routine initializes the console IO driver.
30 *
31 *  Input parameters: NONE
32 *
33 *  Output parameters:  NONE
34 *
35 *  Return values:
36 */
37 
38rtems_device_driver console_initialize(
39  rtems_device_major_number  major,
40  rtems_device_minor_number  minor,
41  void                      *arg
42)
43{
44  rtems_status_code status;
45 
46  status = rtems_io_register_name(
47    "/dev/console",
48    major,
49    (rtems_device_minor_number) 0
50  );
51 
52  if (status != RTEMS_SUCCESSFUL)
53    rtems_fatal_error_occurred(status);
54 
55  return RTEMS_SUCCESSFUL;
56}
57
58/*  is_character_ready
59 *
60 *  This routine returns TRUE if a character is available.
61 *
62 *  Input parameters: NONE
63 *
64 *  Output parameters:  NONE
65 *
66 *  Return values:
67 */
68
69rtems_boolean is_character_ready(
70  char *ch
71)
72{
73  rtems_unsigned8 rr_0;
74
75  for ( ; ; ) {
76    Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
77    if ( !(rr_0 & RR_0_RX_DATA_AVAILABLE) )
78      return( FALSE );
79
80    Z8x30_READ_DATA( CONSOLE_DATA, *ch );
81    return( TRUE );
82  }
83}
84
85/*  inbyte
86 *
87 *  This routine reads a character from the SCC.
88 *
89 *  Input parameters: NONE
90 *
91 *  Output parameters:  NONE
92 *
93 *  Return values:
94 *    character read from SCC
95 */
96
97char inbyte( void )
98{
99  rtems_unsigned8 rr_0;
100  char ch;
101
102  for ( ; ; ) {
103    Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
104    if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) != 0 )
105      break;
106  }
107
108  Z8x30_READ_DATA( CONSOLE_DATA, ch );
109  return ( ch );
110}
111
112/*  outbyte
113 *
114 *  This routine transmits a character out the SCC.  It supports
115 *  XON/XOFF flow control.
116 *
117 *  Input parameters:
118 *    ch  - character to be transmitted
119 *
120 *  Output parameters:  NONE
121 */
122
123void outbyte(
124  char ch
125)
126{
127  rtems_unsigned8 rr_0;
128  char            flow_control;
129
130  for ( ; ; ) {
131    Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
132    if ( (rr_0 & RR_0_TX_BUFFER_EMPTY) != 0 )
133      break;
134  }
135
136  for ( ; ; ) {
137    Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
138    if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 )
139      break;
140
141    Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
142
143    if ( flow_control == XOFF )
144      do {
145        do {
146          Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
147        } while ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 );
148        Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
149      } while ( flow_control != XON );
150  }
151
152  Z8x30_WRITE_DATA( CONSOLE_DATA, ch );
153}
154
155/*
156 *  Open entry point
157 */
158
159rtems_device_driver console_open(
160  rtems_device_major_number major,
161  rtems_device_minor_number minor,
162  void                    * arg
163)
164{
165  return RTEMS_SUCCESSFUL;
166}
167 
168/*
169 *  Close entry point
170 */
171
172rtems_device_driver console_close(
173  rtems_device_major_number major,
174  rtems_device_minor_number minor,
175  void                    * arg
176)
177{
178  return RTEMS_SUCCESSFUL;
179}
180
181/*
182 * read bytes from the serial port. We only have stdin.
183 */
184
185rtems_device_driver console_read(
186  rtems_device_major_number major,
187  rtems_device_minor_number minor,
188  void                    * arg
189)
190{
191  rtems_libio_rw_args_t *rw_args;
192  char *buffer;
193  int maximum;
194  int count = 0;
195 
196  rw_args = (rtems_libio_rw_args_t *) arg;
197
198  buffer = rw_args->buffer;
199  maximum = rw_args->count;
200
201  for (count = 0; count < maximum; count++) {
202    buffer[ count ] = inbyte();
203    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
204      buffer[ count++ ]  = '\n';
205      break;
206    }
207  }
208
209  rw_args->bytes_moved = count;
210  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
211}
212
213/*
214 * write bytes to the serial port. Stdout and stderr are the same.
215 */
216
217rtems_device_driver console_write(
218  rtems_device_major_number major,
219  rtems_device_minor_number minor,
220  void                    * arg
221)
222{
223  int count;
224  int maximum;
225  rtems_libio_rw_args_t *rw_args;
226  char *buffer;
227
228  rw_args = (rtems_libio_rw_args_t *) arg;
229
230  buffer = rw_args->buffer;
231  maximum = rw_args->count;
232
233  for (count = 0; count < maximum; count++) {
234    if ( buffer[ count ] == '\n') {
235      outbyte('\r');
236    }
237    outbyte( buffer[ count ] );
238  }
239
240  rw_args->bytes_moved = maximum;
241  return 0;
242}
243
244/*
245 *  IO Control entry point
246 */
247
248rtems_device_driver console_control(
249  rtems_device_major_number major,
250  rtems_device_minor_number minor,
251  void                    * arg
252)
253{
254  return RTEMS_SUCCESSFUL;
255}
256
Note: See TracBrowser for help on using the repository browser.