source: rtems/c/src/lib/libbsp/m68k/mvme162/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.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  return maximum;
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.