source: rtems/c/src/lib/libbsp/shared/console.c @ feead226

4.104.114.84.95
Last change on this file since feead226 was df49c60, checked in by Joel Sherrill <joel.sherrill@…>, on 06/12/00 at 15:00:15

Merged from 4.5.0-beta3a

  • Property mode set to 100644
File size: 6.2 KB
Line 
1/*
2 *  This file contains the generic console driver shell used
3 *  by all console drivers using libchip.
4 *
5 *  This driver uses the termios pseudo driver.
6 *
7 *  COPYRIGHT (c) 1989-1997.
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 *  http://www.OARcorp.com/rtems/license.html.
14 *
15 *  $Id$
16 */
17
18#include <bsp.h>
19#include <rtems/libio.h>
20#include <stdlib.h>
21#include <assert.h>
22#include <termios.h>
23
24#include <libchip/serial.h>
25
26/*
27 *  Configuration Information
28 */
29
30extern console_data  Console_Port_Data[];
31extern unsigned long  Console_Port_Count;
32extern rtems_device_minor_number  Console_Port_Minor;
33 
34/*PAGE
35 *
36 *  console_open
37 *
38 *  open a port as a termios console.
39 *
40 */
41
42rtems_device_driver console_open(
43  rtems_device_major_number major,
44  rtems_device_minor_number minor,
45  void                    * arg
46)
47{
48  rtems_status_code              status;
49  rtems_libio_open_close_args_t *args = arg;
50  rtems_libio_ioctl_args_t       IoctlArgs;
51  struct termios                 Termios;
52  rtems_termios_callbacks        Callbacks;
53  console_tbl                   *cptr;
54
55  /*
56   * Verify the port number is valid.
57   */
58  if ( minor > Console_Port_Count ) {
59    return RTEMS_INVALID_NUMBER;
60  }
61
62  /*
63   * Open the port as a termios console driver.
64   */
65
66  cptr = &Console_Port_Tbl[minor];
67  Callbacks.firstOpen            = cptr->pDeviceFns->deviceFirstOpen;
68  Callbacks.lastClose            = cptr->pDeviceFns->deviceLastClose;
69  Callbacks.pollRead             = cptr->pDeviceFns->deviceRead;
70  Callbacks.write                = cptr->pDeviceFns->deviceWrite;
71  Callbacks.setAttributes        = cptr->pDeviceFns->deviceSetAttributes;
72  Callbacks.stopRemoteTx         = cptr->pDeviceFlow->deviceStopRemoteTx;
73  Callbacks.startRemoteTx        = cptr->pDeviceFlow->deviceStartRemoteTx;
74  Callbacks.outputUsesInterrupts = cptr->pDeviceFns->deviceOutputUsesInterrupts;
75
76  /* XXX what about
77   *        Console_Port_Tbl[minor].ulMargin,
78   *        Console_Port_Tbl[minor].ulHysteresis);
79   */
80
81  status = rtems_termios_open ( major, minor, arg, &Callbacks );
82  Console_Port_Data[minor].termios_data = args->iop->data1;
83
84  if (minor!=Console_Port_Minor) {
85    /*
86     * If this is not the console we do not want ECHO and
87     * so forth
88     */
89    IoctlArgs.iop=args->iop;
90    IoctlArgs.command=RTEMS_IO_GET_ATTRIBUTES;
91    IoctlArgs.buffer=&Termios;
92    rtems_termios_ioctl(&IoctlArgs);
93    Termios.c_lflag=ICANON;
94    IoctlArgs.command=RTEMS_IO_SET_ATTRIBUTES;
95    rtems_termios_ioctl(&IoctlArgs);
96  }
97
98  if ( (args->iop->flags&LIBIO_FLAGS_READ) &&
99      Console_Port_Tbl[minor].pDeviceFlow &&
100      Console_Port_Tbl[minor].pDeviceFlow->deviceStartRemoteTx) {
101    Console_Port_Tbl[minor].pDeviceFlow->deviceStartRemoteTx(minor);
102  }
103
104  return status;
105}
106 
107/*PAGE
108 *
109 *  console_close
110 *
111 *  This routine closes a port that has been opened as console.
112 */
113
114rtems_device_driver console_close(
115  rtems_device_major_number major,
116  rtems_device_minor_number minor,
117  void                    * arg
118)
119{
120  rtems_libio_open_close_args_t *args = arg;
121
122  if ( (args->iop->flags&LIBIO_FLAGS_READ) &&
123        Console_Port_Tbl[minor].pDeviceFlow &&
124        Console_Port_Tbl[minor].pDeviceFlow->deviceStopRemoteTx) {
125    Console_Port_Tbl[minor].pDeviceFlow->deviceStopRemoteTx(minor);
126  }
127
128  return rtems_termios_close (arg);
129}
130 
131/*PAGE
132 *
133 *  console_read
134 *
135 *  This routine uses the termios driver to read a character.
136 */
137
138rtems_device_driver console_read(
139  rtems_device_major_number major,
140  rtems_device_minor_number minor,
141  void                    * arg
142)
143{
144  return rtems_termios_read (arg);
145}
146 
147/*PAGE
148 *
149 *  console_write
150 *
151 *  this routine uses the termios driver to write a character.
152 */
153
154rtems_device_driver console_write(
155  rtems_device_major_number major,
156  rtems_device_minor_number minor,
157  void                    * arg
158)
159{
160  return rtems_termios_write (arg);
161}
162 
163/*PAGE
164 *
165 *  console_control
166 *
167 *  this routine uses the termios driver to process io
168 */
169
170rtems_device_driver console_control(
171  rtems_device_major_number major,
172  rtems_device_minor_number minor,
173  void                    * arg
174)
175{
176  return rtems_termios_ioctl (arg);
177}
178
179/*PAGE
180 *
181 *  console_initialize
182 *
183 *  Routine called to initialize the console device driver.
184 */
185
186rtems_device_driver console_initialize(
187  rtems_device_major_number  major,
188  rtems_device_minor_number  minor_arg,
189  void                      *arg
190)
191{
192  rtems_status_code          status;
193  rtems_device_minor_number  minor;
194
195  /*
196   * initialize the termio interface.
197   */
198
199  rtems_termios_initialize();
200
201  for (minor=0; minor < Console_Port_Count ; minor++) {
202    /*
203     * First perform the configuration dependent probe, then the
204     * device dependent probe
205     */
206
207    if ((!Console_Port_Tbl[minor].deviceProbe ||
208         Console_Port_Tbl[minor].deviceProbe(minor)) &&
209         Console_Port_Tbl[minor].pDeviceFns->deviceProbe(minor)) {
210      /*
211       * Use this device for the console
212       */
213      break;
214    }
215  }
216  if ( minor == Console_Port_Count ) {
217    /*
218     * Failed to find a working device
219     */
220    rtems_fatal_error_occurred(RTEMS_IO_ERROR);
221  }
222 
223  Console_Port_Minor=minor;
224
225  /*
226   * Register Device Names
227   */
228  status = rtems_io_register_name("/dev/console", major, Console_Port_Minor );
229  if (status != RTEMS_SUCCESSFUL) {
230    rtems_fatal_error_occurred(status);
231  }
232  Console_Port_Tbl[minor].pDeviceFns->deviceInitialize(Console_Port_Minor);
233
234  for (minor++;minor<Console_Port_Count;minor++) {
235    /*
236     * First perform the configuration dependent probe, then the
237     * device dependent probe
238     */
239
240    if ( (!Console_Port_Tbl[minor].deviceProbe ||
241         Console_Port_Tbl[minor].deviceProbe(minor)) &&
242         Console_Port_Tbl[minor].pDeviceFns->deviceProbe(minor)) {
243      status = rtems_io_register_name(
244        Console_Port_Tbl[minor].sDeviceName,
245        major,
246        minor );
247      if (status != RTEMS_SUCCESSFUL) {
248        rtems_fatal_error_occurred(status);
249      }
250
251      /*
252       * Initialize the hardware device.
253       */
254
255      Console_Port_Tbl[minor].pDeviceFns->deviceInitialize(minor);
256
257    }
258  }
259
260  return RTEMS_SUCCESSFUL;
261}
262
263
264
Note: See TracBrowser for help on using the repository browser.