source: rtems/c/src/lib/libbsp/i386/pc386/console/console.c @ 2d7d605

4.104.114.84.9
Last change on this file since 2d7d605 was 2d7d605, checked in by Joel Sherrill <joel.sherrill@…>, on Aug 19, 1998 at 2:41:23 PM

Patch from Aleksey <qqi@…>:

It fixes netboot build problem, KA9Q configuration
for pc386, some compiler wardning, it also removed some stuff
ifdef'ed with '#if 0'.

  • Property mode set to 100644
File size: 13.0 KB
Line 
1/*-------------------------------------------------------------------------+
2| console.c v1.1 - PC386 BSP - 1997/08/07
3+--------------------------------------------------------------------------+
4| This file contains the PC386 console I/O package.
5+--------------------------------------------------------------------------+
6| (C) Copyright 1997 -
7| - NavIST Group - Real-Time Distributed Systems and Industrial Automation
8|
9| http://pandora.ist.utl.pt
10|
11| Instituto Superior Tecnico * Lisboa * PORTUGAL
12+--------------------------------------------------------------------------+
13| Disclaimer:
14|
15| This file is provided "AS IS" without warranty of any kind, either
16| expressed or implied.
17+--------------------------------------------------------------------------+
18| This code is based on:
19|   console.c,v 1.4 1995/12/19 20:07:23 joel Exp - go32 BSP
20| With the following copyright notice:
21| **************************************************************************
22| *  COPYRIGHT (c) 1989-1998.
23| *  On-Line Applications Research Corporation (OAR).
24| *  Copyright assigned to U.S. Government, 1994.
25| *
26| *  The license and distribution terms for this file may be
27| *  found in found in the file LICENSE in this distribution or at
28| *  http://www.OARcorp.com/rtems/license.html.
29| **************************************************************************
30|
31|  $Id$
32+--------------------------------------------------------------------------*/
33
34#include <stdio.h>
35#include <stdlib.h>
36#include <assert.h>
37
38#include <bsp.h>
39#include <irq.h>
40#include <rtems/libio.h>
41#include <termios.h>
42#include <pc386uart.h>
43#include <libcpu/cpuModel.h>
44
45int PC386ConsolePort = PC386_CONSOLE_PORT_CONSOLE;
46
47static int conSetAttr(int minor, const struct termios *);
48
49/*-------------------------------------------------------------------------+
50| External Prototypes
51+--------------------------------------------------------------------------*/
52extern void     _IBMPC_keyboard_isr(void);
53extern void     _IBMPC_keyboard_isr_on(const rtems_irq_connect_data*);
54extern void     _IBMPC_keyboard_isr_off(const rtems_irq_connect_data*);
55extern int      _IBMPC_keyboard_isr_is_on(const rtems_irq_connect_data*);
56
57static rtems_irq_connect_data console_isr_data = {PC_386_KEYBOARD,
58                                                   _IBMPC_keyboard_isr,
59                                                   _IBMPC_keyboard_isr_on,
60                                                   _IBMPC_keyboard_isr_off,
61                                                   _IBMPC_keyboard_isr_is_on};
62                                                   
63
64extern rtems_boolean _IBMPC_scankey(char *);  /* defined in 'inch.c' */
65extern char BSP_wait_polled_input(void);
66extern void _IBMPC_initVideo(void);
67
68void console_reserve_resources(rtems_configuration_table *conf)
69{
70  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
71    {
72      rtems_termios_reserve_resources(conf, 1);
73    }
74  return;
75}
76
77void __assert(const char *file, int line, const char *msg)
78{
79  static   char buf[20];
80  static   char exit_msg[] = "EXECUTIVE SHUTDOWN! Any key to reboot...";
81  static   char assert_msg[] = "assert failed: ";
82  unsigned char  ch;
83  const    unsigned char *cp;
84       
85 
86  /*
87   * Note we cannot call exit or printf from here,
88   * assert can fail inside ISR too
89   */
90  if(PC386ConsolePort == PC386_CONSOLE_PORT_CONSOLE)
91    {
92      printk("\nassert failed: %s: ", file);
93      printk("%d: ", line);
94      printk("%s\n\n", msg);
95      printk(exit_msg);
96      while(!_IBMPC_scankey(&ch));
97      printk("\n\n");
98    }
99  else
100    {
101      PC386_uart_intr_ctrl(PC386ConsolePort, PC386_UART_INTR_CTRL_DISABLE);
102     
103      PC386_uart_polled_write(PC386ConsolePort, '\r');
104      PC386_uart_polled_write(PC386ConsolePort, '\n');
105     
106      for(cp=assert_msg; *cp!=0; cp++)
107        {
108          PC386_uart_polled_write(PC386ConsolePort, *cp);
109        }
110
111      for(cp=file; *cp!=0; cp++)
112        {
113          PC386_uart_polled_write(PC386ConsolePort, *cp);
114        }
115     
116      PC386_uart_polled_write(PC386ConsolePort, ':');
117      PC386_uart_polled_write(PC386ConsolePort, ' ');
118
119      sprintf(buf, "%d: ", line);
120
121      for(cp=buf; *cp!=0; cp++)
122        {
123          PC386_uart_polled_write(PC386ConsolePort, *cp);
124        }
125
126      for(cp=msg; *cp!=0; cp++)
127        {
128          PC386_uart_polled_write(PC386ConsolePort, *cp);
129        }
130
131      PC386_uart_polled_write(PC386ConsolePort, '\r');
132      PC386_uart_polled_write(PC386ConsolePort, '\n');
133      PC386_uart_polled_write(PC386ConsolePort, '\r');
134      PC386_uart_polled_write(PC386ConsolePort, '\n');
135         
136      for(cp=exit_msg; *cp != 0; cp++)
137        {
138          PC386_uart_polled_write(PC386ConsolePort, *cp);
139        }
140
141      PC386_uart_polled_read(PC386ConsolePort);
142
143      PC386_uart_polled_write(PC386ConsolePort, '\r');
144      PC386_uart_polled_write(PC386ConsolePort, '\n');
145      PC386_uart_polled_write(PC386ConsolePort, '\r');
146      PC386_uart_polled_write(PC386ConsolePort, '\n');
147
148    }
149
150  rtemsReboot();
151}
152
153
154/*-------------------------------------------------------------------------+
155| Console device driver INITIALIZE entry point.
156+--------------------------------------------------------------------------+
157| Initilizes the I/O console (keyboard + VGA display) driver.
158+--------------------------------------------------------------------------*/
159rtems_device_driver
160console_initialize(rtems_device_major_number major,
161                   rtems_device_minor_number minor,
162                   void                      *arg)
163{
164  rtems_status_code status;
165
166  /* Initialize video */
167  _IBMPC_initVideo();
168
169  if(PC386ConsolePort == PC386_CONSOLE_PORT_CONSOLE)
170    {
171
172      /* Install keyboard interrupt handler */
173      status = pc386_install_rtems_irq_handler(&console_isr_data);
174 
175      if (!status)
176        {
177          printk("Error installing keyboard interrupt handler!\n");
178          rtems_fatal_error_occurred(status);
179        }
180     
181      status = rtems_io_register_name("/dev/console", major, 0);
182      if (status != RTEMS_SUCCESSFUL)
183        {
184          printk("Error registering console device!\n");
185          rtems_fatal_error_occurred(status);
186        }
187      printk("Initialized console on port CONSOLE\n\n");
188    }
189  else
190    {
191      /*
192       * Set up TERMIOS
193       */
194      rtems_termios_initialize ();
195     
196      /*
197       * Do device-specific initialization
198       */
199     
200      /* 9600-8-N-1 */
201      PC386_uart_init(PC386ConsolePort, 9600, 0);
202     
203     
204      /* Set interrupt handler */
205      if(PC386ConsolePort == PC386_UART_COM1)
206        {
207          console_isr_data.name = PC386_UART_COM1_IRQ;
208          console_isr_data.hdl  = PC386_uart_termios_isr_com1;
209         
210        }
211      else
212        {
213          assert(PC386ConsolePort == PC386_UART_COM2);
214          console_isr_data.name = PC386_UART_COM2_IRQ;
215          console_isr_data.hdl  = PC386_uart_termios_isr_com2;
216        }
217
218      status =pc386_install_rtems_irq_handler(&console_isr_data);
219      /*
220       * Register the device
221       */
222      status = rtems_io_register_name ("/dev/console", major, 0);
223      if (status != RTEMS_SUCCESSFUL)
224        {
225          printk("Error registering console device!\n");
226          rtems_fatal_error_occurred (status);
227        }
228
229      if(PC386ConsolePort == PC386_UART_COM1)
230        {
231          printk("Initialized console on port COM1 9600-8-N-1\n\n");
232        }
233      else
234        {
235          printk("Initialized console on port COM2 9600-8-N-1\n\n");
236        }
237    }
238#define  DISPLAY_CPU_INFO
239#ifdef DISPLAY_CPU_INFO
240  printCpuInfo();
241#endif
242 
243  return RTEMS_SUCCESSFUL;
244} /* console_initialize */
245
246
247/*-------------------------------------------------------------------------+
248| Console device driver OPEN entry point
249+--------------------------------------------------------------------------*/
250rtems_device_driver
251console_open(rtems_device_major_number major,
252                rtems_device_minor_number minor,
253                void                      *arg)
254{
255  rtems_status_code              status;
256  static rtems_termios_callbacks cb = 
257  {
258    NULL,                     /* firstOpen */
259    NULL,                     /* lastClose */
260    NULL,                     /* pollRead */
261    PC386_uart_termios_write_com1, /* write */
262    conSetAttr,               /* setAttributes */
263    NULL,                     /* stopRemoteTx */
264    NULL,                     /* startRemoteTx */
265    1                         /* outputUsesInterrupts */
266  };
267
268  if(PC386ConsolePort == PC386_CONSOLE_PORT_CONSOLE)
269    {
270      return RTEMS_SUCCESSFUL;
271    }
272
273  if(PC386ConsolePort == PC386_UART_COM2)
274    {
275      cb.write = PC386_uart_termios_write_com2;
276    }
277
278  status = rtems_termios_open (major, minor, arg, &cb);
279
280  if(status != RTEMS_SUCCESSFUL)
281    {
282      printk("Error openning console device\n");
283      return status;
284    }
285
286  /*
287   * Pass data area info down to driver
288   */
289  PC386_uart_termios_set(PC386ConsolePort, 
290                         ((rtems_libio_open_close_args_t *)arg)->iop->data1);
291 
292  /* Enable interrupts  on channel */
293  PC386_uart_intr_ctrl(PC386ConsolePort, PC386_UART_INTR_CTRL_TERMIOS);
294
295  return RTEMS_SUCCESSFUL;
296}
297
298/*-------------------------------------------------------------------------+
299| Console device driver CLOSE entry point
300+--------------------------------------------------------------------------*/
301rtems_device_driver
302console_close(rtems_device_major_number major,
303              rtems_device_minor_number minor,
304              void                      *arg)
305{
306  rtems_device_driver res = RTEMS_SUCCESSFUL;
307 
308  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
309    {
310      res =  rtems_termios_close (arg);
311    }
312  pc386_remove_rtems_irq_handler (&console_isr_data);
313 
314  return res;
315} /* console_close */
316
317 
318/*-------------------------------------------------------------------------+
319| Console device driver READ entry point.
320+--------------------------------------------------------------------------+
321| Read characters from the I/O console. We only have stdin.
322+--------------------------------------------------------------------------*/
323rtems_device_driver
324console_read(rtems_device_major_number major,
325             rtems_device_minor_number minor,
326             void                      *arg)
327{
328  rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
329  char                  *buffer  = rw_args->buffer;
330  int            count, maximum  = rw_args->count;
331
332  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
333    {
334      return rtems_termios_read (arg);
335    }
336 
337  for (count = 0; count < maximum; count++)
338  {
339    /* Get character */
340    buffer[count] = _IBMPC_inch_sleep();
341
342    /* Echo character to screen */
343    _IBMPC_outch(buffer[count]);
344    if (buffer[count] == '\r')
345      {
346        _IBMPC_outch('\n');  /* CR = CR + LF */
347      }
348
349    if (buffer[count] == '\n' || buffer[count] == '\r')
350    {
351      /* What if this goes past the end of the buffer?  We're hosed. [bhc] */
352      buffer[count++]  = '\n';
353      buffer[count]    = '\0';
354      break;
355    }
356  }
357 
358  rw_args->bytes_moved = count;
359  return ((count >= 0) ? RTEMS_SUCCESSFUL : RTEMS_UNSATISFIED);
360} /* console_read */
361 
362
363/*-------------------------------------------------------------------------+
364| Console device driver WRITE entry point.
365+--------------------------------------------------------------------------+
366| Write characters to the I/O console. Stderr and stdout are the same.
367+--------------------------------------------------------------------------*/
368rtems_device_driver
369console_write(rtems_device_major_number major,
370              rtems_device_minor_number minor,
371              void                    * arg)
372{
373  rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;
374  char                  *buffer  = rw_args->buffer;
375  int            count, maximum  = rw_args->count;
376
377  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
378    {
379      return rtems_termios_write (arg);
380    }
381 
382  for (count = 0; count < maximum; count++)
383  {
384    _IBMPC_outch(buffer[count]);
385    if (buffer[count] == '\n')
386      _IBMPC_outch('\r');            /* LF = LF + CR */
387  }
388
389  rw_args->bytes_moved = maximum;
390  return RTEMS_SUCCESSFUL;
391} /* console_write */
392
393
394 
395/*
396 * Handle ioctl request.
397 */
398rtems_device_driver
399console_control(rtems_device_major_number major,
400                rtems_device_minor_number minor,
401                void                      * arg
402)
403{ 
404  if(PC386ConsolePort != PC386_CONSOLE_PORT_CONSOLE)
405    {
406      return rtems_termios_ioctl (arg);
407    }
408
409  return RTEMS_SUCCESSFUL;
410}
411
412static int
413conSetAttr(int minor, const struct termios *t)
414{
415  int baud;
416
417  switch (t->c_cflag & CBAUD) 
418    {
419    case B50:   
420      baud = 50;
421      break;
422    case B75:   
423      baud = 75;       
424      break;
425    case B110: 
426      baud = 110;       
427      break;
428    case B134: 
429      baud = 134;       
430      break;
431    case B150: 
432      baud = 150;       
433      break;
434    case B200:
435      baud = 200;       
436      break;
437    case B300: 
438      baud = 300;
439      break;
440    case B600: 
441      baud = 600;       
442      break;
443    case B1200: 
444      baud = 1200;
445      break;
446    case B1800: 
447      baud = 1800;     
448      break;
449    case B2400: 
450      baud = 2400;
451      break;
452    case B4800: 
453      baud = 4800;
454      break;
455    case B9600: 
456      baud = 9600;
457      break;
458    case B19200:
459      baud = 19200;
460      break;
461    case B38400:
462      baud = 38400;
463      break;
464    case B57600:       
465      baud = 57600;
466      break;
467    case B115200:
468      baud = 115200;
469      break;
470    default:
471      baud = 0;
472      rtems_fatal_error_occurred (RTEMS_INTERNAL_ERROR);
473      return 0;
474    }
475
476  PC386_uart_set_baud(PC386ConsolePort, baud);
477
478  return 0;
479}
480
481/*
482 * BSP initialization
483 */
484
485BSP_output_char_function_type BSP_output_char = 
486                       (BSP_output_char_function_type) _IBMPC_outch;
487
488BSP_polling_getchar_function_type BSP_poll_char = BSP_wait_polled_input;
489
490void BSP_emergency_output_init()
491{
492  _IBMPC_initVideo();
493}
494
495
496
497
498
499
500
501
Note: See TracBrowser for help on using the repository browser.