]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/serial.h
Fix Credit.
[thirdparty/binutils-gdb.git] / gdb / serial.h
CommitLineData
c906108c 1/* Remote serial support interface definitions for GDB, the GNU Debugger.
b6ba6518
KB
2 Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000
3 Free Software Foundation, Inc.
c906108c 4
c5aa993b 5 This file is part of GDB.
c906108c 6
c5aa993b
JM
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
c906108c 11
c5aa993b
JM
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
c906108c 16
c5aa993b
JM
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
c906108c
SS
21
22#ifndef SERIAL_H
23#define SERIAL_H
24
c2c6d25f
JM
25/* For most routines, if a failure is indicated, then errno should be
26 examined. */
c906108c 27
c2c6d25f
JM
28/* Terminal state pointer. This is specific to each type of
29 interface. */
c906108c 30
c2c6d25f 31typedef void *serial_ttystate;
65e2f740
AC
32struct serial;
33typedef struct serial *serial_t;
c906108c 34
c2c6d25f
JM
35/* Try to open NAME. Returns a new serial_t on success, NULL on
36 failure. */
c906108c 37
c2c6d25f
JM
38extern serial_t serial_open (const char *name);
39#define SERIAL_OPEN(NAME) serial_open(NAME)
c906108c 40
c2c6d25f 41/* Open a new serial stream using a file handle. */
c906108c 42
c2c6d25f
JM
43extern serial_t serial_fdopen (const int fd);
44#define SERIAL_FDOPEN(FD) serial_fdopen(FD)
c906108c 45
c2c6d25f 46/* Push out all buffers, close the device and destroy SERIAL_T. */
c906108c 47
c2c6d25f
JM
48extern void serial_close (serial_t);
49#define SERIAL_CLOSE(SERIAL_T) serial_close ((SERIAL_T))
c906108c 50
c2c6d25f
JM
51/* Push out all buffers and destroy SERIAL_T without closing the
52 device. */
c906108c 53
c2c6d25f
JM
54extern void serial_un_fdopen (serial_t scb);
55#define SERIAL_UN_FDOPEN(SERIAL_T) serial_un_fdopen ((SERIAL_T))
c906108c 56
c2c6d25f 57/* Read one char from the serial device with TIMEOUT seconds to wait
2df3850c
JM
58 or -1 to wait forever. Use timeout of 0 to effect a poll.
59 Infinite waits are not permitted. Returns unsigned char if ok, else
60 one of the following codes. Note that all error return-codes are
61 guaranteed to be < 0. */
2acceee2
JM
62
63enum serial_rc {
64 SERIAL_ERROR = -1, /* General error. */
2df3850c 65 SERIAL_TIMEOUT = -2, /* Timeout or data-not-ready during read.
e26cc349 66 Unfortunately, through ui_loop_hook(), this
2df3850c 67 can also be a QUIT indication. */
2acceee2
JM
68 SERIAL_EOF = -3 /* General end-of-file or remote target
69 connection closed, indication. Includes
70 things like the line dropping dead. */
71};
c2c6d25f
JM
72
73extern int serial_readchar (serial_t scb, int timeout);
74#define SERIAL_READCHAR(SERIAL_T, TIMEOUT) serial_readchar ((SERIAL_T), (TIMEOUT))
75
76/* Write LEN chars from STRING to the port SERIAL_T. Returns 0 for
77 success, non-zero for failure. */
78
79extern int serial_write (serial_t scb, const char *str, int len);
80#define SERIAL_WRITE(SERIAL_T, STRING,LEN) serial_write (SERIAL_T, STRING, LEN)
81
82/* Write a printf style string onto the serial port. */
83
84extern void serial_printf (serial_t desc, const char *,...) ATTR_FORMAT (printf, 2, 3);
c906108c
SS
85
86/* Allow pending output to drain. */
87
c2c6d25f
JM
88extern int serial_drain_output (serial_t);
89#define SERIAL_DRAIN_OUTPUT(SERIAL_T) serial_drain_output ((SERIAL_T))
c5aa993b 90
c2c6d25f
JM
91/* Flush (discard) pending output. Might also flush input (if this
92 system can't flush only output). */
c906108c 93
c2c6d25f
JM
94extern int serial_flush_output (serial_t);
95#define SERIAL_FLUSH_OUTPUT(SERIAL_T) serial_flush_output ((SERIAL_T))
c906108c 96
c2c6d25f
JM
97/* Flush pending input. Might also flush output (if this system can't
98 flush only input). */
c906108c 99
c2c6d25f
JM
100extern int serial_flush_input (serial_t);
101#define SERIAL_FLUSH_INPUT(SERIAL_T) serial_flush_input ((SERIAL_T))
c906108c
SS
102
103/* Send a break between 0.25 and 0.5 seconds long. */
104
c2c6d25f 105extern int serial_send_break (serial_t scb);
c906108c
SS
106#define SERIAL_SEND_BREAK(SERIAL_T) serial_send_break (SERIAL_T)
107
108/* Turn the port into raw mode. */
109
c2c6d25f
JM
110extern void serial_raw (serial_t scb);
111#define SERIAL_RAW(SERIAL_T) serial_raw ((SERIAL_T))
c906108c
SS
112
113/* Return a pointer to a newly malloc'd ttystate containing the state
114 of the tty. */
c2c6d25f
JM
115
116extern serial_ttystate serial_get_tty_state (serial_t scb);
117#define SERIAL_GET_TTY_STATE(SERIAL_T) serial_get_tty_state ((SERIAL_T))
c906108c
SS
118
119/* Set the state of the tty to TTYSTATE. The change is immediate.
120 When changing to or from raw mode, input might be discarded.
c2c6d25f
JM
121 Returns 0 for success, negative value for error (in which case
122 errno contains the error). */
123
124extern int serial_set_tty_state (serial_t scb, serial_ttystate ttystate);
125#define SERIAL_SET_TTY_STATE(SERIAL_T, TTYSTATE) serial_set_tty_state ((SERIAL_T), (TTYSTATE))
c906108c 126
c2c6d25f
JM
127/* printf_filtered a user-comprehensible description of ttystate on
128 the specified STREAM. FIXME: At present this sends output to the
129 default stream - GDB_STDOUT. */
130
d9fcf2fb 131extern void serial_print_tty_state (serial_t scb, serial_ttystate ttystate, struct ui_file *);
c2c6d25f 132#define SERIAL_PRINT_TTY_STATE(SERIAL_T, TTYSTATE, STREAM) serial_print_tty_state ((SERIAL_T), (TTYSTATE), (STREAM))
c906108c
SS
133
134/* Set the tty state to NEW_TTYSTATE, where OLD_TTYSTATE is the
135 current state (generally obtained from a recent call to
136 SERIAL_GET_TTY_STATE), but be careful not to discard any input.
c2c6d25f
JM
137 This means that we never switch in or out of raw mode, even if
138 NEW_TTYSTATE specifies a switch. */
139
140extern int serial_noflush_set_tty_state (serial_t scb, serial_ttystate new_ttystate, serial_ttystate old_ttystate);
c906108c 141#define SERIAL_NOFLUSH_SET_TTY_STATE(SERIAL_T, NEW_TTYSTATE, OLD_TTYSTATE) \
c2c6d25f 142serial_noflush_set_tty_state ((SERIAL_T), (NEW_TTYSTATE), (OLD_TTYSTATE))
c906108c 143
c2c6d25f
JM
144/* Set the baudrate to the decimal value supplied. Returns 0 for
145 success, -1 for failure. */
c906108c 146
c2c6d25f
JM
147extern int serial_setbaudrate (serial_t scb, int rate);
148#define SERIAL_SETBAUDRATE(SERIAL_T, RATE) serial_setbaudrate ((SERIAL_T), (RATE))
c906108c 149
c2c6d25f
JM
150/* Set the number of stop bits to the value specified. Returns 0 for
151 success, -1 for failure. */
c906108c 152
c2c6d25f
JM
153#define SERIAL_1_STOPBITS 1
154#define SERIAL_1_AND_A_HALF_STOPBITS 2 /* 1.5 bits, snicker... */
155#define SERIAL_2_STOPBITS 3
c906108c 156
c2c6d25f
JM
157extern int serial_setstopbits (serial_t scb, int num);
158#define SERIAL_SETSTOPBITS(SERIAL_T, NUM) serial_setstopbits ((SERIAL_T), (NUM))
c906108c 159
c2c6d25f 160/* Asynchronous serial interface: */
c906108c 161
c2c6d25f 162/* Can the serial device support asynchronous mode? */
c906108c 163
c2c6d25f
JM
164extern int serial_can_async_p (serial_t scb);
165#define SERIAL_CAN_ASYNC_P(SERIAL_T) serial_can_async_p ((SERIAL_T))
c906108c 166
c2c6d25f 167/* Has the serial device been put in asynchronous mode? */
c906108c 168
c2c6d25f
JM
169extern int serial_is_async_p (serial_t scb);
170#define SERIAL_IS_ASYNC_P(SERIAL_T) serial_is_async_p ((SERIAL_T))
c906108c 171
c2c6d25f
JM
172/* For ASYNC enabled devices, register a callback and enable
173 asynchronous mode. To disable asynchronous mode, register a NULL
174 callback. */
c906108c 175
2acceee2 176typedef void (serial_event_ftype) (serial_t scb, void *context);
c2c6d25f
JM
177extern void serial_async (serial_t scb, serial_event_ftype *handler, void *context);
178#define SERIAL_ASYNC(SERIAL_T, HANDLER, CONTEXT) serial_async ((SERIAL_T), (HANDLER), (CONTEXT))
c906108c 179
c2c6d25f
JM
180/* Provide direct access to the underlying FD (if any) used to
181 implement the serial device. This interface is clearly
182 deprecated. Will call internal_error() if the operation isn't
183 applicable to the current serial device. */
c906108c 184
c2c6d25f
JM
185extern int deprecated_serial_fd (serial_t scb);
186#define DEPRECATED_SERIAL_FD(SERIAL_T) deprecated_serial_fd ((SERIAL_T))
c906108c 187
2acceee2
JM
188/* Trace/debug mechanism.
189
190 SERIAL_DEBUG() enables/disables internal debugging.
191 SERIAL_DEBUG_P() indicates the current debug state. */
192
193extern void serial_debug (serial_t scb, int debug_p);
194#define SERIAL_DEBUG(SERIAL_T, DEBUG_P) serial_debug ((SERIAL_T), (DEBUG_P))
195
196extern int serial_debug_p (serial_t scb);
197#define SERIAL_DEBUG_P(SERIAL_T) serial_debug_p ((SERIAL_T))
198
c906108c 199
c2c6d25f 200/* Details of an instance of a serial object */
c906108c 201
65e2f740 202struct serial
c2c6d25f
JM
203 {
204 int fd; /* File descriptor */
205 struct serial_ops *ops; /* Function vector */
206 void *state; /* Local context info for open FD */
207 serial_ttystate ttystate; /* Not used (yet) */
2acceee2
JM
208 int bufcnt; /* Amount of data remaining in receive
209 buffer. -ve for sticky errors. */
c2c6d25f
JM
210 unsigned char *bufp; /* Current byte */
211 unsigned char buf[BUFSIZ]; /* Da buffer itself */
2acceee2
JM
212 int current_timeout; /* (ser-unix.c termio{,s} only), last
213 value of VTIME */
214 int timeout_remaining; /* (ser-unix.c termio{,s} only), we
215 still need to wait for this many
216 more seconds. */
c2c6d25f 217 char *name; /* The name of the device or host */
65e2f740 218 struct serial *next; /* Pointer to the next serial_t */
c2c6d25f 219 int refcnt; /* Number of pointers to this block */
2acceee2
JM
220 int debug_p; /* Trace this serial devices operation. */
221 int async_state; /* Async internal state. */
c2c6d25f
JM
222 void *async_context; /* Async event thread's context */
223 serial_event_ftype *async_handler;/* Async event handler */
224 };
225
226struct serial_ops
227 {
228 char *name;
229 struct serial_ops *next;
230 int (*open) (serial_t, const char *name);
231 void (*close) (serial_t);
232 int (*readchar) (serial_t, int timeout);
233 int (*write) (serial_t, const char *str, int len);
234 /* Discard pending output */
235 int (*flush_output) (serial_t);
236 /* Discard pending input */
237 int (*flush_input) (serial_t);
238 int (*send_break) (serial_t);
239 void (*go_raw) (serial_t);
240 serial_ttystate (*get_tty_state) (serial_t);
241 int (*set_tty_state) (serial_t, serial_ttystate);
d9fcf2fb 242 void (*print_tty_state) (serial_t, serial_ttystate, struct ui_file *);
c2c6d25f
JM
243 int (*noflush_set_tty_state) (serial_t, serial_ttystate, serial_ttystate);
244 int (*setbaudrate) (serial_t, int rate);
245 int (*setstopbits) (serial_t, int num);
246 /* Wait for output to drain */
247 int (*drain_output) (serial_t);
248 /* Change the serial device into/out of asynchronous mode, call
249 the specified function when ever there is something
250 interesting. */
251 void (*async) (serial_t scb, int async_p);
252 };
253
254/* Add a new serial interface to the interface list */
c906108c 255
c2c6d25f 256extern void serial_add_interface (struct serial_ops * optable);
c906108c
SS
257
258/* File in which to record the remote debugging session */
259
c2c6d25f 260extern void serial_log_command (const char *);
c906108c
SS
261
262#endif /* SERIAL_H */