source: rtems/c/src/lib/libcpu/sh/sh7750/sci/console.c @ d01f399f

4.104.114.95
Last change on this file since d01f399f was d01f399f, checked in by Joel Sherrill <joel.sherrill@…>, on 04/23/08 at 21:51:44

2008-04-23 Joel Sherrill <joel.sherrill@…>

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