serial.h revision 1.10 1 1.1 christos /* Remote serial support interface definitions for GDB, the GNU Debugger.
2 1.10 christos Copyright (C) 1992-2023 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of GDB.
5 1.1 christos
6 1.1 christos This program is free software; you can redistribute it and/or modify
7 1.1 christos it under the terms of the GNU General Public License as published by
8 1.1 christos the Free Software Foundation; either version 3 of the License, or
9 1.1 christos (at your option) any later version.
10 1.1 christos
11 1.1 christos This program is distributed in the hope that it will be useful,
12 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 christos GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
18 1.1 christos
19 1.1 christos #ifndef SERIAL_H
20 1.1 christos #define SERIAL_H
21 1.1 christos
22 1.1 christos #ifdef USE_WIN32API
23 1.1 christos #include <winsock2.h>
24 1.1 christos #include <windows.h>
25 1.1 christos #endif
26 1.1 christos
27 1.1 christos struct ui_file;
28 1.1 christos
29 1.1 christos /* For most routines, if a failure is indicated, then errno should be
30 1.1 christos examined. */
31 1.1 christos
32 1.1 christos /* Terminal state pointer. This is specific to each type of
33 1.1 christos interface. */
34 1.1 christos
35 1.1 christos typedef void *serial_ttystate;
36 1.1 christos struct serial;
37 1.6 christos struct serial_ops;
38 1.6 christos
39 1.10 christos /* Speed in bits per second, or -1 which means don't mess with the speed. */
40 1.10 christos
41 1.10 christos extern int baud_rate;
42 1.10 christos
43 1.10 christos /* Parity for serial port */
44 1.10 christos
45 1.10 christos extern int serial_parity;
46 1.10 christos
47 1.6 christos /* Create a new serial for OPS. The new serial is not opened. */
48 1.1 christos
49 1.1 christos /* Try to open NAME. Returns a new `struct serial *' on success, NULL
50 1.1 christos on failure. The new serial object has a reference count of 1.
51 1.1 christos Note that some open calls can block and, if possible, should be
52 1.1 christos written to be non-blocking, with calls to ui_look_hook so they can
53 1.1 christos be cancelled. An async interface for open could be added to GDB if
54 1.1 christos necessary. */
55 1.1 christos
56 1.1 christos extern struct serial *serial_open (const char *name);
57 1.1 christos
58 1.6 christos /* Open a new serial stream using OPS. */
59 1.6 christos
60 1.6 christos extern struct serial *serial_open_ops (const struct serial_ops *ops);
61 1.6 christos
62 1.1 christos /* Returns true if SCB is open. */
63 1.1 christos
64 1.1 christos extern int serial_is_open (struct serial *scb);
65 1.1 christos
66 1.1 christos /* Find an already opened serial stream using a file handle. */
67 1.1 christos
68 1.1 christos extern struct serial *serial_for_fd (int fd);
69 1.1 christos
70 1.1 christos /* Open a new serial stream using a file handle. */
71 1.1 christos
72 1.1 christos extern struct serial *serial_fdopen (const int fd);
73 1.1 christos
74 1.1 christos /* Push out all buffers, close the device and unref SCB. */
75 1.1 christos
76 1.1 christos extern void serial_close (struct serial *scb);
77 1.1 christos
78 1.1 christos /* Increment reference count of SCB. */
79 1.1 christos
80 1.1 christos extern void serial_ref (struct serial *scb);
81 1.1 christos
82 1.1 christos /* Decrement reference count of SCB. */
83 1.1 christos
84 1.1 christos extern void serial_unref (struct serial *scb);
85 1.1 christos
86 1.6 christos /* Create a pipe, and put the read end in FILDES[0], and the write end
87 1.6 christos in FILDES[1]. Returns 0 for success, negative value for error (in
88 1.1 christos which case errno contains the error). */
89 1.1 christos
90 1.1 christos extern int gdb_pipe (int fildes[2]);
91 1.1 christos
92 1.1 christos /* Create a pipe with each end wrapped in a `struct serial' interface.
93 1.1 christos Put the read end in scbs[0], and the write end in scbs[1]. Returns
94 1.1 christos 0 for success, negative value for error (in which case errno
95 1.1 christos contains the error). */
96 1.1 christos
97 1.1 christos extern int serial_pipe (struct serial *scbs[2]);
98 1.1 christos
99 1.1 christos /* Push out all buffers and destroy SCB without closing the device. */
100 1.1 christos
101 1.1 christos extern void serial_un_fdopen (struct serial *scb);
102 1.1 christos
103 1.1 christos /* Read one char from the serial device with TIMEOUT seconds to wait
104 1.1 christos or -1 to wait forever. Use timeout of 0 to effect a poll.
105 1.1 christos Infinite waits are not permitted. Returns unsigned char if ok, else
106 1.1 christos one of the following codes. Note that all error return-codes are
107 1.1 christos guaranteed to be < 0. */
108 1.1 christos
109 1.1 christos enum serial_rc {
110 1.1 christos SERIAL_ERROR = -1, /* General error. */
111 1.1 christos SERIAL_TIMEOUT = -2, /* Timeout or data-not-ready during read.
112 1.1 christos Unfortunately, through
113 1.1 christos deprecated_ui_loop_hook (), this can also
114 1.1 christos be a QUIT indication. */
115 1.1 christos SERIAL_EOF = -3 /* General end-of-file or remote target
116 1.1 christos connection closed, indication. Includes
117 1.1 christos things like the line dropping dead. */
118 1.1 christos };
119 1.1 christos
120 1.1 christos extern int serial_readchar (struct serial *scb, int timeout);
121 1.1 christos
122 1.1 christos /* Write COUNT bytes from BUF to the port SCB. Returns 0 for
123 1.1 christos success, non-zero for failure. */
124 1.1 christos
125 1.1 christos extern int serial_write (struct serial *scb, const void *buf, size_t count);
126 1.1 christos
127 1.1 christos /* Write a printf style string onto the serial port. */
128 1.1 christos
129 1.1 christos extern void serial_printf (struct serial *desc,
130 1.1 christos const char *,...) ATTRIBUTE_PRINTF (2, 3);
131 1.1 christos
132 1.1 christos /* Allow pending output to drain. */
133 1.1 christos
134 1.1 christos extern int serial_drain_output (struct serial *);
135 1.1 christos
136 1.1 christos /* Flush (discard) pending output. Might also flush input (if this
137 1.1 christos system can't flush only output). */
138 1.1 christos
139 1.1 christos extern int serial_flush_output (struct serial *);
140 1.1 christos
141 1.1 christos /* Flush pending input. Might also flush output (if this system can't
142 1.1 christos flush only input). */
143 1.1 christos
144 1.1 christos extern int serial_flush_input (struct serial *);
145 1.1 christos
146 1.1 christos /* Send a break between 0.25 and 0.5 seconds long. */
147 1.1 christos
148 1.1 christos extern int serial_send_break (struct serial *scb);
149 1.1 christos
150 1.1 christos /* Turn the port into raw mode. */
151 1.1 christos
152 1.1 christos extern void serial_raw (struct serial *scb);
153 1.1 christos
154 1.1 christos /* Return a pointer to a newly malloc'd ttystate containing the state
155 1.1 christos of the tty. */
156 1.1 christos
157 1.1 christos extern serial_ttystate serial_get_tty_state (struct serial *scb);
158 1.1 christos
159 1.1 christos /* Return a pointer to a newly malloc'd ttystate containing a copy
160 1.1 christos of the state in TTYSTATE. */
161 1.1 christos
162 1.1 christos extern serial_ttystate serial_copy_tty_state (struct serial *scb,
163 1.1 christos serial_ttystate ttystate);
164 1.1 christos
165 1.1 christos /* Set the state of the tty to TTYSTATE. The change is immediate.
166 1.1 christos When changing to or from raw mode, input might be discarded.
167 1.1 christos Returns 0 for success, negative value for error (in which case
168 1.1 christos errno contains the error). */
169 1.1 christos
170 1.1 christos extern int serial_set_tty_state (struct serial *scb, serial_ttystate ttystate);
171 1.1 christos
172 1.10 christos /* gdb_printf a user-comprehensible description of ttystate on
173 1.1 christos the specified STREAM. FIXME: At present this sends output to the
174 1.1 christos default stream - GDB_STDOUT. */
175 1.1 christos
176 1.1 christos extern void serial_print_tty_state (struct serial *scb,
177 1.1 christos serial_ttystate ttystate,
178 1.1 christos struct ui_file *);
179 1.1 christos
180 1.1 christos /* Set the baudrate to the decimal value supplied. Returns 0 for
181 1.1 christos success, -1 for failure. */
182 1.1 christos
183 1.1 christos extern int serial_setbaudrate (struct serial *scb, int rate);
184 1.1 christos
185 1.1 christos /* Set the number of stop bits to the value specified. Returns 0 for
186 1.1 christos success, -1 for failure. */
187 1.1 christos
188 1.1 christos #define SERIAL_1_STOPBITS 1
189 1.1 christos #define SERIAL_1_AND_A_HALF_STOPBITS 2 /* 1.5 bits, snicker... */
190 1.1 christos #define SERIAL_2_STOPBITS 3
191 1.1 christos
192 1.1 christos extern int serial_setstopbits (struct serial *scb, int num);
193 1.1 christos
194 1.5 christos #define GDBPARITY_NONE 0
195 1.5 christos #define GDBPARITY_ODD 1
196 1.5 christos #define GDBPARITY_EVEN 2
197 1.5 christos
198 1.5 christos /* Set parity for serial port. Returns 0 for success, -1 for failure. */
199 1.5 christos
200 1.5 christos extern int serial_setparity (struct serial *scb, int parity);
201 1.5 christos
202 1.1 christos /* Asynchronous serial interface: */
203 1.1 christos
204 1.1 christos /* Can the serial device support asynchronous mode? */
205 1.1 christos
206 1.1 christos extern int serial_can_async_p (struct serial *scb);
207 1.1 christos
208 1.1 christos /* Has the serial device been put in asynchronous mode? */
209 1.1 christos
210 1.1 christos extern int serial_is_async_p (struct serial *scb);
211 1.1 christos
212 1.1 christos /* For ASYNC enabled devices, register a callback and enable
213 1.1 christos asynchronous mode. To disable asynchronous mode, register a NULL
214 1.1 christos callback. */
215 1.1 christos
216 1.1 christos typedef void (serial_event_ftype) (struct serial *scb, void *context);
217 1.1 christos extern void serial_async (struct serial *scb,
218 1.1 christos serial_event_ftype *handler, void *context);
219 1.1 christos
220 1.1 christos /* Trace/debug mechanism.
221 1.1 christos
222 1.1 christos serial_debug() enables/disables internal debugging.
223 1.1 christos serial_debug_p() indicates the current debug state. */
224 1.1 christos
225 1.1 christos extern void serial_debug (struct serial *scb, int debug_p);
226 1.1 christos
227 1.1 christos extern int serial_debug_p (struct serial *scb);
228 1.1 christos
229 1.1 christos
230 1.1 christos /* Details of an instance of a serial object. */
231 1.1 christos
232 1.1 christos struct serial
233 1.1 christos {
234 1.1 christos /* serial objects are ref counted (but not the underlying
235 1.1 christos connection, just the object's lifetime in memory). */
236 1.1 christos int refcnt;
237 1.1 christos
238 1.1 christos int fd; /* File descriptor */
239 1.1 christos /* File descriptor for a separate error stream that should be
240 1.1 christos immediately forwarded to gdb_stderr. This may be -1.
241 1.1 christos If != -1, this descriptor should be non-blocking or
242 1.1 christos ops->avail should be non-NULL. */
243 1.1 christos int error_fd;
244 1.1 christos const struct serial_ops *ops; /* Function vector */
245 1.1 christos void *state; /* Local context info for open FD */
246 1.1 christos serial_ttystate ttystate; /* Not used (yet) */
247 1.1 christos int bufcnt; /* Amount of data remaining in receive
248 1.1 christos buffer. -ve for sticky errors. */
249 1.1 christos unsigned char *bufp; /* Current byte */
250 1.1 christos unsigned char buf[BUFSIZ]; /* Da buffer itself */
251 1.9 christos char *name; /* The name of the device or host */
252 1.1 christos struct serial *next; /* Pointer to the next `struct serial *' */
253 1.1 christos int debug_p; /* Trace this serial devices operation. */
254 1.1 christos int async_state; /* Async internal state. */
255 1.1 christos void *async_context; /* Async event thread's context */
256 1.1 christos serial_event_ftype *async_handler;/* Async event handler */
257 1.1 christos };
258 1.1 christos
259 1.1 christos struct serial_ops
260 1.1 christos {
261 1.7 christos const char *name;
262 1.1 christos int (*open) (struct serial *, const char *name);
263 1.1 christos void (*close) (struct serial *);
264 1.1 christos int (*fdopen) (struct serial *, int fd);
265 1.1 christos int (*readchar) (struct serial *, int timeout);
266 1.1 christos int (*write) (struct serial *, const void *buf, size_t count);
267 1.1 christos /* Discard pending output */
268 1.1 christos int (*flush_output) (struct serial *);
269 1.1 christos /* Discard pending input */
270 1.1 christos int (*flush_input) (struct serial *);
271 1.1 christos int (*send_break) (struct serial *);
272 1.1 christos void (*go_raw) (struct serial *);
273 1.1 christos serial_ttystate (*get_tty_state) (struct serial *);
274 1.1 christos serial_ttystate (*copy_tty_state) (struct serial *, serial_ttystate);
275 1.1 christos int (*set_tty_state) (struct serial *, serial_ttystate);
276 1.1 christos void (*print_tty_state) (struct serial *, serial_ttystate,
277 1.1 christos struct ui_file *);
278 1.1 christos int (*setbaudrate) (struct serial *, int rate);
279 1.1 christos int (*setstopbits) (struct serial *, int num);
280 1.5 christos /* Set the value PARITY as parity setting for serial object.
281 1.5 christos Return 0 in the case of success. */
282 1.5 christos int (*setparity) (struct serial *, int parity);
283 1.1 christos /* Wait for output to drain. */
284 1.1 christos int (*drain_output) (struct serial *);
285 1.1 christos /* Change the serial device into/out of asynchronous mode, call
286 1.1 christos the specified function when ever there is something
287 1.1 christos interesting. */
288 1.1 christos void (*async) (struct serial *scb, int async_p);
289 1.1 christos /* Perform a low-level read operation, reading (at most) COUNT
290 1.1 christos bytes into SCB->BUF. Return zero at end of file. */
291 1.1 christos int (*read_prim)(struct serial *scb, size_t count);
292 1.1 christos /* Perform a low-level write operation, writing (at most) COUNT
293 1.1 christos bytes from BUF. */
294 1.1 christos int (*write_prim)(struct serial *scb, const void *buf, size_t count);
295 1.1 christos /* Return that number of bytes that can be read from FD
296 1.1 christos without blocking. Return value of -1 means that the
297 1.1 christos read will not block even if less that requested bytes
298 1.1 christos are available. */
299 1.1 christos int (*avail)(struct serial *scb, int fd);
300 1.1 christos
301 1.1 christos #ifdef USE_WIN32API
302 1.1 christos /* Return a handle to wait on, indicating available data from SCB
303 1.1 christos when signaled, in *READ. Return a handle indicating errors
304 1.1 christos in *EXCEPT. */
305 1.1 christos void (*wait_handle) (struct serial *scb, HANDLE *read, HANDLE *except);
306 1.1 christos void (*done_wait_handle) (struct serial *scb);
307 1.1 christos #endif /* USE_WIN32API */
308 1.1 christos };
309 1.1 christos
310 1.1 christos /* Add a new serial interface to the interface list. */
311 1.1 christos
312 1.1 christos extern void serial_add_interface (const struct serial_ops * optable);
313 1.1 christos
314 1.1 christos /* File in which to record the remote debugging session. */
315 1.1 christos
316 1.3 christos extern void serial_log_command (struct target_ops *self, const char *);
317 1.1 christos
318 1.1 christos #ifdef USE_WIN32API
319 1.1 christos
320 1.1 christos /* Windows-only: find or create handles that we can wait on for this
321 1.1 christos serial device. */
322 1.1 christos extern void serial_wait_handle (struct serial *, HANDLE *, HANDLE *);
323 1.1 christos
324 1.1 christos /* Windows-only: signal that we are done with the wait handles. */
325 1.1 christos extern void serial_done_wait_handle (struct serial *);
326 1.1 christos
327 1.1 christos #endif /* USE_WIN32API */
328 1.1 christos
329 1.1 christos #endif /* SERIAL_H */
330