ser-unix.c revision 1.9 1 1.1 christos /* Serial interface for local (hardwired) serial ports on Un*x like systems
2 1.1 christos
3 1.9 christos Copyright (C) 1992-2020 Free Software Foundation, Inc.
4 1.1 christos
5 1.1 christos This file is part of GDB.
6 1.1 christos
7 1.1 christos This program is free software; you can redistribute it and/or modify
8 1.1 christos it under the terms of the GNU General Public License as published by
9 1.1 christos the Free Software Foundation; either version 3 of the License, or
10 1.1 christos (at your option) any later version.
11 1.1 christos
12 1.1 christos This program is distributed in the hope that it will be useful,
13 1.1 christos but WITHOUT ANY WARRANTY; without even the implied warranty of
14 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 1.1 christos GNU General Public License for more details.
16 1.1 christos
17 1.1 christos You should have received a copy of the GNU General Public License
18 1.1 christos along with this program. If not, see <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1 christos #include "defs.h"
21 1.1 christos #include "serial.h"
22 1.1 christos #include "ser-base.h"
23 1.1 christos #include "ser-unix.h"
24 1.1 christos
25 1.1 christos #include <fcntl.h>
26 1.1 christos #include <sys/types.h>
27 1.1 christos #include "terminal.h"
28 1.1 christos #include <sys/socket.h>
29 1.9 christos #include "gdbsupport/gdb_sys_time.h"
30 1.1 christos
31 1.9 christos #include "gdbsupport/gdb_select.h"
32 1.1 christos #include "gdbcmd.h"
33 1.9 christos #include "gdbsupport/filestuff.h"
34 1.8 christos #include <termios.h>
35 1.8 christos #include "inflow.h"
36 1.1 christos
37 1.1 christos struct hardwire_ttystate
38 1.1 christos {
39 1.1 christos struct termios termios;
40 1.1 christos };
41 1.1 christos
42 1.1 christos #ifdef CRTSCTS
43 1.1 christos /* Boolean to explicitly enable or disable h/w flow control. */
44 1.9 christos static bool serial_hwflow;
45 1.1 christos static void
46 1.1 christos show_serial_hwflow (struct ui_file *file, int from_tty,
47 1.1 christos struct cmd_list_element *c, const char *value)
48 1.1 christos {
49 1.1 christos fprintf_filtered (file, _("Hardware flow control is %s.\n"), value);
50 1.1 christos }
51 1.1 christos #endif
52 1.1 christos
53 1.1 christos static int hardwire_open (struct serial *scb, const char *name);
54 1.1 christos static void hardwire_raw (struct serial *scb);
55 1.1 christos static int rate_to_code (int rate);
56 1.1 christos static int hardwire_setbaudrate (struct serial *scb, int rate);
57 1.5 christos static int hardwire_setparity (struct serial *scb, int parity);
58 1.1 christos static void hardwire_close (struct serial *scb);
59 1.1 christos static int get_tty_state (struct serial *scb,
60 1.1 christos struct hardwire_ttystate * state);
61 1.1 christos static int set_tty_state (struct serial *scb,
62 1.1 christos struct hardwire_ttystate * state);
63 1.1 christos static serial_ttystate hardwire_get_tty_state (struct serial *scb);
64 1.1 christos static int hardwire_set_tty_state (struct serial *scb, serial_ttystate state);
65 1.1 christos static void hardwire_print_tty_state (struct serial *, serial_ttystate,
66 1.1 christos struct ui_file *);
67 1.1 christos static int hardwire_drain_output (struct serial *);
68 1.1 christos static int hardwire_flush_output (struct serial *);
69 1.1 christos static int hardwire_flush_input (struct serial *);
70 1.1 christos static int hardwire_send_break (struct serial *);
71 1.1 christos static int hardwire_setstopbits (struct serial *, int);
72 1.1 christos
73 1.1 christos /* Open up a real live device for serial I/O. */
74 1.1 christos
75 1.1 christos static int
76 1.1 christos hardwire_open (struct serial *scb, const char *name)
77 1.1 christos {
78 1.1 christos scb->fd = gdb_open_cloexec (name, O_RDWR, 0);
79 1.1 christos if (scb->fd < 0)
80 1.1 christos return -1;
81 1.1 christos
82 1.1 christos return 0;
83 1.1 christos }
84 1.1 christos
85 1.1 christos static int
86 1.1 christos get_tty_state (struct serial *scb, struct hardwire_ttystate *state)
87 1.1 christos {
88 1.1 christos if (tcgetattr (scb->fd, &state->termios) < 0)
89 1.1 christos return -1;
90 1.1 christos
91 1.1 christos return 0;
92 1.1 christos }
93 1.1 christos
94 1.1 christos static int
95 1.1 christos set_tty_state (struct serial *scb, struct hardwire_ttystate *state)
96 1.1 christos {
97 1.1 christos if (tcsetattr (scb->fd, TCSANOW, &state->termios) < 0)
98 1.1 christos return -1;
99 1.1 christos
100 1.1 christos return 0;
101 1.1 christos }
102 1.1 christos
103 1.1 christos static serial_ttystate
104 1.1 christos hardwire_get_tty_state (struct serial *scb)
105 1.1 christos {
106 1.6 christos struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
107 1.1 christos
108 1.1 christos if (get_tty_state (scb, state))
109 1.1 christos {
110 1.1 christos xfree (state);
111 1.1 christos return NULL;
112 1.1 christos }
113 1.1 christos
114 1.1 christos return (serial_ttystate) state;
115 1.1 christos }
116 1.1 christos
117 1.1 christos static serial_ttystate
118 1.1 christos hardwire_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
119 1.1 christos {
120 1.6 christos struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
121 1.1 christos
122 1.1 christos *state = *(struct hardwire_ttystate *) ttystate;
123 1.1 christos
124 1.1 christos return (serial_ttystate) state;
125 1.1 christos }
126 1.1 christos
127 1.1 christos static int
128 1.1 christos hardwire_set_tty_state (struct serial *scb, serial_ttystate ttystate)
129 1.1 christos {
130 1.1 christos struct hardwire_ttystate *state;
131 1.1 christos
132 1.1 christos state = (struct hardwire_ttystate *) ttystate;
133 1.1 christos
134 1.1 christos return set_tty_state (scb, state);
135 1.1 christos }
136 1.1 christos
137 1.1 christos static void
138 1.1 christos hardwire_print_tty_state (struct serial *scb,
139 1.1 christos serial_ttystate ttystate,
140 1.1 christos struct ui_file *stream)
141 1.1 christos {
142 1.1 christos struct hardwire_ttystate *state = (struct hardwire_ttystate *) ttystate;
143 1.1 christos int i;
144 1.1 christos
145 1.1 christos fprintf_filtered (stream, "c_iflag = 0x%x, c_oflag = 0x%x,\n",
146 1.1 christos (int) state->termios.c_iflag,
147 1.1 christos (int) state->termios.c_oflag);
148 1.1 christos fprintf_filtered (stream, "c_cflag = 0x%x, c_lflag = 0x%x\n",
149 1.1 christos (int) state->termios.c_cflag,
150 1.1 christos (int) state->termios.c_lflag);
151 1.1 christos #if 0
152 1.1 christos /* This not in POSIX, and is not really documented by those systems
153 1.1 christos which have it (at least not Sun). */
154 1.1 christos fprintf_filtered (stream, "c_line = 0x%x.\n", state->termios.c_line);
155 1.1 christos #endif
156 1.1 christos fprintf_filtered (stream, "c_cc: ");
157 1.1 christos for (i = 0; i < NCCS; i += 1)
158 1.1 christos fprintf_filtered (stream, "0x%x ", state->termios.c_cc[i]);
159 1.1 christos fprintf_filtered (stream, "\n");
160 1.1 christos }
161 1.1 christos
162 1.1 christos /* Wait for the output to drain away, as opposed to flushing
163 1.1 christos (discarding) it. */
164 1.1 christos
165 1.1 christos static int
166 1.1 christos hardwire_drain_output (struct serial *scb)
167 1.1 christos {
168 1.8 christos /* Ignore SIGTTOU which may occur during the drain. */
169 1.8 christos scoped_ignore_sigttou ignore_sigttou;
170 1.8 christos
171 1.1 christos return tcdrain (scb->fd);
172 1.1 christos }
173 1.1 christos
174 1.1 christos static int
175 1.1 christos hardwire_flush_output (struct serial *scb)
176 1.1 christos {
177 1.1 christos return tcflush (scb->fd, TCOFLUSH);
178 1.1 christos }
179 1.1 christos
180 1.1 christos static int
181 1.1 christos hardwire_flush_input (struct serial *scb)
182 1.1 christos {
183 1.1 christos ser_base_flush_input (scb);
184 1.1 christos
185 1.1 christos return tcflush (scb->fd, TCIFLUSH);
186 1.1 christos }
187 1.1 christos
188 1.1 christos static int
189 1.1 christos hardwire_send_break (struct serial *scb)
190 1.1 christos {
191 1.1 christos return tcsendbreak (scb->fd, 0);
192 1.1 christos }
193 1.1 christos
194 1.1 christos static void
195 1.1 christos hardwire_raw (struct serial *scb)
196 1.1 christos {
197 1.1 christos struct hardwire_ttystate state;
198 1.1 christos
199 1.1 christos if (get_tty_state (scb, &state))
200 1.1 christos fprintf_unfiltered (gdb_stderr, "get_tty_state failed: %s\n",
201 1.1 christos safe_strerror (errno));
202 1.1 christos
203 1.1 christos state.termios.c_iflag = 0;
204 1.1 christos state.termios.c_oflag = 0;
205 1.1 christos state.termios.c_lflag = 0;
206 1.5 christos state.termios.c_cflag &= ~CSIZE;
207 1.1 christos state.termios.c_cflag |= CLOCAL | CS8;
208 1.1 christos #ifdef CRTSCTS
209 1.1 christos /* h/w flow control. */
210 1.1 christos if (serial_hwflow)
211 1.1 christos state.termios.c_cflag |= CRTSCTS;
212 1.1 christos else
213 1.1 christos state.termios.c_cflag &= ~CRTSCTS;
214 1.1 christos #ifdef CRTS_IFLOW
215 1.1 christos if (serial_hwflow)
216 1.1 christos state.termios.c_cflag |= CRTS_IFLOW;
217 1.1 christos else
218 1.1 christos state.termios.c_cflag &= ~CRTS_IFLOW;
219 1.1 christos #endif
220 1.1 christos #endif
221 1.1 christos state.termios.c_cc[VMIN] = 0;
222 1.1 christos state.termios.c_cc[VTIME] = 0;
223 1.1 christos
224 1.1 christos if (set_tty_state (scb, &state))
225 1.1 christos fprintf_unfiltered (gdb_stderr, "set_tty_state failed: %s\n",
226 1.1 christos safe_strerror (errno));
227 1.1 christos }
228 1.1 christos
229 1.1 christos #ifndef B19200
230 1.1 christos #define B19200 EXTA
231 1.1 christos #endif
232 1.1 christos
233 1.1 christos #ifndef B38400
234 1.1 christos #define B38400 EXTB
235 1.1 christos #endif
236 1.1 christos
237 1.1 christos /* Translate baud rates from integers to damn B_codes. Unix should
238 1.1 christos have outgrown this crap years ago, but even POSIX wouldn't buck it. */
239 1.1 christos
240 1.1 christos static struct
241 1.1 christos {
242 1.1 christos int rate;
243 1.1 christos int code;
244 1.1 christos }
245 1.1 christos baudtab[] =
246 1.1 christos {
247 1.1 christos {
248 1.1 christos 50, B50
249 1.1 christos }
250 1.1 christos ,
251 1.1 christos {
252 1.1 christos 75, B75
253 1.1 christos }
254 1.1 christos ,
255 1.1 christos {
256 1.1 christos 110, B110
257 1.1 christos }
258 1.1 christos ,
259 1.1 christos {
260 1.1 christos 134, B134
261 1.1 christos }
262 1.1 christos ,
263 1.1 christos {
264 1.1 christos 150, B150
265 1.1 christos }
266 1.1 christos ,
267 1.1 christos {
268 1.1 christos 200, B200
269 1.1 christos }
270 1.1 christos ,
271 1.1 christos {
272 1.1 christos 300, B300
273 1.1 christos }
274 1.1 christos ,
275 1.1 christos {
276 1.1 christos 600, B600
277 1.1 christos }
278 1.1 christos ,
279 1.1 christos {
280 1.1 christos 1200, B1200
281 1.1 christos }
282 1.1 christos ,
283 1.1 christos {
284 1.1 christos 1800, B1800
285 1.1 christos }
286 1.1 christos ,
287 1.1 christos {
288 1.1 christos 2400, B2400
289 1.1 christos }
290 1.1 christos ,
291 1.1 christos {
292 1.1 christos 4800, B4800
293 1.1 christos }
294 1.1 christos ,
295 1.1 christos {
296 1.1 christos 9600, B9600
297 1.1 christos }
298 1.1 christos ,
299 1.1 christos {
300 1.1 christos 19200, B19200
301 1.1 christos }
302 1.1 christos ,
303 1.1 christos {
304 1.1 christos 38400, B38400
305 1.1 christos }
306 1.1 christos ,
307 1.1 christos #ifdef B57600
308 1.1 christos {
309 1.1 christos 57600, B57600
310 1.1 christos }
311 1.1 christos ,
312 1.1 christos #endif
313 1.1 christos #ifdef B115200
314 1.1 christos {
315 1.1 christos 115200, B115200
316 1.1 christos }
317 1.1 christos ,
318 1.1 christos #endif
319 1.1 christos #ifdef B230400
320 1.1 christos {
321 1.1 christos 230400, B230400
322 1.1 christos }
323 1.1 christos ,
324 1.1 christos #endif
325 1.1 christos #ifdef B460800
326 1.1 christos {
327 1.1 christos 460800, B460800
328 1.1 christos }
329 1.1 christos ,
330 1.1 christos #endif
331 1.1 christos {
332 1.1 christos -1, -1
333 1.1 christos }
334 1.1 christos ,
335 1.1 christos };
336 1.1 christos
337 1.1 christos static int
338 1.1 christos rate_to_code (int rate)
339 1.1 christos {
340 1.1 christos int i;
341 1.1 christos
342 1.1 christos for (i = 0; baudtab[i].rate != -1; i++)
343 1.1 christos {
344 1.1 christos /* test for perfect macth. */
345 1.1 christos if (rate == baudtab[i].rate)
346 1.1 christos return baudtab[i].code;
347 1.1 christos else
348 1.1 christos {
349 1.1 christos /* check if it is in between valid values. */
350 1.1 christos if (rate < baudtab[i].rate)
351 1.1 christos {
352 1.1 christos if (i)
353 1.1 christos {
354 1.1 christos warning (_("Invalid baud rate %d. "
355 1.1 christos "Closest values are %d and %d."),
356 1.1 christos rate, baudtab[i - 1].rate, baudtab[i].rate);
357 1.1 christos }
358 1.1 christos else
359 1.1 christos {
360 1.1 christos warning (_("Invalid baud rate %d. Minimum value is %d."),
361 1.1 christos rate, baudtab[0].rate);
362 1.1 christos }
363 1.1 christos return -1;
364 1.1 christos }
365 1.1 christos }
366 1.1 christos }
367 1.1 christos
368 1.1 christos /* The requested speed was too large. */
369 1.1 christos warning (_("Invalid baud rate %d. Maximum value is %d."),
370 1.1 christos rate, baudtab[i - 1].rate);
371 1.1 christos return -1;
372 1.1 christos }
373 1.1 christos
374 1.1 christos static int
375 1.1 christos hardwire_setbaudrate (struct serial *scb, int rate)
376 1.1 christos {
377 1.1 christos struct hardwire_ttystate state;
378 1.1 christos int baud_code = rate_to_code (rate);
379 1.1 christos
380 1.1 christos if (baud_code < 0)
381 1.1 christos {
382 1.1 christos /* The baud rate was not valid.
383 1.1 christos A warning has already been issued. */
384 1.1 christos errno = EINVAL;
385 1.1 christos return -1;
386 1.1 christos }
387 1.1 christos
388 1.1 christos if (get_tty_state (scb, &state))
389 1.1 christos return -1;
390 1.1 christos
391 1.1 christos cfsetospeed (&state.termios, baud_code);
392 1.1 christos cfsetispeed (&state.termios, baud_code);
393 1.1 christos
394 1.1 christos return set_tty_state (scb, &state);
395 1.1 christos }
396 1.1 christos
397 1.1 christos static int
398 1.1 christos hardwire_setstopbits (struct serial *scb, int num)
399 1.1 christos {
400 1.1 christos struct hardwire_ttystate state;
401 1.1 christos int newbit;
402 1.1 christos
403 1.1 christos if (get_tty_state (scb, &state))
404 1.1 christos return -1;
405 1.1 christos
406 1.1 christos switch (num)
407 1.1 christos {
408 1.1 christos case SERIAL_1_STOPBITS:
409 1.1 christos newbit = 0;
410 1.1 christos break;
411 1.1 christos case SERIAL_1_AND_A_HALF_STOPBITS:
412 1.1 christos case SERIAL_2_STOPBITS:
413 1.1 christos newbit = 1;
414 1.1 christos break;
415 1.1 christos default:
416 1.1 christos return 1;
417 1.1 christos }
418 1.1 christos
419 1.1 christos if (!newbit)
420 1.1 christos state.termios.c_cflag &= ~CSTOPB;
421 1.1 christos else
422 1.1 christos state.termios.c_cflag |= CSTOPB; /* two bits */
423 1.1 christos
424 1.1 christos return set_tty_state (scb, &state);
425 1.1 christos }
426 1.1 christos
427 1.5 christos /* Implement the "setparity" serial_ops callback. */
428 1.5 christos
429 1.5 christos static int
430 1.5 christos hardwire_setparity (struct serial *scb, int parity)
431 1.5 christos {
432 1.5 christos struct hardwire_ttystate state;
433 1.5 christos int newparity = 0;
434 1.5 christos
435 1.5 christos if (get_tty_state (scb, &state))
436 1.5 christos return -1;
437 1.5 christos
438 1.5 christos switch (parity)
439 1.5 christos {
440 1.5 christos case GDBPARITY_NONE:
441 1.5 christos newparity = 0;
442 1.5 christos break;
443 1.5 christos case GDBPARITY_ODD:
444 1.5 christos newparity = PARENB | PARODD;
445 1.5 christos break;
446 1.5 christos case GDBPARITY_EVEN:
447 1.5 christos newparity = PARENB;
448 1.5 christos break;
449 1.5 christos default:
450 1.5 christos internal_warning (__FILE__, __LINE__,
451 1.5 christos "Incorrect parity value: %d", parity);
452 1.5 christos return -1;
453 1.5 christos }
454 1.5 christos
455 1.5 christos state.termios.c_cflag &= ~(PARENB | PARODD);
456 1.5 christos state.termios.c_cflag |= newparity;
457 1.5 christos
458 1.5 christos return set_tty_state (scb, &state);
459 1.5 christos }
460 1.5 christos
461 1.5 christos
462 1.1 christos static void
463 1.1 christos hardwire_close (struct serial *scb)
464 1.1 christos {
465 1.1 christos if (scb->fd < 0)
466 1.1 christos return;
467 1.1 christos
468 1.1 christos close (scb->fd);
469 1.1 christos scb->fd = -1;
470 1.1 christos }
471 1.1 christos
472 1.1 christos
474 1.1 christos
476 1.1 christos /* The hardwire ops. */
477 1.1 christos
478 1.1 christos static const struct serial_ops hardwire_ops =
479 1.1 christos {
480 1.1 christos "hardwire",
481 1.1 christos hardwire_open,
482 1.7 christos hardwire_close,
483 1.1 christos NULL,
484 1.1 christos ser_base_readchar,
485 1.1 christos ser_base_write,
486 1.1 christos hardwire_flush_output,
487 1.1 christos hardwire_flush_input,
488 1.1 christos hardwire_send_break,
489 1.1 christos hardwire_raw,
490 1.1 christos hardwire_get_tty_state,
491 1.1 christos hardwire_copy_tty_state,
492 1.1 christos hardwire_set_tty_state,
493 1.1 christos hardwire_print_tty_state,
494 1.5 christos hardwire_setbaudrate,
495 1.1 christos hardwire_setstopbits,
496 1.1 christos hardwire_setparity,
497 1.1 christos hardwire_drain_output,
498 1.1 christos ser_base_async,
499 1.1 christos ser_unix_read_prim,
500 1.1 christos ser_unix_write_prim
501 1.9 christos };
502 1.1 christos
503 1.9 christos void _initialize_ser_hardwire ();
504 1.1 christos void
505 1.1 christos _initialize_ser_hardwire ()
506 1.1 christos {
507 1.1 christos serial_add_interface (&hardwire_ops);
508 1.1 christos
509 1.1 christos #ifdef CRTSCTS
510 1.1 christos add_setshow_boolean_cmd ("remoteflow", no_class,
511 1.1 christos &serial_hwflow, _("\
512 1.1 christos Set use of hardware flow control for remote serial I/O."), _("\
513 1.1 christos Show use of hardware flow control for remote serial I/O."), _("\
514 1.1 christos Enable or disable hardware flow control (RTS/CTS) on the serial port\n\
515 1.1 christos when debugging using remote targets."),
516 1.1 christos NULL,
517 1.1 christos show_serial_hwflow,
518 1.1 christos &setlist, &showlist);
519 1.1 christos #endif
520 1.1 christos }
521 1.1 christos
522 1.1 christos int
523 1.6 christos ser_unix_read_prim (struct serial *scb, size_t count)
524 1.1 christos {
525 1.1 christos return read (scb->fd, scb->buf, count);
526 1.1 christos }
527 1.1 christos
528 1.1 christos int
529 1.1 christos ser_unix_write_prim (struct serial *scb, const void *buf, size_t len)
530 1.1 christos {
531 return write (scb->fd, buf, len);
532 }
533