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

📄 serdbgio.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/*===============================================================*\| File: serdbgio.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 serial gdb interface support                            || the functions in this file allow the standard gdb stubs like    || "m68k-stub.c" to access any serial interfaces that work with    || RTEMS termios in polled mode                                    ||                                                                 |+-----------------------------------------------------------------+|   date                      history                        ID   || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ || 10.05.02  creation                                         doe  ||*****************************************************************||* $Id: serdbgio.c,v 1.2.2.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 <unistd.h> /* close */#include <stdio.h>#include <fcntl.h>#include <termios.h>#include <rtems/termiostypes.h>#include <serdbg.h>/* * internal variables */int serdbg_fd = -1;struct rtems_termios_tty *serdbg_tty;/*=========================================================================*\| Function:                                                                 |\*-------------------------------------------------------------------------*/int serdbg_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;#define FD_STORE_CNT 3  int fd_store[FD_STORE_CNT];  int fd_store_used = 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  * skip any fds that are between 0..2, because they are  * reserved for stdin/out/err  */   if (!err_occurred &&      (dev_name != NULL) &&      (dev_name[0] != '\0')) {    do {      serdbg_fd = open(dev_name,O_RDWR);      if (serdbg_fd < 0) {	err_occurred = TRUE;      }      else {	if (serdbg_fd < 3) {	  if (fd_store_used >= FD_STORE_CNT) {	    err_occurred = TRUE;	  }	  else {	    fd_store[fd_store_used++] = serdbg_fd;	  }	}      }    } while (!err_occurred && 	     (serdbg_fd < 3));  }  /*   * close any fds, that have been placed in fd_store   * so fd 0..2 are reusable again   */  while (--fd_store_used >= 0) {    close(fd_store[fd_store_used]);  }  /*   * capture tty structure    */  if (!err_occurred) {    iop = &rtems_libio_iops[serdbg_fd];    serdbg_tty = iop->data1;  }  /*   * set device baudrate    * (and transp mode, this is not really needed)   * ...   */  /*   * ... get fd settings   */  if (!err_occurred &&      (0 != tcgetattr(serdbg_fd,&act_termios))) {      err_occurred = TRUE;  }  if (!err_occurred) {    act_termios.c_iflag       &=  ~(IGNBRK|BRKINT|PARMRK|ISTRIP	    |INLCR|IGNCR|ICRNL|IXON);    act_termios.c_oflag       &= ~OPOST;        act_termios.c_lflag      &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);    cfsetospeed(&act_termios,baudcode);    cfsetispeed(&act_termios,baudcode);    if (0 != tcsetattr(serdbg_fd,TCSANOW,&act_termios)) {	err_occurred = TRUE;    }  }  return (err_occurred 	  ? -1 	  : 0);}void putDebugChar(char c) __attribute__ ((__weak__));/*=========================================================================*\| Function:                                                                 |\*-------------------------------------------------------------------------*/void putDebugChar/*-------------------------------------------------------------------------*\| Purpose:                                                                  ||    send one character to serial port                                      |+---------------------------------------------------------------------------+| Input Parameters:                                                         |\*-------------------------------------------------------------------------*/( char c  /* character to print */)/*-------------------------------------------------------------------------*\| Return Value:                                                             ||    <none>                                                                 |\*=========================================================================*/{  /*   * call serdbg polling callout, if available    */  if (serdbg_conf.callout != NULL) {    serdbg_conf.callout();  }  /*   * check, whether debug serial port is available   */  if ((serdbg_tty != NULL) &&       (serdbg_tty->device.write != NULL)) {    /*     * send character to debug serial port     */    serdbg_tty->device.write(serdbg_tty->minor,&c,1);  }}int getDebugChar(void) __attribute__ ((__weak__));/*=========================================================================*\| Function:                                                                 |\*-------------------------------------------------------------------------*/int getDebugChar/*-------------------------------------------------------------------------*\| 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 ((serdbg_tty != NULL) &&       (serdbg_tty->device.pollRead != NULL)) {    do {      /*       * call serdbg polling callout, if available        */      if (serdbg_conf.callout != NULL) {	serdbg_conf.callout();      }      /*       * get character from debug serial port       */      c = serdbg_tty->device.pollRead(serdbg_tty->minor);    } while (c < 0);  }  return c;}

⌨️ 快捷键说明

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