console.c

来自「RTEMS (Real-Time Executive for Multiproc」· C语言 代码 · 共 582 行

C
582
字号
/*-------------------------------------------------------------------------+| console.c v1.1 - PC386 BSP - 1997/08/07+--------------------------------------------------------------------------+| This file contains the PC386 console I/O package.+--------------------------------------------------------------------------+| (C) Copyright 1997 -| - NavIST Group - Real-Time Distributed Systems and Industrial Automation|| http://pandora.ist.utl.pt|| Instituto Superior Tecnico * Lisboa * PORTUGAL+--------------------------------------------------------------------------+| Disclaimer:|| This file is provided "AS IS" without warranty of any kind, either| expressed or implied.+--------------------------------------------------------------------------+| This code is based on:|   console.c,v 1.4 1995/12/19 20:07:23 joel Exp - go32 BSP| With the following copyright notice:| **************************************************************************| *  COPYRIGHT (c) 1989-1999.| *  On-Line Applications Research Corporation (OAR).| *| *  The license and distribution terms for this file may be| *  found in found in the file LICENSE in this distribution or at| *  http://www.rtems.com/license/LICENSE.| **************************************************************************||  $Id: console.c,v 1.27.4.3 2006/04/24 18:50:55 joel Exp $+--------------------------------------------------------------------------*/#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <unistd.h>#undef __assertvoid __assert (const char *file, int line, const char *msg);#include <bsp.h>#include <irq.h>#include <rtems/libio.h>#include <termios.h>#include <uart.h>#include <libcpu/cpuModel.h>#include <rtems/mw_uid.h>#include "mouse_parser.h"/* * Possible value for console input/output : *	BSP_CONSOLE_PORT_CONSOLE *	BSP_UART_COM1 *	BSP_UART_COM2 * * Note: *   1. Currently BSPPrintkPort, cannot be assigned to COM2, *      it will be fixed soon. * *   2. If both BSPConsolePort and BSPPrintkport are assigned *      to same serial device it does not work that great */#if (USE_COM1_AS_CONSOLE == 1)int BSPConsolePort = BSP_UART_COM1;int BSPPrintkPort  = BSP_UART_COM1;#elseint BSPConsolePort = BSP_CONSOLE_PORT_CONSOLE;int BSPPrintkPort  = BSP_CONSOLE_PORT_CONSOLE;#endifint BSPBaseBaud    = 115200;extern BSP_polling_getchar_function_type BSP_poll_char;extern int getch( void );extern void kbd_init( void );/*-------------------------------------------------------------------------+| External Prototypes+--------------------------------------------------------------------------*/extern void keyboard_interrupt(void);extern char BSP_wait_polled_input(void);extern void _IBMPC_initVideo(void);static int  conSetAttr(int minor, const struct termios *);static void isr_on(const rtems_irq_connect_data *);static void isr_off(const rtems_irq_connect_data *);static int  isr_is_on(const rtems_irq_connect_data *);extern int rtems_kbpoll( void );static rtems_irq_connect_data console_isr_data = {BSP_KEYBOARD,                     keyboard_interrupt,						   isr_on,						   isr_off,						   isr_is_on};static voidisr_on(const rtems_irq_connect_data *unused){  return;}						   static voidisr_off(const rtems_irq_connect_data *unused){  return;}static intisr_is_on(const rtems_irq_connect_data *irq){  return BSP_irq_enabled_at_i8259s(irq->name);}extern char _IBMPC_inch(void);extern int  rtems_kbpoll( void );static intibmpc_console_write(int minor, const char *buf, int len){  int count;  for (count = 0; count < len; count++)  {    _IBMPC_outch( buf[ count ] );    if( buf[ count ] == '\n')      _IBMPC_outch( '\r' );            /* LF = LF + CR */  }  return 0;}int kbd_poll_read( int minor ){  if( rtems_kbpoll() )  {     int c = getch();     return c;  }  return -1;}/*static void*	     termios_ttyp_console         = NULL;void enq_key( char key ){  if( termios_ttyp_console )  {	  rtems_termios_enqueue_raw_characters(termios_ttyp_console, &key,1 );  }}*/void __assert (const char *file, int line, const char *msg){    static   char exit_msg[] = "EXECUTIVE SHUTDOWN! Any key to reboot...";  unsigned char  ch;     /*   * Note we cannot call exit or printf from here,    * assert can fail inside ISR too   */   /*   * Close console   */  close(2);  close(1);  close(0);  printk("\nassert failed: %s: ", file);  printk("%d: ", line);  printk("%s\n\n", msg);  printk(exit_msg);  ch = BSP_poll_char();  printk("\n\n");  rtemsReboot();}/*-------------------------------------------------------------------------+| Console device driver INITIALIZE entry point.+--------------------------------------------------------------------------+| Initilizes the I/O console (keyboard + VGA display) driver.+--------------------------------------------------------------------------*/rtems_device_driverconsole_initialize(rtems_device_major_number major,                   rtems_device_minor_number minor,                   void                      *arg){  rtems_status_code status;  /* Initialize the KBD interface */  kbd_init();  /*   * Set up TERMIOS   */  rtems_termios_initialize ();#ifdef RTEMS_RUNTIME_CONSOLE_SELECT  /*   * If no video card, fall back to serial port console   */#include <crt.h>  if((BSPConsolePort == BSP_CONSOLE_PORT_CONSOLE)   && (*(unsigned char*) NB_MAX_ROW_ADDR == 0)   && (*(unsigned short*)NB_MAX_COL_ADDR == 0)) {    BSPConsolePort = BSP_UART_COM2;    BSPPrintkPort  = BSP_UART_COM1;  }#endif  /*   *  The video was initialized in the start.s code and does not need   *  to be reinitialized.   */  if(BSPConsolePort == BSP_CONSOLE_PORT_CONSOLE)    {      /* Install keyboard interrupt handler */      status = BSP_install_rtems_irq_handler(&console_isr_data);      if (!status)	{	  printk("Error installing keyboard interrupt handler!\n");	  rtems_fatal_error_occurred(status);	}            status = rtems_io_register_name("/dev/console", major, 0);      if (status != RTEMS_SUCCESSFUL)	{	  printk("Error registering console device!\n");	  rtems_fatal_error_occurred(status);	}      printk("Initialized console on port CONSOLE\n\n");    }  else    {      /*       * Do device-specific initialization       */      /* 9600-8-N-1 */      BSP_uart_init(BSPConsolePort, 9600, CHR_8_BITS, 0, 0, 0);                  /* Set interrupt handler */      if(BSPConsolePort == BSP_UART_COM1)   	{	     console_isr_data.name = BSP_UART_COM1_IRQ;        console_isr_data.hdl  = BSP_uart_termios_isr_com1;	     	}      else	   {          assert(BSPConsolePort == BSP_UART_COM2);          console_isr_data.name = BSP_UART_COM2_IRQ;          console_isr_data.hdl  = BSP_uart_termios_isr_com2;    	}      status = BSP_install_rtems_irq_handler(&console_isr_data);      if (!status){	  printk("Error installing serial console interrupt handler!\n");	  rtems_fatal_error_occurred(status);      }      /*       * Register the device       */      status = rtems_io_register_name ("/dev/console", major, 0);      if (status != RTEMS_SUCCESSFUL)	{	  printk("Error registering console device!\n");	  rtems_fatal_error_occurred (status);	}      if(BSPConsolePort == BSP_UART_COM1)	{	  printk("Initialized console on port COM1 9600-8-N-1\n\n");	}      else	{	  printk("Initialized console on port COM2 9600-8-N-1\n\n");	}      if(BSPPrintkPort == BSP_UART_COM1)        {          printk("Warning : This will be the last message on console\n");          /*           * FIXME: cast below defeats the very idea of having           * function pointer types defined           */          BSP_output_char = (BSP_output_char_function_type)                              BSP_output_char_via_serial;          BSP_poll_char   = (BSP_polling_getchar_function_type)                              BSP_poll_char_via_serial;        }      else if(BSPPrintkPort != BSP_CONSOLE_PORT_CONSOLE)        {           printk("illegal assignement of printk channel");         rtems_fatal_error_occurred (status);        }    }  return RTEMS_SUCCESSFUL;} /* console_initialize */static int console_open_count = 0;static int console_last_close(int major, int minor, void *arg){  BSP_remove_rtems_irq_handler (&console_isr_data);  return 0;}/*-------------------------------------------------------------------------+| Console device driver OPEN entry point+--------------------------------------------------------------------------*/rtems_device_driverconsole_open(rtems_device_major_number major,                rtems_device_minor_number minor,                void                      *arg){  rtems_status_code              status;  static rtems_termios_callbacks cb =   {    NULL,	              /* firstOpen */    console_last_close,       /* lastClose */    NULL,          /* pollRead */    BSP_uart_termios_write_com1, /* write */    conSetAttr,	              /* setAttributes */    NULL,	              /* stopRemoteTx */    NULL,	              /* startRemoteTx */    1		              /* outputUsesInterrupts */  };  if(BSPConsolePort == BSP_CONSOLE_PORT_CONSOLE)    {      /* Let's set the routines for termios to poll the       * Kbd queue for data        */      cb.pollRead = kbd_poll_read;      cb.outputUsesInterrupts = 0;      /* write the "echo" if it is on */      cb.write = ibmpc_console_write;      cb.setAttributes = NULL;      ++console_open_count;      status = rtems_termios_open (major, minor, arg, &cb);      if(status != RTEMS_SUCCESSFUL)      {         printk("Error openning console device\n");      }      return status;    }  if(BSPConsolePort == BSP_UART_COM2)    {      cb.write = BSP_uart_termios_write_com2;    }  status = rtems_termios_open (major, minor, arg, &cb);  if(status != RTEMS_SUCCESSFUL)    {      printk("Error openning console device\n");      return status;    }  /*   * Pass data area info down to driver   */  BSP_uart_termios_set(BSPConsolePort, 			 ((rtems_libio_open_close_args_t *)arg)->iop->data1);    /* Enable interrupts  on channel */  BSP_uart_intr_ctrl(BSPConsolePort, BSP_UART_INTR_CTRL_TERMIOS);  return RTEMS_SUCCESSFUL;}/*-------------------------------------------------------------------------+| Console device driver CLOSE entry point+--------------------------------------------------------------------------*/rtems_device_driverconsole_close(rtems_device_major_number major,              rtems_device_minor_number minor,              void                      *arg){   return rtems_termios_close (arg);} /* console_close */ /*-------------------------------------------------------------------------+| Console device driver READ entry point.+--------------------------------------------------------------------------+| Read characters from the I/O console. We only have stdin.+--------------------------------------------------------------------------*/rtems_device_driverconsole_read(rtems_device_major_number major,             rtems_device_minor_number minor,             void                      *arg){ return rtems_termios_read( arg );} /* console_read */ /*-------------------------------------------------------------------------+| Console device driver WRITE entry point.+--------------------------------------------------------------------------+| Write characters to the I/O console. Stderr and stdout are the same.+--------------------------------------------------------------------------*/rtems_device_driverconsole_write(rtems_device_major_number major,              rtems_device_minor_number minor,              void                    * arg){  rtems_libio_rw_args_t *rw_args = (rtems_libio_rw_args_t *)arg;  char                  *buffer  = rw_args->buffer;  int                    maximum  = rw_args->count;  if(BSPConsolePort != BSP_CONSOLE_PORT_CONSOLE)    {      return rtems_termios_write (arg);    }   /* write data to VGA */  ibmpc_console_write( minor, buffer, maximum );  rw_args->bytes_moved = maximum;  return RTEMS_SUCCESSFUL;} /* console_write */extern int vt_ioctl( unsigned int cmd, unsigned long arg); /* * Handle ioctl request. */rtems_device_driver console_control(rtems_device_major_number major,		rtems_device_minor_number minor,		void                      * arg){ 	rtems_libio_ioctl_args_t *args = arg;	switch (args->command) 	{	   default:      if( vt_ioctl( args->command, (unsigned long)args->buffer ) != 0 )          return rtems_termios_ioctl (arg);		break;      case MW_UID_REGISTER_DEVICE:      printk( "SerialMouse: reg=%s\n", args->buffer );      register_kbd_msg_queue( args->buffer, 0 );		break;      case MW_UID_UNREGISTER_DEVICE:      unregister_kbd_msg_queue( 0 );		break;   } 	args->ioctl_return = 0;   return RTEMS_SUCCESSFUL;}static intconSetAttr(int minor, const struct termios *t){  unsigned long baud, databits, parity, stopbits;  switch (t->c_cflag & CBAUD)     {    case B50:	      baud = 50;      break;    case B75:	      baud = 75;	      break;    case B110:	      baud = 110;	      break;    case B134:	      baud = 134;	      break;    case B150:	      baud = 150;	      break;    case B200:      baud = 200;	      break;    case B300:	      baud = 300;      break;    case B600:	      baud = 600;	      break;    case B1200:	      baud = 1200;      break;    case B1800:	      baud = 1800;	      break;    case B2400:	      baud = 2400;      break;    case B4800:	      baud = 4800;      break;    case B9600:	      baud = 9600;      break;    case B19200:      baud = 19200;      break;    case B38400:      baud = 38400;      break;    case B57600:	      baud = 57600;      break;    case B115200:      baud = 115200;      break;    default:      rtems_fatal_error_occurred (RTEMS_INTERNAL_ERROR);      return 0;    }  if (t->c_cflag & PARENB) {    /* Parity is enabled */    if (t->c_cflag & PARODD) {      /* Parity is odd */      parity = PEN;    }    else {      /* Parity is even */      parity = PEN | EPS;    }  }  else {    /* No parity */    parity = 0;  }    switch (t->c_cflag & CSIZE) {    case CS5: databits = CHR_5_BITS; break;    case CS6: databits = CHR_6_BITS; break;    case CS7: databits = CHR_7_BITS; break;    default: /* just to avoid warnings -- all cases are covered. */    case CS8: databits = CHR_8_BITS; break;   }  if (t->c_cflag & CSTOPB) {    /* 2 stop bits */    stopbits = STB;  }  else {    /* 1 stop bit */    stopbits = 0;  }  BSP_uart_set_attributes(BSPConsolePort, baud, databits, parity, stopbits);  return 0;}/* * BSP initialization */BSP_output_char_function_type BSP_output_char =                        (BSP_output_char_function_type) _IBMPC_outch;BSP_polling_getchar_function_type BSP_poll_char = BSP_wait_polled_input;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?