source: rtems/c/src/lib/libbsp/m68k/idp/console/console.c @ 19fd334

4.104.114.84.95
Last change on this file since 19fd334 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.0 KB
Line 
1/* 
2 *  This file contains the Motorola IDP console IO package.
3 *
4 *  Written by Doug McBride, Colorado Space Grant College
5 *  Based off of the board support packages of RTEMS
6 *
7 *  Updated to RTEMS 3.2.0 by Joel Sherrill.
8 *
9 *  $Id$
10 */
11
12#define MIDP_INIT
13
14#include <bsp.h>
15#include <rtems/libio.h>
16
17#include <ringbuf.h>
18
19Ring_buffer_t  Buffer[ 2 ];
20
21rtems_isr C_Receive_ISR(rtems_vector_number vector);
22
23/*  console_initialize
24 *
25 *  This routine initializes the console IO driver.
26 *
27 *  Input parameters: NONE
28 *
29 *  Output parameters:  NONE
30 *
31 *  Return values:
32 */
33
34rtems_device_driver console_initialize(
35  rtems_device_major_number  major,
36  rtems_device_minor_number  minor,
37  void                      *arg
38)
39{
40  rtems_status_code status;
41
42  Ring_buffer_Initialize( &Buffer[ 0 ] );
43  Ring_buffer_Initialize( &Buffer[ 1 ] );
44
45  init_pit();
46
47  status = rtems_io_register_name(
48    "/dev/console",
49    major,
50    (rtems_device_minor_number) 0
51  );
52 
53  if (status != RTEMS_SUCCESSFUL)
54    rtems_fatal_error_occurred(status);
55 
56  status = rtems_io_register_name(
57    "/dev/tty00",
58    major,
59    (rtems_device_minor_number) 0
60  );
61 
62  if (status != RTEMS_SUCCESSFUL)
63    rtems_fatal_error_occurred(status);
64 
65  status = rtems_io_register_name(
66    "/dev/tty01",
67    major,
68    (rtems_device_minor_number) 1
69  );
70 
71  if (status != RTEMS_SUCCESSFUL)
72    rtems_fatal_error_occurred(status);
73 
74  return RTEMS_SUCCESSFUL;
75}
76
77
78/*  is_character_ready
79 *
80 *  This routine returns TRUE if a character is available.
81 *
82 *  Input parameters: NONE
83 *
84 *  Output parameters:  NONE
85 *
86 *  Return values:
87 */
88
89rtems_boolean is_character_ready(
90  char *ch,
91  int   port
92)
93{
94  if ( Ring_buffer_Is_empty( &Buffer[ port ] ) )
95    return FALSE;
96
97  Ring_buffer_Remove_character( &Buffer[ port ], *ch );
98  return TRUE;
99}
100
101/*  quick_char_check
102 *
103 *  This routine returns TRUE if a character is available.
104 *  It is different from above because it does not disturb the ring buffer
105 *
106 *  Input parameters: NONE
107 *
108 *  Output parameters:  NONE
109 *
110 *  Return values:
111 */
112
113rtems_boolean quick_char_check(
114  int   port
115)
116{
117  if ( Ring_buffer_Is_empty( &Buffer[ port ] ) )
118    return FALSE;
119
120  return TRUE;
121}
122
123/*  inbyte
124 *
125 *  This routine reads a character from the UART through a buffer.
126 *
127 *  Input parameters: NONE
128 *
129 *  Output parameters:  NONE
130 *
131 *  Return values:
132 *    character read from UART
133 */
134
135char inbyte(
136  int port
137)
138{
139  unsigned char tmp_char;
140 
141  /* If you come into this routine without checking is_character_ready() first
142     and you want nonblocking code, then it's your own fault */
143
144  while ( !is_character_ready( &tmp_char, port ) );
145 
146  return tmp_char;
147}
148
149
150/*  outbyte
151 *
152 *  This routine transmits a character out the M68681.  It supports
153 *  XON/XOFF flow control.
154 *
155 *  Input parameters:
156 *    ch  - character to be transmitted
157 *
158 *  Output parameters:  NONE
159 */
160
161void outbyte(
162  char ch,
163  int  port
164)
165{
166  switch ( port ) {
167    case 0:
168      transmit_char( ch );
169      break;
170    case 1:
171      transmit_char_portb( ch );
172      break;
173  }
174
175}
176
177/*
178 *  Open entry point
179 */
180
181rtems_device_driver console_open(
182  rtems_device_major_number major,
183  rtems_device_minor_number minor,
184  void                    * arg
185)
186{
187  return RTEMS_SUCCESSFUL;
188}
189 
190/*
191 *  Close entry point
192 */
193
194rtems_device_driver console_close(
195  rtems_device_major_number major,
196  rtems_device_minor_number minor,
197  void                    * arg
198)
199{
200  return RTEMS_SUCCESSFUL;
201}
202
203/*
204 * read bytes from the serial port. We only have stdin.
205 */
206
207rtems_device_driver console_read(
208  rtems_device_major_number major,
209  rtems_device_minor_number minor,
210  void                    * arg
211)
212{
213  rtems_libio_rw_args_t *rw_args;
214  char *buffer;
215  int maximum;
216  int count = 0;
217 
218  rw_args = (rtems_libio_rw_args_t *) arg;
219
220  buffer = rw_args->buffer;
221  maximum = rw_args->count;
222
223  if ( minor > 1 )
224    return RTEMS_INVALID_NUMBER;
225
226  for (count = 0; count < maximum; count++) {
227    buffer[ count ] = inbyte( minor );
228    if (buffer[ count ] == '\n' || buffer[ count ] == '\r') {
229      buffer[ count++ ]  = '\n';
230      buffer[ count ]  = 0;
231      break;
232    }
233  }
234
235  rw_args->bytes_moved = count;
236  return (count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED;
237}
238
239/*
240 * write bytes to the serial port. Stdout and stderr are the same.
241 */
242
243rtems_device_driver console_write(
244  rtems_device_major_number major,
245  rtems_device_minor_number minor,
246  void                    * arg
247)
248{
249  int count;
250  int maximum;
251  rtems_libio_rw_args_t *rw_args;
252  char *buffer;
253
254  rw_args = (rtems_libio_rw_args_t *) arg;
255
256  buffer = rw_args->buffer;
257  maximum = rw_args->count;
258
259  if ( minor > 1 )
260    return RTEMS_INVALID_NUMBER;
261
262  for (count = 0; count < maximum; count++) {
263    if ( buffer[ count ] == '\n') {
264      outbyte('\r', minor );
265    }
266    outbyte( buffer[ count ], minor  );
267  }
268
269  rw_args->bytes_moved = maximum;
270  return 0;
271}
272
273/*
274 *  IO Control entry point
275 */
276
277rtems_device_driver console_control(
278  rtems_device_major_number major,
279  rtems_device_minor_number minor,
280  void                    * arg
281)
282{
283  return RTEMS_SUCCESSFUL;
284}
Note: See TracBrowser for help on using the repository browser.