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

4.104.114.95
Last change on this file since 907bf4b8 was 907bf4b8, checked in by Ralf Corsepius <ralf.corsepius@…>, on 09/05/08 at 08:46:27

Convert to "bool".

  • 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.rtems.com/license/LICENSE.
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 <rtems/zilog/z8530.h>
25
26/*  console_initialize
27 *
28 *  This routine initializes the console IO driver.
29 *
30 *  Input parameters: NONE
31 *
32 *  Output parameters:  NONE
33 *
34 *  Return values:
35 */
36
37rtems_device_driver console_initialize(
38  rtems_device_major_number  major,
39  rtems_device_minor_number  minor,
40  void                      *arg
41)
42{
43  rtems_status_code status;
44
45  status = rtems_io_register_name(
46    "/dev/console",
47    major,
48    (rtems_device_minor_number) 0
49  );
50
51  if (status != RTEMS_SUCCESSFUL)
52    rtems_fatal_error_occurred(status);
53
54  return RTEMS_SUCCESSFUL;
55}
56
57/*  is_character_ready
58 *
59 *  This routine returns TRUE if a character is available.
60 *
61 *  Input parameters: NONE
62 *
63 *  Output parameters:  NONE
64 *
65 *  Return values:
66 */
67
68bool is_character_ready(
69  char *ch
70)
71{
72  uint8_t         rr_0;
73
74  for ( ; ; ) {
75    Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
76    if ( !(rr_0 & RR_0_RX_DATA_AVAILABLE) )
77      return false;
78
79    Z8x30_READ_DATA( CONSOLE_DATA, *ch );
80    return true;
81  }
82}
83
84/*  inbyte
85 *
86 *  This routine reads a character from the SCC.
87 *
88 *  Input parameters: NONE
89 *
90 *  Output parameters:  NONE
91 *
92 *  Return values:
93 *    character read from SCC
94 */
95
96char inbyte( void )
97{
98  uint8_t         rr_0;
99  char ch;
100
101  for ( ; ; ) {
102    Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
103    if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) != 0 )
104      break;
105  }
106
107  Z8x30_READ_DATA( CONSOLE_DATA, ch );
108  return ( ch );
109}
110
111/*  outbyte
112 *
113 *  This routine transmits a character out the SCC.  It supports
114 *  XON/XOFF flow control.
115 *
116 *  Input parameters:
117 *    ch  - character to be transmitted
118 *
119 *  Output parameters:  NONE
120 */
121
122void outbyte(
123  char ch
124)
125{
126  uint8_t         rr_0;
127  char            flow_control;
128
129  for ( ; ; ) {
130    Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
131    if ( (rr_0 & RR_0_TX_BUFFER_EMPTY) != 0 )
132      break;
133  }
134
135  for ( ; ; ) {
136    Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
137    if ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 )
138      break;
139
140    Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
141
142    if ( flow_control == XOFF )
143      do {
144        do {
145          Z8x30_READ_CONTROL( CONSOLE_CONTROL, RR_0, rr_0 );
146        } while ( (rr_0 & RR_0_RX_DATA_AVAILABLE) == 0 );
147        Z8x30_READ_DATA( CONSOLE_DATA, flow_control );
148      } while ( flow_control != XON );
149  }
150
151  Z8x30_WRITE_DATA( CONSOLE_DATA, 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      buffer[ count++ ]  = '\n';
204      break;
205    }
206  }
207
208  rw_args->bytes_moved = count;
209  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
210}
211
212/*
213 * write bytes to the serial port. Stdout and stderr are the same.
214 */
215
216rtems_device_driver console_write(
217  rtems_device_major_number major,
218  rtems_device_minor_number minor,
219  void                    * arg
220)
221{
222  int count;
223  int maximum;
224  rtems_libio_rw_args_t *rw_args;
225  char *buffer;
226
227  rw_args = (rtems_libio_rw_args_t *) arg;
228
229  buffer = rw_args->buffer;
230  maximum = rw_args->count;
231
232  for (count = 0; count < maximum; count++) {
233    if ( buffer[ count ] == '\n') {
234      outbyte('\r');
235    }
236    outbyte( buffer[ count ] );
237  }
238
239  rw_args->bytes_moved = maximum;
240  return 0;
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}
Note: See TracBrowser for help on using the repository browser.