source: rtems/c/src/lib/libbsp/m68k/mvme162/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 09/19/95 at 14:53:29

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.2 KB
Line 
1/*
2 *  This file contains the MVME162 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 *  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) 0
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) 0
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(int port, char ch)
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      buffer[ count ]  = 0;
203      break;
204    }
205  }
206
207  rw_args->bytes_moved = count;
208  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
209}
210
211/*
212 * write bytes to the serial port. Stdout and stderr are the same.
213 */
214
215rtems_device_driver console_write(
216  rtems_device_major_number major,
217  rtems_device_minor_number minor,
218  void                    * arg
219)
220{
221  int count;
222  int maximum;
223  rtems_libio_rw_args_t *rw_args;
224  char *buffer;
225
226  rw_args = (rtems_libio_rw_args_t *) arg;
227
228  buffer = rw_args->buffer;
229  maximum = rw_args->count;
230
231  if ( minor > 1 )
232    return RTEMS_INVALID_NUMBER;
233
234  for (count = 0; count < maximum; count++) {
235    if ( buffer[ count ] == '\n') {
236      outbyte('\r', minor );
237    }
238    outbyte( buffer[ count ], minor  );
239  }
240
241  rw_args->bytes_moved = maximum;
242  return 0;
243}
244
245/*
246 *  IO Control entry point
247 */
248
249rtems_device_driver console_control(
250  rtems_device_major_number major,
251  rtems_device_minor_number minor,
252  void                    * arg
253)
254{
255  return RTEMS_SUCCESSFUL;
256}
Note: See TracBrowser for help on using the repository browser.