source: rtems/c/src/lib/libbsp/m68k/mcf5206elite/console/console.c @ 1625856

4.104.114.84.95
Last change on this file since 1625856 was 1625856, checked in by Joel Sherrill <joel.sherrill@…>, on 11/04/02 at 14:26:33

2002-11-04 Joel Sherrill <joel@…>

  • console/console.c, i2c/i2cdrv.c, nvram/nvram.c, startup/bspstart.c, tod/ds1307.c: Removed warnings.
  • Property mode set to 100644
File size: 11.0 KB
Line 
1/*
2 * Console driver for Motorola MCF5206E UART modules
3 *
4 * Copyright (C) 2000 OKTET Ltd., St.-Petersburg, Russia
5 * Author: Victor V. Vengerov <vvv@oktet.ru>
6 *
7 *  COPYRIGHT (c) 1989-1998.
8 *  On-Line Applications Research Corporation (OAR).
9 *  Copyright assigned to U.S. Government, 1994.
10 *
11 *  The license and distribution terms for this file may be
12 *  found in the file LICENSE in this distribution or at
13 *
14 *  http://www.OARcorp.com/rtems/license.html.
15 *
16 *  $Id$
17 */
18
19#include <termios.h>
20#include <bsp.h>
21#include <rtems/libio.h>
22#include "mcf5206/mcf5206e.h"
23#include "mcf5206/mcfuart.h"
24
25
26/* Descriptor structures for two on-chip UART channels */
27static mcfuart uart[2];
28
29/* Console operations mode:
30 *     0 - raw (non-termios) polled input/output
31 *     1 - termios-based polled input/output
32 *     2 - termios-based interrupt-driven input/output
33 */
34int console_mode = 2;
35#define CONSOLE_MODE_RAW  (0)
36#define CONSOLE_MODE_POLL (1)
37#define CONSOLE_MODE_INT  (2)
38
39/* Wrapper functions for MCF UART generic driver */
40
41/* console_poll_read --
42 *     wrapper for poll read function
43 *
44 * PARAMETERS:
45 *     minor - minor device number
46 *
47 * RETURNS:
48 *     character code readed from UART, or -1 if there is no characters
49 *     available
50 */
51static int
52console_poll_read(int minor)
53{
54    return mcfuart_poll_read(&uart[minor]);
55}
56
57/* console_interrupt_write --
58 *     wrapper for interrupt write function
59 *
60 * PARAMETERS:
61 *     minor - minor device number
62 *     buf - output buffer
63 *     len - output buffer length
64 *
65 * RETURNS:
66 *     result code
67 */
68static int
69console_interrupt_write(int minor, const char *buf, int len)
70{
71    return mcfuart_interrupt_write(&uart[minor], buf, len);
72}
73
74/* console_poll_write --
75 *     wrapper for polling mode write function
76 *
77 * PARAMETERS:
78 *     minor - minor device number
79 *     buf - output buffer
80 *     len - output buffer length
81 *
82 * RETURNS:
83 *     result code
84 */
85static int
86console_poll_write(int minor, const char *buf, int len)
87{
88    return mcfuart_poll_write(&uart[minor], buf, len);
89}
90
91/* console_set_attributes --
92 *     wrapper for hardware-dependent termios attributes setting
93 *
94 * PARAMETERS:
95 *     minor - minor device number
96 *     t - pointer to the termios structure
97 *
98 * RETURNS:
99 *     result code
100 */
101static int
102console_set_attributes(int minor, const struct termios *t)
103{
104    return mcfuart_set_attributes(&uart[minor], t);
105}
106
107/* console_stop_remote_tx --
108 *     wrapper for stopping data flow from remote party.
109 *
110 * PARAMETERS:
111 *     minor - minor device number
112 *
113 * RETURNS:
114 *     result code
115 */
116static int
117console_stop_remote_tx(int minor)
118{
119    if (minor < sizeof(uart)/sizeof(uart[0]))
120        return mcfuart_stop_remote_tx(&uart[minor]);
121    else
122        return RTEMS_INVALID_NUMBER;
123}
124
125/* console_start_remote_tx --
126 *     wrapper for resuming data flow from remote party.
127 *
128 * PARAMETERS:
129 *     minor - minor device number
130 *
131 */
132static int
133console_start_remote_tx(int minor)
134{
135    if (minor < sizeof(uart)/sizeof(uart[0]))
136        return mcfuart_start_remote_tx(&uart[minor]);
137    else
138        return RTEMS_INVALID_NUMBER;
139}
140
141/* console_first_open --
142 *     wrapper for UART controller initialization functions
143 *
144 * PARAMETERS:
145 *     major - major device number
146 *     minor - minor device number
147 *     arg - libio device open argument
148 *
149 * RETURNS:
150 *     error code
151 */
152static int
153console_first_open(int major, int minor, void *arg)
154{
155    rtems_libio_open_close_args_t *args = arg;
156    rtems_status_code sc;
157    rtems_unsigned8 intvec;
158   
159    switch (minor)
160    {
161        case 0: intvec = BSP_INTVEC_UART1; break;
162        case 1: intvec = BSP_INTVEC_UART2; break;
163        default:
164            return RTEMS_INVALID_NUMBER;
165    }
166
167    if (console_mode != CONSOLE_MODE_INT)
168    {
169        intvec = 0;
170    }
171
172    sc = mcfuart_init(&uart[minor],          /* uart */
173                      args->iop->data1,      /* tty */
174                      intvec,                /* interrupt vector number */
175                      minor+1);
176
177    if (sc == RTEMS_SUCCESSFUL)
178        sc = mcfuart_reset(&uart[minor]);
179
180    return sc;
181}
182
183/* console_last_close --
184 *     wrapper for UART controller close function
185 *
186 * PARAMETERS:
187 *     major - major device number
188 *     minor - minor device number
189 *     arg - libio device close argument
190 *
191 * RETURNS:
192 *     error code
193 */
194static int
195console_last_close(int major, int minor, void *arg)
196{
197    return mcfuart_disable(&uart[minor]);
198}
199
200/* console_initialize --
201 *     This routine initializes the console IO drivers and register devices
202 *     in RTEMS I/O system.
203 *
204 * PARAMETERS:
205 *     major - major console device number
206 *     minor - minor console device number (not used)
207 *     arg - device initialize argument
208 *
209 * RETURNS:
210 *     RTEMS error code (RTEMS_SUCCESSFUL if device initialized successfuly)
211 */
212rtems_device_driver
213console_initialize(rtems_device_major_number major,
214                   rtems_device_minor_number minor,
215                   void *arg)
216{
217    rtems_status_code status;
218
219    /*
220     * Set up TERMIOS
221     */
222    if (console_mode != CONSOLE_MODE_RAW)
223        rtems_termios_initialize ();
224
225    /*
226     * Register the devices
227     */
228    status = rtems_io_register_name ("/dev/console", major, 0);
229    if (status != RTEMS_SUCCESSFUL)
230        rtems_fatal_error_occurred (status);
231    status = rtems_io_register_name ("/dev/aux", major, 1);
232    if (status != RTEMS_SUCCESSFUL)
233        rtems_fatal_error_occurred (status);
234
235    if (console_mode == CONSOLE_MODE_RAW)
236    {
237        rtems_status_code sc;
238        sc = mcfuart_init(&uart[0],              /* uart */
239                          NULL,                  /* tty */
240                          0,                     /* interrupt vector number */
241                          1);                    /* UART channel number */
242
243        if (sc == RTEMS_SUCCESSFUL)
244            sc = mcfuart_reset(&uart[0]);
245
246        sc = mcfuart_init(&uart[1],              /* uart */
247                          NULL,                  /* tty */
248                          0,                     /* interrupt vector number */
249                          2);                    /* UART channel number */
250
251        if (sc == RTEMS_SUCCESSFUL)
252            sc = mcfuart_reset(&uart[1]);
253        return sc;
254    }
255   
256    return RTEMS_SUCCESSFUL;
257}
258
259/* console_open --
260 *     Open console device driver. Pass appropriate termios callback
261 *     functions to termios library.
262 *
263 * PARAMETERS:
264 *     major - major device number for console devices
265 *     minor - minor device number for console
266 *     arg - device opening argument
267 *
268 * RETURNS:
269 *     RTEMS error code
270 */
271rtems_device_driver
272console_open(rtems_device_major_number major,
273             rtems_device_minor_number minor,
274             void *arg)
275{
276    static const rtems_termios_callbacks intr_callbacks = {
277        console_first_open,        /* firstOpen */
278        console_last_close,        /* lastClose */
279        NULL,                      /* pollRead */
280        console_interrupt_write,   /* write */
281        console_set_attributes,    /* setAttributes */
282        console_stop_remote_tx,    /* stopRemoteTx */
283        console_start_remote_tx,   /* startRemoteTx */
284        1                          /* outputUsesInterrupts */
285    };
286    static const rtems_termios_callbacks poll_callbacks = {
287        console_first_open,        /* firstOpen */
288        console_last_close,        /* lastClose */
289        console_poll_read,         /* pollRead */
290        console_poll_write,        /* write */
291        console_set_attributes,    /* setAttributes */
292        console_stop_remote_tx,    /* stopRemoteTx */
293        console_start_remote_tx,   /* startRemoteTx */
294        0                          /* outputUsesInterrupts */
295    };
296
297    switch (console_mode)
298    {
299        case CONSOLE_MODE_RAW:
300            return RTEMS_SUCCESSFUL;
301           
302        case CONSOLE_MODE_INT:
303            return rtems_termios_open(major, minor, arg, &intr_callbacks);
304           
305        case CONSOLE_MODE_POLL:
306            return rtems_termios_open(major, minor, arg, &poll_callbacks);
307
308        default:
309            rtems_fatal_error_occurred(0xC07A1310);
310    }
311    return RTEMS_INTERNAL_ERROR;
312}
313
314/* console_close --
315 *     Close console device.
316 *
317 * PARAMETERS:
318 *     major - major device number for console devices
319 *     minor - minor device number for console
320 *     arg - device close argument
321 *
322 * RETURNS:
323 *     RTEMS error code
324 */
325rtems_device_driver
326console_close(rtems_device_major_number major,
327              rtems_device_minor_number minor,
328              void *arg)
329{
330    if (console_mode != CONSOLE_MODE_RAW)
331        return rtems_termios_close (arg);
332    else
333        return RTEMS_SUCCESSFUL;
334}
335
336/* console_read --
337 *     Read from the console device
338 *
339 * PARAMETERS:
340 *     major - major device number for console devices
341 *     minor - minor device number for console
342 *     arg - device read argument
343 *
344 * RETURNS:
345 *     RTEMS error code
346 */
347rtems_device_driver
348console_read(rtems_device_major_number major,
349             rtems_device_minor_number minor,
350             void *arg)
351{
352    if (console_mode != CONSOLE_MODE_RAW)
353    {
354        return rtems_termios_read (arg);
355    }
356    else
357    {
358        rtems_libio_rw_args_t *argp = arg;
359        char *buf = argp->buffer;
360        int count = argp->count;
361        int n = 0;
362        int c;
363        while (n < count)
364        {
365            do {
366                c = mcfuart_poll_read(&uart[minor]);
367            } while (c == -1);
368            if (c == '\r')
369                c = '\n';
370            *(buf++) = c;
371            n++;
372            if (c == '\n')
373                break;
374        }
375        argp->bytes_moved = n;
376        return RTEMS_SUCCESSFUL;
377    }
378}
379
380/* console_write --
381 *     Write to the console device
382 *
383 * PARAMETERS:
384 *     major - major device number for console devices
385 *     minor - minor device number for console
386 *     arg - device write argument
387 *
388 * RETURNS:
389 *     RTEMS error code
390 */
391rtems_device_driver
392console_write(rtems_device_major_number major,
393              rtems_device_minor_number minor,
394              void *arg
395)
396{
397    if (console_mode != CONSOLE_MODE_RAW)
398    {
399        return rtems_termios_write (arg);
400    }
401    else
402    {
403        rtems_libio_rw_args_t *argp = arg;
404        char cr = '\r';
405        char *buf = argp->buffer;
406        int count = argp->count;
407        int i;
408        for (i = 0; i < count; i++)
409        {
410            if (*buf == '\n')
411                mcfuart_poll_write(&uart[minor], &cr, 1);
412            mcfuart_poll_write(&uart[minor], buf, 1);
413            buf++;
414        }
415        argp->bytes_moved = count;
416        return RTEMS_SUCCESSFUL;
417    }
418}
419
420/* console_control --
421 *     Handle console device I/O control (IOCTL)
422 *
423 * PARAMETERS:
424 *     major - major device number for console devices
425 *     minor - minor device number for console
426 *     arg - device ioctl argument
427 *
428 * RETURNS:
429 *     RTEMS error code
430 */
431rtems_device_driver
432console_control(rtems_device_major_number major,
433                rtems_device_minor_number minor,
434                void *arg)
435{
436    if (console_mode != CONSOLE_MODE_RAW)
437    {
438        return rtems_termios_ioctl (arg);
439    }
440    else
441    {
442        return RTEMS_SUCCESSFUL;
443    }
444}
Note: See TracBrowser for help on using the repository browser.