⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 termios_printk.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/*===============================================================*\| File: termios_printk.c                                          |+-----------------------------------------------------------------+|                    Copyright (c) 2002 IMD                       ||      Ingenieurbuero fuer Microcomputertechnik Th. Doerfler      ||      Hebststr. 8, 82178 Puchheim, Germany                       ||      <Thomas.Doerfler@imd-systems.de>                           ||  The license and distribution terms for this file may be        ||  found in the file LICENSE in this distribution or at           ||  http://www.rtems.com/license/LICENSE.                     ||                       all rights reserved                       |+-----------------------------------------------------------------+| TERMIOS printk support                                          || this module performs low-level printk output using              || a polled termios driver                                         ||                                                                 |+-----------------------------------------------------------------+|   date                      history                        ID   || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ || 13.05.02  creation                                         doe  ||*****************************************************************||* $Id: termios_printk.c,v 1.1.4.2 2003/09/04 18:47:05 joel Exp $ *|*****************************************************************|\*===============================================================*/#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <rtems.h>#include <rtems/libio_.h>#include <errno.h>#include <stdio.h>#include <fcntl.h>#include <termios.h>#include <rtems/termiostypes.h>#include <rtems/bspIo.h>#include <termios_printk.h>/* * internal variables */int termios_printk_fd = -1;struct rtems_termios_tty *termios_printk_tty;static void _termios_printk_null_char( char c ) {return;}BSP_output_char_function_type BSP_output_char = _termios_printk_null_char;BSP_polling_getchar_function_type BSP_poll_char;/*=========================================================================*\| Function:                                                                 |\*-------------------------------------------------------------------------*/void termios_printk_outputchar/*-------------------------------------------------------------------------*\| Purpose:                                                                  ||    send one character to serial port                                      |+---------------------------------------------------------------------------+| Input Parameters:                                                         |\*-------------------------------------------------------------------------*/( char c  /* character to print */)/*-------------------------------------------------------------------------*\| Return Value:                                                             ||    <none>                                                                 |\*=========================================================================*/{  static const char cr = '\r';  /*   * check, whether printk serial port is available   */  if ((termios_printk_tty != NULL) &&       (termios_printk_tty->device.write != NULL)) {    /*     * call termios_printk polling callout, if available      */    if (termios_printk_conf.callout != NULL) {      termios_printk_conf.callout();    }    /*     * send character to debug serial port     */    if (c == '\n') {            termios_printk_tty->device.write(termios_printk_tty->minor,&cr,1);    }    termios_printk_tty->device.write(termios_printk_tty->minor,&c,1);  }}/*=========================================================================*\| Function:                                                                 |\*-------------------------------------------------------------------------*/char termios_printk_inputchar/*-------------------------------------------------------------------------*\| Purpose:                                                                  ||    wait for one character from serial port                                |+---------------------------------------------------------------------------+| Input Parameters:                                                         |\*-------------------------------------------------------------------------*/( void  /* none */)/*-------------------------------------------------------------------------*\| Return Value:                                                             ||    received character                                                     |\*=========================================================================*/{  int c = -1;  /*   * check, whether debug serial port is available   */  if ((termios_printk_tty != NULL) &&       (termios_printk_tty->device.pollRead != NULL)) {    do {      /*       * call termios_printk polling callout, if available        */      if (termios_printk_conf.callout != NULL) {	termios_printk_conf.callout();      }      /*       * get character from debug serial port       */      c = termios_printk_tty->device.pollRead(termios_printk_tty->minor);    } while (c < 0);  }  return c;}/*=========================================================================*\| Function:                                                                 |\*-------------------------------------------------------------------------*/int termios_printk_open/*-------------------------------------------------------------------------*\| Purpose:                                                                  ||    try to open given serial debug port                                    |+---------------------------------------------------------------------------+| Input Parameters:                                                         |\*-------------------------------------------------------------------------*/( const char *dev_name, /* name of device to open */ unsigned32 baudrate   /* baud rate to use       */)/*-------------------------------------------------------------------------*\| Return Value:                                                             ||    0 on success, -1 and errno otherwise                                   |\*=========================================================================*/{  boolean err_occurred = FALSE;  rtems_libio_t *iop = NULL;  struct termios act_termios;  tcflag_t baudcode = B0;    if (termios_printk_fd >= 0) {    /*     * already initialized     */    return 0;  }  /*   * translate baudrate into baud code   */  switch(baudrate) {  case     50: baudcode =     B50; break;  case     75: baudcode =     B75; break;  case    110: baudcode =    B110; break;  case    134: baudcode =    B134; break;  case    150: baudcode =    B150; break;  case    200: baudcode =    B200; break;  case    300: baudcode =    B300; break;  case    600: baudcode =    B600; break;  case   1200: baudcode =   B1200; break;  case   1800: baudcode =   B1800; break;  case   2400: baudcode =   B2400; break;  case   4800: baudcode =   B4800; break;  case   9600: baudcode =   B9600; break;  case  19200: baudcode =  B19200; break;  case  38400: baudcode =  B38400; break;  case  57600: baudcode =  B57600; break;  case 115200: baudcode = B115200; break;  case 230400: baudcode = B230400; break;  case 460800: baudcode = B460800; break;  default    :   err_occurred = TRUE; errno = EINVAL; break;  } /*  * open device for serdbg operation  */   if (!err_occurred &&      (dev_name != NULL) &&      (dev_name[0] != '\0')) {    termios_printk_fd = open(dev_name,O_RDWR);    if (termios_printk_fd < 0) {      err_occurred = TRUE;    }  }  /*   * capture tty structure    */  if (!err_occurred) {    iop = &rtems_libio_iops[termios_printk_fd];    termios_printk_tty = iop->data1;  }  /*   * set device baudrate    * (and transp mode, this is not really needed)   * ...   */  /*   * ... get fd settings   */  if (!err_occurred &&      (0 != tcgetattr(termios_printk_fd,&act_termios))) {      err_occurred = TRUE;  }  if (!err_occurred) {    cfsetospeed(&act_termios,baudcode);    cfsetispeed(&act_termios,baudcode);    if (0 != tcsetattr(termios_printk_fd,TCSANOW,&act_termios)) {	err_occurred = TRUE;    }  }  if (!err_occurred) {    BSP_output_char = termios_printk_outputchar;    BSP_poll_char = termios_printk_inputchar;  }  return (err_occurred 	  ? -1 	  : 0);}

⌨️ 快捷键说明

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