source: rtems/c/src/lib/libbsp/powerpc/eth_comm/console/console.c @ 4ef40152

4.104.114.84.95
Last change on this file since 4ef40152 was ee733965, checked in by Joel Sherrill <joel.sherrill@…>, on 02/17/99 at 20:24:53

Jay Monkman <jmonkman@…> submitted the eth_comm BSP for a PPC860
based board.

  • Property mode set to 100644
File size: 6.6 KB
Line 
1#define I_WANT_TERMIOS
2/*
3 *  BSP specific Serial I/O Functions for the eth-comm BSP
4 *
5 * This file contains the BSP specific functions for
6 * performing serial I/O. These are the functions
7 * RTEMS uses (the 6 listed in the device driver
8 * structure)
9 *
10 * The SCCs and SMCs are assigned as follows
11 *
12 *   Channel     Device      Minor   Termios
13 *    SMC1      /dev/tty0      0       no
14 *    SMC2      /dev/tty1      1       no
15 *    SCC1      ethernet
16 *    SCC2      /dev/console   3       yes
17 *    SCC3      /dev/tty3      4       no
18 *    SCC4      /dev/tty4      5       no
19 *
20 * FIXME: This should use termios for /dev/console, but it doesn't
21 *  appear to work correctly yet. On startup, with termios enabled,
22 *  the board hangs for a few seconds before running correctly
23 *
24 * Author: Jay Monkman (jmonkman@frasca.com)
25 * Copyright (C) 1998 by Frasca International, Inc.
26 *
27 */
28#include <rtems/libio.h>
29#include <mpc860.h>
30#include <mpc860/console.h>
31#include <termios.h>
32
33rtems_device_driver console_initialize(rtems_device_major_number major,
34                                       rtems_device_minor_number minor,
35                                       void *arg)
36{
37  rtems_status_code status;
38  rtems_isr_entry old_handler;
39  rtems_status_code sc;
40 
41#ifdef I_WANT_TERMIOS
42  /*
43   * Set up TERMIOS (for /dev/console)
44   */
45  rtems_termios_initialize();
46#endif
47
48  /*
49   * Set up Buffer Descriptors
50   */
51  m860_console_initialize();
52
53  /*
54   * Do device-specific initialization
55   */
56  m860_scc_initialize(2);  /* /dev/console */
57  m860_scc_initialize(3);  /* /dev/tty3   */
58  m860_scc_initialize(4);  /* /dev/tty4   */
59  m860_smc_initialize(1);  /* /dev/tty0   */
60  m860_smc_initialize(2);  /* /dev/tty1   */
61 
62  sc = rtems_interrupt_catch (m860_scc2_console_interrupt_handler,
63                              PPC_IRQ_CPM_SCC2,
64                              &old_handler);
65  sc = rtems_interrupt_catch (m860_scc3_console_interrupt_handler,
66                              PPC_IRQ_CPM_SCC3,
67                              &old_handler);
68  sc = rtems_interrupt_catch (m860_scc4_console_interrupt_handler,
69                              PPC_IRQ_CPM_SCC4,
70                              &old_handler);
71  sc = rtems_interrupt_catch (m860_smc1_console_interrupt_handler,
72                              PPC_IRQ_CPM_SMC1,
73                              &old_handler);
74  sc = rtems_interrupt_catch (m860_smc2_console_interrupt_handler,
75                              PPC_IRQ_CPM_SMC2,
76                              &old_handler);
77
78  /*
79   * Register the devices
80   */
81  status = rtems_io_register_name ("/dev/console", major, SCC2_MINOR);
82  if (status != RTEMS_SUCCESSFUL)
83    rtems_fatal_error_occurred (status);
84  status = rtems_io_register_name ("/dev/tty0", major, SMC1_MINOR);
85  if (status != RTEMS_SUCCESSFUL)
86    rtems_fatal_error_occurred (status);
87  status = rtems_io_register_name ("/dev/tty1", major, SMC2_MINOR);
88  if (status != RTEMS_SUCCESSFUL)
89    rtems_fatal_error_occurred (status);
90  status = rtems_io_register_name ("/dev/tty3", major, SCC3_MINOR);
91  if (status != RTEMS_SUCCESSFUL)
92    rtems_fatal_error_occurred (status);
93  status = rtems_io_register_name ("/dev/tty4", major, SCC4_MINOR);
94  if (status != RTEMS_SUCCESSFUL)
95    rtems_fatal_error_occurred (status);
96  return RTEMS_SUCCESSFUL;
97}
98 
99rtems_device_driver console_open(rtems_device_major_number major,
100                                 rtems_device_minor_number minor,
101                                 void *arg)
102{
103  volatile m860SCCRegisters_t *sccregs;
104
105#ifdef I_WANT_TERMIOS
106  static const rtems_termios_callbacks sccPollCallbacks = {
107    NULL,                       /* firstOpen */
108    NULL,                       /* lastClose */
109    m860_char_poll_read,        /* pollRead */
110    m860_char_poll_write,       /* write */
111    m860_scc_set_attributes,    /* setAttributes */
112    NULL,                       /* stopRemoteTx */
113    NULL,                       /* startRemoteTx */
114    0                           /* outputUsesInterrupts */
115  };
116#endif /* I_WANT_TERMIOS */
117
118  sccregs = 0;
119
120  switch (minor) {
121  case 0:
122    m860.smc1.smcm = 1;           /* Enable SMC1 RX interrupts */
123    m860.cimr |= 1UL <<  4;       /* Enable SMC1 interrupts */
124    break;
125  case 1:
126    m860.smc2.smcm = 1;           /* Enable SMC2 RX interrupts */
127    m860.cimr |= 1UL <<  3;       /* Enable SMC2 interrupts */
128    break;
129  case 2:
130    m860.cimr |= 1UL << 30;      /* Enable SCC1 interrupts */
131    sccregs = &m860.scc1;
132    break;
133  case 3:
134#ifndef I_WANT_TERMIOS
135    m860.cimr |= 1UL << 29;      /* Enable SCC2 interrupts */
136#endif /* I_WANT_TERMIOS */
137    sccregs = &m860.scc2;
138    break;
139  case 4:
140    m860.cimr |= 1UL << 28;      /* Enable SCC3 interrupts */
141    sccregs = &m860.scc3;
142    break;
143  case 5:
144    m860.cimr |= 1UL << 27;      /* Enable SCC4 interrupts */
145    sccregs = &m860.scc4;
146    break;
147  default:
148    rtems_panic ("CONSOLE: bad minor number");
149  }
150
151  if (sccregs)
152    sccregs->sccm=0x3;
153
154#ifdef I_WANT_TERMIOS
155  if (minor == SCC2_MINOR) {
156    return rtems_termios_open (major, minor, arg, &sccPollCallbacks);
157  }
158  else {
159    return RTEMS_SUCCESSFUL;
160  }
161#else
162  return RTEMS_SUCCESSFUL;
163#endif
164}
165
166rtems_device_driver console_close(rtems_device_major_number major,
167                                  rtems_device_minor_number minor,
168                                  void *arg)
169{
170#ifdef I_WANT_TERMIOS
171  if (minor == SCC2_MINOR) {
172    return rtems_termios_close (arg);
173  }
174  else {
175    return RTEMS_SUCCESSFUL;
176  }
177#else
178  return RTEMS_SUCCESSFUL;
179#endif
180}
181
182rtems_device_driver console_read(rtems_device_major_number major,
183                                 rtems_device_minor_number minor,
184                                 void *arg)
185{
186#ifdef I_WANT_TERMIOS
187  if (minor == SCC2_MINOR) {
188    return rtems_termios_read(arg);
189  }
190  else {
191    return m860_console_read(major, minor, arg);
192  }
193#else
194  return m860_console_read(major, minor, arg);
195#endif
196}
197
198rtems_device_driver console_write(rtems_device_major_number major,
199                                  rtems_device_minor_number minor,
200                                  void *arg)
201{
202#ifdef I_WANT_TERMIOS
203  if (minor == SCC2_MINOR) {
204    return rtems_termios_write(arg);
205  }
206  else {
207    return m860_console_write(major, minor, arg);
208  }
209#else
210  return m860_console_write(major, minor, arg);
211#endif
212}
213
214/*
215 * Handle ioctl request.
216 * Should set hardware line speed, bits/char, etc.
217 */
218rtems_device_driver console_control(rtems_device_major_number major,
219                                    rtems_device_minor_number minor,
220                                    void *arg)
221{
222#ifdef I_WANT_TERMIOS
223  if (minor == SCC2_MINOR) {
224    return rtems_termios_ioctl (arg);
225  }
226  else {
227    return RTEMS_SUCCESSFUL;
228  }
229#else
230  return RTEMS_SUCCESSFUL;
231#endif
232}
233
Note: See TracBrowser for help on using the repository browser.