source: rtems/c/src/lib/libbsp/m68k/mvme162/console/console.c @ 8f35817

4.104.114.84.95
Last change on this file since 8f35817 was 8f35817, checked in by Joel Sherrill <joel.sherrill@…>, on Sep 15, 1997 at 6:52:26 PM

eliminated potential for overfilling buffer on read

  • Property mode set to 100644
File size: 5.1 KB
Line 
1/*
2 *  This file contains the MVME162 console IO package.
3 *
4 *  COPYRIGHT (c) 1989-1997.
5 *  On-Line Applications Research Corporation (OAR).
6 *  Copyright assigned to U.S. Government, 1994.
7 *
8 *  The license and distribution terms for this file may in
9 *  the file LICENSE in this distribution or at
10 *  http://www.OARcorp.com/rtems/license.html.
11 *
12 *  Modifications of respective RTEMS file: COPYRIGHT (c) 1994.
13 *  EISCAT Scientific Association. M.Savitski
14 *
15 *  This material is a part of the MVME162 Board Support Package
16 *  for the RTEMS executive. Its licensing policies are those of the
17 *  RTEMS above.
18 *
19 *  $Id$
20 */
21
22#define M162_INIT
23
24#include <bsp.h>
25#include <rtems/libio.h>
26#include <ringbuf.h>
27
28Ring_buffer_t  Buffer[2];
29
30/*
31 *  Interrupt handler for receiver interrupts
32 */
33
34rtems_isr C_Receive_ISR(rtems_vector_number vector)
35{
36  register int    ipend, port;
37
38  ZWRITE0(1, 0x38);     /* reset highest IUS */
39
40  ipend = ZREAD(1, 3);  /* read int pending from A side */
41
42  if      (ipend == 0x04) port = 0;   /* channel B intr pending */
43  else if (ipend == 0x20) port = 1;   /* channel A intr pending */
44  else return;
45   
46  Ring_buffer_Add_character(&Buffer[port], ZREADD(port));
47 
48  if (ZREAD(port, 1) & 0x70) {    /* check error stat */
49    ZWRITE0(port, 0x30);          /* reset error */
50  }
51}
52
53rtems_device_driver console_initialize(
54  rtems_device_major_number  major,
55  rtems_device_minor_number  minor,
56  void                      *arg
57)
58{
59  int     i;
60  rtems_status_code status;
61 
62  /*
63   * Initialise receiver interrupts on both ports
64   */
65
66  for (i = 0; i <= 1; i++) {
67    Ring_buffer_Initialize( &Buffer[i] );
68    ZWRITE(i, 2, SCC_VECTOR);
69    ZWRITE(i, 10, 0);
70    ZWRITE(i, 1, 0x10);     /* int on all Rx chars or special condition */
71    ZWRITE(i, 9, 8);        /* master interrupt enable */
72  }
73   
74  set_vector(C_Receive_ISR, SCC_VECTOR, 1); /* install ISR for ports A and B */
75
76  mcchip->vector_base = 0;
77  mcchip->gen_control = 2;        /* MIEN */
78  mcchip->SCC_int_ctl = 0x13;     /* SCC IEN, IPL3 */
79
80  status = rtems_io_register_name(
81    "/dev/console",
82    major,
83    (rtems_device_minor_number) 1
84  );
85 
86  if (status != RTEMS_SUCCESSFUL)
87    rtems_fatal_error_occurred(status);
88 
89  status = rtems_io_register_name(
90    "/dev/tty00",
91    major,
92    (rtems_device_minor_number) 0
93  );
94 
95  if (status != RTEMS_SUCCESSFUL)
96    rtems_fatal_error_occurred(status);
97 
98  status = rtems_io_register_name(
99    "/dev/tty01",
100    major,
101    (rtems_device_minor_number) 1
102  );
103 
104  if (status != RTEMS_SUCCESSFUL)
105    rtems_fatal_error_occurred(status);
106 
107  return RTEMS_SUCCESSFUL;
108}
109
110/*
111 *   Non-blocking char input
112 */
113
114rtems_boolean char_ready(int port, char *ch)
115{
116  if ( Ring_buffer_Is_empty( &Buffer[port] ) )
117    return FALSE;
118
119  Ring_buffer_Remove_character( &Buffer[port], *ch );
120 
121  return TRUE;
122}
123
124/*
125 *   Block on char input
126 */
127
128char inbyte(int port)
129{
130  unsigned char tmp_char;
131 
132  while ( !char_ready(port, &tmp_char) );
133  return tmp_char;
134}
135
136/* 
137 *   This routine transmits a character out the SCC.  It no longer supports
138 *   XON/XOFF flow control.
139 */
140
141void outbyte(char ch, int port)
142{
143  while (1) {
144    if (ZREAD0(port) & TX_BUFFER_EMPTY) break;
145  }
146  ZWRITED(port, ch);
147}
148
149/*
150 *  Open entry point
151 */
152
153rtems_device_driver console_open(
154  rtems_device_major_number major,
155  rtems_device_minor_number minor,
156  void                    * arg
157)
158{
159  return RTEMS_SUCCESSFUL;
160}
161 
162/*
163 *  Close entry point
164 */
165
166rtems_device_driver console_close(
167  rtems_device_major_number major,
168  rtems_device_minor_number minor,
169  void                    * arg
170)
171{
172  return RTEMS_SUCCESSFUL;
173}
174
175/*
176 * read bytes from the serial port. We only have stdin.
177 */
178
179rtems_device_driver console_read(
180  rtems_device_major_number major,
181  rtems_device_minor_number minor,
182  void                    * arg
183)
184{
185  rtems_libio_rw_args_t *rw_args;
186  char *buffer;
187  int maximum;
188  int count = 0;
189 
190  rw_args = (rtems_libio_rw_args_t *) arg;
191
192  buffer = rw_args->buffer;
193  maximum = rw_args->count;
194
195  if ( minor > 1 )
196    return RTEMS_INVALID_NUMBER;
197
198  for (count = 0; count < maximum; count++) {
199    buffer[ count ] = inbyte( minor );
200    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
201      buffer[ count++ ]  = '\n';
202      break;
203    }
204  }
205
206  rw_args->bytes_moved = count;
207  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
208}
209
210/*
211 * write bytes to the serial port. Stdout and stderr are the same.
212 */
213
214rtems_device_driver console_write(
215  rtems_device_major_number major,
216  rtems_device_minor_number minor,
217  void                    * arg
218)
219{
220  int count;
221  int maximum;
222  rtems_libio_rw_args_t *rw_args;
223  char *buffer;
224
225  rw_args = (rtems_libio_rw_args_t *) arg;
226
227  buffer = rw_args->buffer;
228  maximum = rw_args->count;
229
230  if ( minor > 1 )
231    return RTEMS_INVALID_NUMBER;
232
233  for (count = 0; count < maximum; count++) {
234    if ( buffer[ count ] == '\n') {
235      outbyte('\r', minor );
236    }
237    outbyte( buffer[ count ], minor  );
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}
Note: See TracBrowser for help on using the repository browser.