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

4.104.114.84.95
Last change on this file since d8ff793 was 98100d2, checked in by Joel Sherrill <joel.sherrill@…>, on 06/27/98 at 17:09:47

Monstrous patch from Ralf Corsepius <corsepiu@…>. I have
made no attempt to divide the comments up and place them with just
the appropriate files. Here is an excerpt from Ralf's email:

Changes including comments on changes I made after cycling through
all the targets:

  • Added ranlib support. Now all targets use "ranlib" instead of "ar -s" to build an index for a library. If ranlib isn't detected during configuration, check if ar -s is working and try "ar -s" instead of
  • Removed $(XXX_FOR_TARGET) from make/target.cfg.in, use $(XXX) instead now.
  • gcc-target-default.cfg: LINK_XXXX-defines reworked to solve the -l problem under posix (cf gcc-target-default.cfg)
  • rtems-glom replaced by Makefile-rules inside of the wrapup/Makefile.in that has been using rtems-glom until now.
  • Removed CCC and friends in gcc-target-default.cfg, as they have been breaking CXX support.
  • Removed CONFIG.$(TARGET_ARCH).CC lines from several custom/*.cfg files, because this is now set in custom/default.cfg.
  • Added aclocal/ar-s.m4, check whether "ar -s" is working
  • Added aclocal/cygwin.m4 and aclocal/exeext.m4.
  • Reworked aclocal/canonicalize-tools.m4: Added ar -s check; fixes for problems when XXX_FOR_TARGET is given via environment variables (didn't work for gcc until now), adding cygwin check, improved autoconf-cache handling.
  • Removed -l from make rule dependencies. LINK_LIBS is now allowed to contain -L and -l. LINK_OBJS and LINK_FILES must not contain -L or -l. gcc28 make-exe rules now link using $(LINK_OBJS) $(LINK_LIBS) => Almost all custom/*.cfg are modified. This is very likely to break something because of typos or having missed to edit a file.

Open problems, known bugs, things I didn't do:

  • custom/p4000.cfg seems to be out of date and requires to be reviewed.

(JRS NOTE: It is subordinate p4650 and p4600 -- both of which build ok

after minor changes.)

  • custom/psim.cfg needs to be reviewed, I added some changes to it, I am insecure about.

(JRS NOTE: psim had a minor problem endif/endef swapped but runs fine.)

  • rtems-glom.in can now be removed.
  • gcc*.cfg files "make depend" rules don't honor language specific flags (e.g CXXFLAGS is ignored for *.cc) - Nothing to worry about now, but may cause problems for hosts/targets not using gcc or rtems-add-ons that use external packages.
  • AFAIS, the no_bsp BSP can't be build anymore, i.e. configure refused to configure for it whatever I tried.
  • The toplevel and toplevel+1 README files are quite out-dated
  • cygwin.m4 isn't of much use for rtems. In most cases (cf. aclocal/*.m4) it is worked around by directly using $host_os. I think I'll remove it soon after the next snapshot
  • Before release the cygwin patch needs to be tested under cygwin. I may have broken/missed something (esp. the sed-pattern to convert
    into / may be broken).
  • You should try to build/run the posix-BSP under solaris - I don't expect problems, but I am not 100% sure, esp. with regard to ranlib/ar -s.
  • You should consider to convert all make/compilers/*.cfg files into make/compilers/*.cfg.in files and let autoconf generate the *.cfg. This may help getting rid of some if/then/else statements and help hard-coding some defines into those files in future and shouldn't disturb now.
  • Not having installed libc.a/libm.a on a host may still break building rtems, esp. when using -disable-gcc28 as the gcc27-configuration scheme directly accesses libc.a and libm.a. The problem should not appear when using gcc28 because it references libc/libm only through -lc and -lm which may be static or dynamic (I didn't test this).
  • shgen is not yet included (I didn't yet have enough time to integrate it).
  • I know about a few more configure-probs (esp. cross-checking --enable-* flags).

+ warn/refuse to configure when --enable-libcdir and

--enable-gcc28 are given.

+ force --enable-libcdir when --disable-gcc28 is given

  • Replaced KSHELL with @KSH@ in some shell scripts generated by configure.in.
  • Added a dependency to aclocal/*.m4 in the toplevel Makefile => configure and aclocal.m4 will now be rebuild when any aclocal/*.m4 file is changed
  • Some changes to aclocal/gcc-pipe.m4 and aclocal/gcc-specs.m4
  • Replaced i3456?86-unknown-freebsd2.12? with i3456?86-*freebsd2.* in configure.in, as I suppose there might exist a variety of valid vendors (2nd field of the name-tripple)
  • Disabled override MAKEFLAGS in toplevel Makefile.in - Potential side-effects are not really clear to me.
  • In mvme162.cfg, $(LINK_LIBS) is missing in the CC line in gcc28's make-exe rule (yet another one I missed to edit). Just append $(LINK_LIBS) to the "CC" line, like I hopefully did to ALL other custom/*.cfg files.
  • the problem with mvme162lx.cfg is a follow-up problem of the mvme162.cfg-bug.
  • mvme162/console and idp/console had variables named Buffer which conflicted with similarly named variables in some tests.
  • 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-1998.
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 be
9 *  found in 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  Console_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(&Console_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( &Console_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( &Console_Buffer[port] ) )
117    return FALSE;
118
119  Ring_buffer_Remove_character( &Console_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.