source: rtems/cpukit/libmisc/serdbg/serdbgio.c @ 9e633f5

4.104.114.84.95
Last change on this file since 9e633f5 was 9e633f5, checked in by Joel Sherrill <joel.sherrill@…>, on Jun 27, 2002 at 9:25:14 PM

2002-06-25 Thomas Doerfler <Thomas.Doerfler@…>

  • With the addition of serdbg, the standard polled I/O functions for gdbstub and/or printk are optionally routed to any termios-aware device driver, that supports polled mode. See libmisc/serdbg/README.
  • serdbg/Makefile.am, serdbg/README, serdbg/serdbg.c, serdbg/serdbg.h, serdbg/serdbgcnf.h, serdbg/serdbgio.c, serdbg/termios_printk.c, serdbg/termios_printk.h, serdbg/termios_printk_cnf.h, serdbg/.cvsignore: New files.
  • configure.ac, Makefile.am, wrapup/Makefile.am: Modified to reflect addition.
  • Property mode set to 100644
File size: 8.6 KB
Line 
1/*===============================================================*\
2| File: serdbgio.c                                                |
3+-----------------------------------------------------------------+
4|                    Copyright (c) 2002 IMD                       |
5|      Ingenieurbuero fuer Microcomputertechnik Th. Doerfler      |
6|      Hebststr. 8, 82178 Puchheim, Germany                       |
7|      <Thomas.Doerfler@imd-systems.de>                           |
8|  The license and distribution terms for this file may be        |
9|  found in the file LICENSE in this distribution or at           |
10|  http://www.OARcorp.com/rtems/license.html.                     |
11|                       all rights reserved                       |
12+-----------------------------------------------------------------+
13| TERMIOS serial gdb interface support                            |
14| the functions in this file allow the standard gdb stubs like    |
15| "m68k-stub.c" to access any serial interfaces that work with    |
16| RTEMS termios in polled mode                                    |
17|                                                                 |
18+-----------------------------------------------------------------+
19|   date                      history                        ID   |
20| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
21| 10.05.02  creation                                         doe  |
22|*****************************************************************|
23|* $Id$
24 *
25|*****************************************************************|
26\*===============================================================*/
27
28#include <rtems.h>
29#include <rtems/libio_.h>
30#include <errno.h>
31#include <stdio.h>
32#include <fcntl.h>
33#include <termios.h>
34
35#include <rtems/termiostypes.h>
36#include <serdbg.h>
37
38
39/*
40 * internal variables
41 */
42int serdbg_fd = -1;
43struct rtems_termios_tty *serdbg_tty;
44
45/*=========================================================================*\
46| Function:                                                                 |
47\*-------------------------------------------------------------------------*/
48int serdbg_open
49
50/*-------------------------------------------------------------------------*\
51| Purpose:                                                                  |
52|    try to open given serial debug port                                    |
53+---------------------------------------------------------------------------+
54| Input Parameters:                                                         |
55\*-------------------------------------------------------------------------*/
56(
57 const char *dev_name, /* name of device to open */
58 unsigned32 baudrate   /* baud rate to use       */
59)
60/*-------------------------------------------------------------------------*\
61| Return Value:                                                             |
62|    0 on success, -1 and errno otherwise                                   |
63\*=========================================================================*/
64{
65  boolean err_occurred = FALSE;
66  rtems_libio_t *iop = NULL;
67  struct termios act_termios;
68  tcflag_t baudcode = B0;
69
70#define FD_STORE_CNT 3
71  int fd_store[FD_STORE_CNT];
72  int fd_store_used = 0;
73
74  /*
75   * translate baudrate into baud code
76   */
77  switch(baudrate) {
78  case     50: baudcode =     B50; break;
79  case     75: baudcode =     B75; break;
80  case    110: baudcode =    B110; break;
81  case    134: baudcode =    B134; break;
82  case    150: baudcode =    B150; break;
83  case    200: baudcode =    B200; break;
84  case    300: baudcode =    B300; break;
85  case    600: baudcode =    B600; break;
86  case   1200: baudcode =   B1200; break;
87  case   1800: baudcode =   B1800; break;
88  case   2400: baudcode =   B2400; break;
89  case   4800: baudcode =   B4800; break;
90  case   9600: baudcode =   B9600; break;
91  case  19200: baudcode =  B19200; break;
92  case  38400: baudcode =  B38400; break;
93  case  57600: baudcode =  B57600; break;
94  case 115200: baudcode = B115200; break;
95  case 230400: baudcode = B230400; break;
96  case 460800: baudcode = B460800; break;
97  default    :   err_occurred = TRUE; errno = EINVAL; break;
98  }
99
100 /*
101  * open device for serdbg operation
102  * skip any fds that are between 0..2, because they are
103  * reserved for stdin/out/err
104  */ 
105  if (!err_occurred &&
106      (dev_name != NULL) &&
107      (dev_name[0] != '\0')) {
108    do {
109      serdbg_fd = open(dev_name,O_RDWR);
110      if (serdbg_fd < 0) {
111        err_occurred = TRUE;
112      }
113      else {
114        if (serdbg_fd < 3) {
115          if (fd_store_used >= FD_STORE_CNT) {
116            err_occurred = TRUE;
117          }
118          else {
119            fd_store[fd_store_used++] = serdbg_fd;
120          }
121        }
122      }
123    } while (!err_occurred && 
124             (serdbg_fd < 3));
125  }
126  /*
127   * close any fds, that have been placed in fd_store
128   * so fd 0..2 are reusable again
129   */
130  while (--fd_store_used >= 0) {
131    close(fd_store[fd_store_used]);
132  }
133
134  /*
135   * capture tty structure
136   */
137  if (!err_occurred) {
138    iop = &rtems_libio_iops[serdbg_fd];
139    serdbg_tty = iop->data1;
140  }
141  /*
142   * set device baudrate
143   * (and transp mode, this is not really needed)
144   * ...
145   */
146  /*
147   * ... get fd settings
148   */
149  if (!err_occurred &&
150      (0 != tcgetattr(serdbg_fd,&act_termios))) {
151      err_occurred = TRUE;
152  }
153  if (!err_occurred) {
154    act_termios.c_iflag
155      &=  ~(IGNBRK|BRKINT|PARMRK|ISTRIP
156            |INLCR|IGNCR|ICRNL|IXON);
157    act_termios.c_oflag
158      &= ~OPOST;
159   
160    act_termios.c_lflag
161      &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);
162
163    cfsetospeed(&act_termios,baudcode);
164    cfsetispeed(&act_termios,baudcode);
165
166    if (0 != tcsetattr(serdbg_fd,TCSANOW,&act_termios)) {
167        err_occurred = TRUE;
168    }
169  }
170  return (err_occurred
171          ? -1 
172          : 0);
173}
174
175void putDebugChar(char c) __attribute__ ((__weak__));
176/*=========================================================================*\
177| Function:                                                                 |
178\*-------------------------------------------------------------------------*/
179void putDebugChar
180/*-------------------------------------------------------------------------*\
181| Purpose:                                                                  |
182|    send one character to serial port                                      |
183+---------------------------------------------------------------------------+
184| Input Parameters:                                                         |
185\*-------------------------------------------------------------------------*/
186(
187 char c  /* character to print */
188)
189/*-------------------------------------------------------------------------*\
190| Return Value:                                                             |
191|    <none>                                                                 |
192\*=========================================================================*/
193{
194  /*
195   * call serdbg polling callout, if available
196   */
197  if (serdbg_conf.callout != NULL) {
198    serdbg_conf.callout();
199  }
200  /*
201   * check, whether debug serial port is available
202   */
203  if ((serdbg_tty != NULL) && 
204      (serdbg_tty->device.write != NULL)) {
205    /*
206     * send character to debug serial port
207     */
208    serdbg_tty->device.write(serdbg_tty->minor,&c,1);
209  }
210}
211
212int getDebugChar(void) __attribute__ ((__weak__));
213/*=========================================================================*\
214| Function:                                                                 |
215\*-------------------------------------------------------------------------*/
216int getDebugChar
217/*-------------------------------------------------------------------------*\
218| Purpose:                                                                  |
219|    wait for one character from serial port                                |
220+---------------------------------------------------------------------------+
221| Input Parameters:                                                         |
222\*-------------------------------------------------------------------------*/
223(
224 void  /* none */
225)
226/*-------------------------------------------------------------------------*\
227| Return Value:                                                             |
228|    received character                                                     |
229\*=========================================================================*/
230{
231  int c = -1;
232  /*
233   * check, whether debug serial port is available
234   */
235  if ((serdbg_tty != NULL) && 
236      (serdbg_tty->device.pollRead != NULL)) {
237    do {
238      /*
239       * call serdbg polling callout, if available
240       */
241      if (serdbg_conf.callout != NULL) {
242        serdbg_conf.callout();
243      }
244      /*
245       * get character from debug serial port
246       */
247      c = serdbg_tty->device.pollRead(serdbg_tty->minor);
248    } while (c < 0);
249  }
250  return c;
251}
252
Note: See TracBrowser for help on using the repository browser.