ser-unix.c revision 1.7 1 1.1 christos /* Serial interface for local (hardwired) serial ports on Un*x like systems
2 1.1 christos
3 1.7 christos Copyright (C) 1992-2017 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.6 christos #include "gdb_sys_time.h"
30 1.1 christos
31 1.1 christos #include "gdb_select.h"
32 1.1 christos #include "gdbcmd.h"
33 1.1 christos #include "filestuff.h"
34 1.7 christos #include "gdb_termios.h"
35 1.1 christos
36 1.1 christos #ifdef HAVE_TERMIOS
37 1.1 christos
38 1.1 christos struct hardwire_ttystate
39 1.1 christos {
40 1.1 christos struct termios termios;
41 1.1 christos };
42 1.1 christos
43 1.1 christos #ifdef CRTSCTS
44 1.1 christos /* Boolean to explicitly enable or disable h/w flow control. */
45 1.1 christos static int serial_hwflow;
46 1.1 christos static void
47 1.1 christos show_serial_hwflow (struct ui_file *file, int from_tty,
48 1.1 christos struct cmd_list_element *c, const char *value)
49 1.1 christos {
50 1.1 christos fprintf_filtered (file, _("Hardware flow control is %s.\n"), value);
51 1.1 christos }
52 1.1 christos #endif
53 1.1 christos
54 1.1 christos #endif /* termios */
55 1.1 christos
56 1.1 christos #ifdef HAVE_TERMIO
57 1.1 christos
58 1.1 christos /* It is believed that all systems which have added job control to SVR3
59 1.1 christos (e.g. sco) have also added termios. Even if not, trying to figure out
60 1.1 christos all the variations (TIOCGPGRP vs. TCGETPGRP, etc.) would be pretty
61 1.1 christos bewildering. So we don't attempt it. */
62 1.1 christos
63 1.1 christos struct hardwire_ttystate
64 1.1 christos {
65 1.1 christos struct termio termio;
66 1.1 christos };
67 1.1 christos #endif /* termio */
68 1.1 christos
69 1.1 christos #ifdef HAVE_SGTTY
70 1.1 christos struct hardwire_ttystate
71 1.1 christos {
72 1.1 christos struct sgttyb sgttyb;
73 1.1 christos struct tchars tc;
74 1.1 christos struct ltchars ltc;
75 1.1 christos /* Line discipline flags. */
76 1.1 christos int lmode;
77 1.1 christos };
78 1.1 christos #endif /* sgtty */
79 1.1 christos
80 1.1 christos static int hardwire_open (struct serial *scb, const char *name);
81 1.1 christos static void hardwire_raw (struct serial *scb);
82 1.1 christos static int rate_to_code (int rate);
83 1.1 christos static int hardwire_setbaudrate (struct serial *scb, int rate);
84 1.5 christos static int hardwire_setparity (struct serial *scb, int parity);
85 1.1 christos static void hardwire_close (struct serial *scb);
86 1.1 christos static int get_tty_state (struct serial *scb,
87 1.1 christos struct hardwire_ttystate * state);
88 1.1 christos static int set_tty_state (struct serial *scb,
89 1.1 christos struct hardwire_ttystate * state);
90 1.1 christos static serial_ttystate hardwire_get_tty_state (struct serial *scb);
91 1.1 christos static int hardwire_set_tty_state (struct serial *scb, serial_ttystate state);
92 1.1 christos static int hardwire_noflush_set_tty_state (struct serial *, serial_ttystate,
93 1.1 christos serial_ttystate);
94 1.1 christos static void hardwire_print_tty_state (struct serial *, serial_ttystate,
95 1.1 christos struct ui_file *);
96 1.1 christos static int hardwire_drain_output (struct serial *);
97 1.1 christos static int hardwire_flush_output (struct serial *);
98 1.1 christos static int hardwire_flush_input (struct serial *);
99 1.1 christos static int hardwire_send_break (struct serial *);
100 1.1 christos static int hardwire_setstopbits (struct serial *, int);
101 1.1 christos
102 1.1 christos void _initialize_ser_hardwire (void);
103 1.1 christos
104 1.1 christos /* Open up a real live device for serial I/O. */
105 1.1 christos
106 1.1 christos static int
107 1.1 christos hardwire_open (struct serial *scb, const char *name)
108 1.1 christos {
109 1.1 christos scb->fd = gdb_open_cloexec (name, O_RDWR, 0);
110 1.1 christos if (scb->fd < 0)
111 1.1 christos return -1;
112 1.1 christos
113 1.1 christos return 0;
114 1.1 christos }
115 1.1 christos
116 1.1 christos static int
117 1.1 christos get_tty_state (struct serial *scb, struct hardwire_ttystate *state)
118 1.1 christos {
119 1.1 christos #ifdef HAVE_TERMIOS
120 1.1 christos if (tcgetattr (scb->fd, &state->termios) < 0)
121 1.1 christos return -1;
122 1.1 christos
123 1.1 christos return 0;
124 1.1 christos #endif
125 1.1 christos
126 1.1 christos #ifdef HAVE_TERMIO
127 1.1 christos if (ioctl (scb->fd, TCGETA, &state->termio) < 0)
128 1.1 christos return -1;
129 1.1 christos return 0;
130 1.1 christos #endif
131 1.1 christos
132 1.1 christos #ifdef HAVE_SGTTY
133 1.1 christos if (ioctl (scb->fd, TIOCGETP, &state->sgttyb) < 0)
134 1.1 christos return -1;
135 1.1 christos if (ioctl (scb->fd, TIOCGETC, &state->tc) < 0)
136 1.1 christos return -1;
137 1.1 christos if (ioctl (scb->fd, TIOCGLTC, &state->ltc) < 0)
138 1.1 christos return -1;
139 1.1 christos if (ioctl (scb->fd, TIOCLGET, &state->lmode) < 0)
140 1.1 christos return -1;
141 1.1 christos
142 1.1 christos return 0;
143 1.1 christos #endif
144 1.1 christos }
145 1.1 christos
146 1.1 christos static int
147 1.1 christos set_tty_state (struct serial *scb, struct hardwire_ttystate *state)
148 1.1 christos {
149 1.1 christos #ifdef HAVE_TERMIOS
150 1.1 christos if (tcsetattr (scb->fd, TCSANOW, &state->termios) < 0)
151 1.1 christos return -1;
152 1.1 christos
153 1.1 christos return 0;
154 1.1 christos #endif
155 1.1 christos
156 1.1 christos #ifdef HAVE_TERMIO
157 1.1 christos if (ioctl (scb->fd, TCSETA, &state->termio) < 0)
158 1.1 christos return -1;
159 1.1 christos return 0;
160 1.1 christos #endif
161 1.1 christos
162 1.1 christos #ifdef HAVE_SGTTY
163 1.1 christos if (ioctl (scb->fd, TIOCSETN, &state->sgttyb) < 0)
164 1.1 christos return -1;
165 1.1 christos if (ioctl (scb->fd, TIOCSETC, &state->tc) < 0)
166 1.1 christos return -1;
167 1.1 christos if (ioctl (scb->fd, TIOCSLTC, &state->ltc) < 0)
168 1.1 christos return -1;
169 1.1 christos if (ioctl (scb->fd, TIOCLSET, &state->lmode) < 0)
170 1.1 christos return -1;
171 1.1 christos
172 1.1 christos return 0;
173 1.1 christos #endif
174 1.1 christos }
175 1.1 christos
176 1.1 christos static serial_ttystate
177 1.1 christos hardwire_get_tty_state (struct serial *scb)
178 1.1 christos {
179 1.6 christos struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
180 1.1 christos
181 1.1 christos if (get_tty_state (scb, state))
182 1.1 christos {
183 1.1 christos xfree (state);
184 1.1 christos return NULL;
185 1.1 christos }
186 1.1 christos
187 1.1 christos return (serial_ttystate) state;
188 1.1 christos }
189 1.1 christos
190 1.1 christos static serial_ttystate
191 1.1 christos hardwire_copy_tty_state (struct serial *scb, serial_ttystate ttystate)
192 1.1 christos {
193 1.6 christos struct hardwire_ttystate *state = XNEW (struct hardwire_ttystate);
194 1.1 christos
195 1.1 christos *state = *(struct hardwire_ttystate *) ttystate;
196 1.1 christos
197 1.1 christos return (serial_ttystate) state;
198 1.1 christos }
199 1.1 christos
200 1.1 christos static int
201 1.1 christos hardwire_set_tty_state (struct serial *scb, serial_ttystate ttystate)
202 1.1 christos {
203 1.1 christos struct hardwire_ttystate *state;
204 1.1 christos
205 1.1 christos state = (struct hardwire_ttystate *) ttystate;
206 1.1 christos
207 1.1 christos return set_tty_state (scb, state);
208 1.1 christos }
209 1.1 christos
210 1.1 christos static int
211 1.1 christos hardwire_noflush_set_tty_state (struct serial *scb,
212 1.1 christos serial_ttystate new_ttystate,
213 1.1 christos serial_ttystate old_ttystate)
214 1.1 christos {
215 1.1 christos struct hardwire_ttystate new_state;
216 1.1 christos #ifdef HAVE_SGTTY
217 1.1 christos struct hardwire_ttystate *state = (struct hardwire_ttystate *) old_ttystate;
218 1.1 christos #endif
219 1.1 christos
220 1.1 christos new_state = *(struct hardwire_ttystate *) new_ttystate;
221 1.1 christos
222 1.1 christos /* Don't change in or out of raw mode; we don't want to flush input.
223 1.1 christos termio and termios have no such restriction; for them flushing input
224 1.1 christos is separate from setting the attributes. */
225 1.1 christos
226 1.1 christos #ifdef HAVE_SGTTY
227 1.1 christos if (state->sgttyb.sg_flags & RAW)
228 1.1 christos new_state.sgttyb.sg_flags |= RAW;
229 1.1 christos else
230 1.1 christos new_state.sgttyb.sg_flags &= ~RAW;
231 1.1 christos
232 1.1 christos /* I'm not sure whether this is necessary; the manpage just mentions
233 1.1 christos RAW not CBREAK. */
234 1.1 christos if (state->sgttyb.sg_flags & CBREAK)
235 1.1 christos new_state.sgttyb.sg_flags |= CBREAK;
236 1.1 christos else
237 1.1 christos new_state.sgttyb.sg_flags &= ~CBREAK;
238 1.1 christos #endif
239 1.1 christos
240 1.1 christos return set_tty_state (scb, &new_state);
241 1.1 christos }
242 1.1 christos
243 1.1 christos static void
244 1.1 christos hardwire_print_tty_state (struct serial *scb,
245 1.1 christos serial_ttystate ttystate,
246 1.1 christos struct ui_file *stream)
247 1.1 christos {
248 1.1 christos struct hardwire_ttystate *state = (struct hardwire_ttystate *) ttystate;
249 1.1 christos int i;
250 1.1 christos
251 1.1 christos #ifdef HAVE_TERMIOS
252 1.1 christos fprintf_filtered (stream, "c_iflag = 0x%x, c_oflag = 0x%x,\n",
253 1.1 christos (int) state->termios.c_iflag,
254 1.1 christos (int) state->termios.c_oflag);
255 1.1 christos fprintf_filtered (stream, "c_cflag = 0x%x, c_lflag = 0x%x\n",
256 1.1 christos (int) state->termios.c_cflag,
257 1.1 christos (int) state->termios.c_lflag);
258 1.1 christos #if 0
259 1.1 christos /* This not in POSIX, and is not really documented by those systems
260 1.1 christos which have it (at least not Sun). */
261 1.1 christos fprintf_filtered (stream, "c_line = 0x%x.\n", state->termios.c_line);
262 1.1 christos #endif
263 1.1 christos fprintf_filtered (stream, "c_cc: ");
264 1.1 christos for (i = 0; i < NCCS; i += 1)
265 1.1 christos fprintf_filtered (stream, "0x%x ", state->termios.c_cc[i]);
266 1.1 christos fprintf_filtered (stream, "\n");
267 1.1 christos #endif
268 1.1 christos
269 1.1 christos #ifdef HAVE_TERMIO
270 1.1 christos fprintf_filtered (stream, "c_iflag = 0x%x, c_oflag = 0x%x,\n",
271 1.1 christos state->termio.c_iflag, state->termio.c_oflag);
272 1.1 christos fprintf_filtered (stream, "c_cflag = 0x%x, c_lflag = 0x%x, c_line = 0x%x.\n",
273 1.1 christos state->termio.c_cflag, state->termio.c_lflag,
274 1.1 christos state->termio.c_line);
275 1.1 christos fprintf_filtered (stream, "c_cc: ");
276 1.1 christos for (i = 0; i < NCC; i += 1)
277 1.1 christos fprintf_filtered (stream, "0x%x ", state->termio.c_cc[i]);
278 1.1 christos fprintf_filtered (stream, "\n");
279 1.1 christos #endif
280 1.1 christos
281 1.1 christos #ifdef HAVE_SGTTY
282 1.1 christos fprintf_filtered (stream, "sgttyb.sg_flags = 0x%x.\n",
283 1.1 christos state->sgttyb.sg_flags);
284 1.1 christos
285 1.1 christos fprintf_filtered (stream, "tchars: ");
286 1.1 christos for (i = 0; i < (int) sizeof (struct tchars); i++)
287 1.1 christos fprintf_filtered (stream, "0x%x ", ((unsigned char *) &state->tc)[i]);
288 1.1 christos fprintf_filtered (stream, "\n");
289 1.1 christos
290 1.1 christos fprintf_filtered (stream, "ltchars: ");
291 1.1 christos for (i = 0; i < (int) sizeof (struct ltchars); i++)
292 1.1 christos fprintf_filtered (stream, "0x%x ", ((unsigned char *) &state->ltc)[i]);
293 1.1 christos fprintf_filtered (stream, "\n");
294 1.1 christos
295 1.1 christos fprintf_filtered (stream, "lmode: 0x%x\n", state->lmode);
296 1.1 christos #endif
297 1.1 christos }
298 1.1 christos
299 1.1 christos /* Wait for the output to drain away, as opposed to flushing
300 1.1 christos (discarding) it. */
301 1.1 christos
302 1.1 christos static int
303 1.1 christos hardwire_drain_output (struct serial *scb)
304 1.1 christos {
305 1.1 christos #ifdef HAVE_TERMIOS
306 1.1 christos return tcdrain (scb->fd);
307 1.1 christos #endif
308 1.1 christos
309 1.1 christos #ifdef HAVE_TERMIO
310 1.1 christos return ioctl (scb->fd, TCSBRK, 1);
311 1.1 christos #endif
312 1.1 christos
313 1.1 christos #ifdef HAVE_SGTTY
314 1.1 christos /* Get the current state and then restore it using TIOCSETP,
315 1.1 christos which should cause the output to drain and pending input
316 1.1 christos to be discarded. */
317 1.1 christos {
318 1.1 christos struct hardwire_ttystate state;
319 1.1 christos
320 1.1 christos if (get_tty_state (scb, &state))
321 1.1 christos {
322 1.1 christos return (-1);
323 1.1 christos }
324 1.1 christos else
325 1.1 christos {
326 1.1 christos return (ioctl (scb->fd, TIOCSETP, &state.sgttyb));
327 1.1 christos }
328 1.1 christos }
329 1.1 christos #endif
330 1.1 christos }
331 1.1 christos
332 1.1 christos static int
333 1.1 christos hardwire_flush_output (struct serial *scb)
334 1.1 christos {
335 1.1 christos #ifdef HAVE_TERMIOS
336 1.1 christos return tcflush (scb->fd, TCOFLUSH);
337 1.1 christos #endif
338 1.1 christos
339 1.1 christos #ifdef HAVE_TERMIO
340 1.1 christos return ioctl (scb->fd, TCFLSH, 1);
341 1.1 christos #endif
342 1.1 christos
343 1.1 christos #ifdef HAVE_SGTTY
344 1.1 christos /* This flushes both input and output, but we can't do better. */
345 1.1 christos return ioctl (scb->fd, TIOCFLUSH, 0);
346 1.1 christos #endif
347 1.1 christos }
348 1.1 christos
349 1.1 christos static int
350 1.1 christos hardwire_flush_input (struct serial *scb)
351 1.1 christos {
352 1.1 christos ser_base_flush_input (scb);
353 1.1 christos
354 1.1 christos #ifdef HAVE_TERMIOS
355 1.1 christos return tcflush (scb->fd, TCIFLUSH);
356 1.1 christos #endif
357 1.1 christos
358 1.1 christos #ifdef HAVE_TERMIO
359 1.1 christos return ioctl (scb->fd, TCFLSH, 0);
360 1.1 christos #endif
361 1.1 christos
362 1.1 christos #ifdef HAVE_SGTTY
363 1.1 christos /* This flushes both input and output, but we can't do better. */
364 1.1 christos return ioctl (scb->fd, TIOCFLUSH, 0);
365 1.1 christos #endif
366 1.1 christos }
367 1.1 christos
368 1.1 christos static int
369 1.1 christos hardwire_send_break (struct serial *scb)
370 1.1 christos {
371 1.1 christos #ifdef HAVE_TERMIOS
372 1.1 christos return tcsendbreak (scb->fd, 0);
373 1.1 christos #endif
374 1.1 christos
375 1.1 christos #ifdef HAVE_TERMIO
376 1.1 christos return ioctl (scb->fd, TCSBRK, 0);
377 1.1 christos #endif
378 1.1 christos
379 1.1 christos #ifdef HAVE_SGTTY
380 1.1 christos {
381 1.1 christos int status;
382 1.1 christos
383 1.1 christos status = ioctl (scb->fd, TIOCSBRK, 0);
384 1.1 christos
385 1.1 christos /* Can't use usleep; it doesn't exist in BSD 4.2. */
386 1.1 christos /* Note that if this gdb_select() is interrupted by a signal it will not
387 1.1 christos wait the full length of time. I think that is OK. */
388 1.1 christos gdb_usleep (250000);
389 1.1 christos status = ioctl (scb->fd, TIOCCBRK, 0);
390 1.1 christos return status;
391 1.1 christos }
392 1.1 christos #endif
393 1.1 christos }
394 1.1 christos
395 1.1 christos static void
396 1.1 christos hardwire_raw (struct serial *scb)
397 1.1 christos {
398 1.1 christos struct hardwire_ttystate state;
399 1.1 christos
400 1.1 christos if (get_tty_state (scb, &state))
401 1.1 christos fprintf_unfiltered (gdb_stderr, "get_tty_state failed: %s\n",
402 1.1 christos safe_strerror (errno));
403 1.1 christos
404 1.1 christos #ifdef HAVE_TERMIOS
405 1.1 christos state.termios.c_iflag = 0;
406 1.1 christos state.termios.c_oflag = 0;
407 1.1 christos state.termios.c_lflag = 0;
408 1.5 christos state.termios.c_cflag &= ~CSIZE;
409 1.1 christos state.termios.c_cflag |= CLOCAL | CS8;
410 1.1 christos #ifdef CRTSCTS
411 1.1 christos /* h/w flow control. */
412 1.1 christos if (serial_hwflow)
413 1.1 christos state.termios.c_cflag |= CRTSCTS;
414 1.1 christos else
415 1.1 christos state.termios.c_cflag &= ~CRTSCTS;
416 1.1 christos #ifdef CRTS_IFLOW
417 1.1 christos if (serial_hwflow)
418 1.1 christos state.termios.c_cflag |= CRTS_IFLOW;
419 1.1 christos else
420 1.1 christos state.termios.c_cflag &= ~CRTS_IFLOW;
421 1.1 christos #endif
422 1.1 christos #endif
423 1.1 christos state.termios.c_cc[VMIN] = 0;
424 1.1 christos state.termios.c_cc[VTIME] = 0;
425 1.1 christos #endif
426 1.1 christos
427 1.1 christos #ifdef HAVE_TERMIO
428 1.1 christos state.termio.c_iflag = 0;
429 1.1 christos state.termio.c_oflag = 0;
430 1.1 christos state.termio.c_lflag = 0;
431 1.5 christos state.termio.c_cflag &= ~CSIZE;
432 1.1 christos state.termio.c_cflag |= CLOCAL | CS8;
433 1.1 christos state.termio.c_cc[VMIN] = 0;
434 1.1 christos state.termio.c_cc[VTIME] = 0;
435 1.1 christos #endif
436 1.1 christos
437 1.1 christos #ifdef HAVE_SGTTY
438 1.1 christos state.sgttyb.sg_flags |= RAW | ANYP;
439 1.1 christos state.sgttyb.sg_flags &= ~(CBREAK | ECHO);
440 1.1 christos #endif
441 1.1 christos
442 1.1 christos if (set_tty_state (scb, &state))
443 1.1 christos fprintf_unfiltered (gdb_stderr, "set_tty_state failed: %s\n",
444 1.1 christos safe_strerror (errno));
445 1.1 christos }
446 1.1 christos
447 1.1 christos #ifndef B19200
448 1.1 christos #define B19200 EXTA
449 1.1 christos #endif
450 1.1 christos
451 1.1 christos #ifndef B38400
452 1.1 christos #define B38400 EXTB
453 1.1 christos #endif
454 1.1 christos
455 1.1 christos /* Translate baud rates from integers to damn B_codes. Unix should
456 1.1 christos have outgrown this crap years ago, but even POSIX wouldn't buck it. */
457 1.1 christos
458 1.1 christos static struct
459 1.1 christos {
460 1.1 christos int rate;
461 1.1 christos int code;
462 1.1 christos }
463 1.1 christos baudtab[] =
464 1.1 christos {
465 1.1 christos {
466 1.1 christos 50, B50
467 1.1 christos }
468 1.1 christos ,
469 1.1 christos {
470 1.1 christos 75, B75
471 1.1 christos }
472 1.1 christos ,
473 1.1 christos {
474 1.1 christos 110, B110
475 1.1 christos }
476 1.1 christos ,
477 1.1 christos {
478 1.1 christos 134, B134
479 1.1 christos }
480 1.1 christos ,
481 1.1 christos {
482 1.1 christos 150, B150
483 1.1 christos }
484 1.1 christos ,
485 1.1 christos {
486 1.1 christos 200, B200
487 1.1 christos }
488 1.1 christos ,
489 1.1 christos {
490 1.1 christos 300, B300
491 1.1 christos }
492 1.1 christos ,
493 1.1 christos {
494 1.1 christos 600, B600
495 1.1 christos }
496 1.1 christos ,
497 1.1 christos {
498 1.1 christos 1200, B1200
499 1.1 christos }
500 1.1 christos ,
501 1.1 christos {
502 1.1 christos 1800, B1800
503 1.1 christos }
504 1.1 christos ,
505 1.1 christos {
506 1.1 christos 2400, B2400
507 1.1 christos }
508 1.1 christos ,
509 1.1 christos {
510 1.1 christos 4800, B4800
511 1.1 christos }
512 1.1 christos ,
513 1.1 christos {
514 1.1 christos 9600, B9600
515 1.1 christos }
516 1.1 christos ,
517 1.1 christos {
518 1.1 christos 19200, B19200
519 1.1 christos }
520 1.1 christos ,
521 1.1 christos {
522 1.1 christos 38400, B38400
523 1.1 christos }
524 1.1 christos ,
525 1.1 christos #ifdef B57600
526 1.1 christos {
527 1.1 christos 57600, B57600
528 1.1 christos }
529 1.1 christos ,
530 1.1 christos #endif
531 1.1 christos #ifdef B115200
532 1.1 christos {
533 1.1 christos 115200, B115200
534 1.1 christos }
535 1.1 christos ,
536 1.1 christos #endif
537 1.1 christos #ifdef B230400
538 1.1 christos {
539 1.1 christos 230400, B230400
540 1.1 christos }
541 1.1 christos ,
542 1.1 christos #endif
543 1.1 christos #ifdef B460800
544 1.1 christos {
545 1.1 christos 460800, B460800
546 1.1 christos }
547 1.1 christos ,
548 1.1 christos #endif
549 1.1 christos {
550 1.1 christos -1, -1
551 1.1 christos }
552 1.1 christos ,
553 1.1 christos };
554 1.1 christos
555 1.1 christos static int
556 1.1 christos rate_to_code (int rate)
557 1.1 christos {
558 1.1 christos int i;
559 1.1 christos
560 1.1 christos for (i = 0; baudtab[i].rate != -1; i++)
561 1.1 christos {
562 1.1 christos /* test for perfect macth. */
563 1.1 christos if (rate == baudtab[i].rate)
564 1.1 christos return baudtab[i].code;
565 1.1 christos else
566 1.1 christos {
567 1.1 christos /* check if it is in between valid values. */
568 1.1 christos if (rate < baudtab[i].rate)
569 1.1 christos {
570 1.1 christos if (i)
571 1.1 christos {
572 1.1 christos warning (_("Invalid baud rate %d. "
573 1.1 christos "Closest values are %d and %d."),
574 1.1 christos rate, baudtab[i - 1].rate, baudtab[i].rate);
575 1.1 christos }
576 1.1 christos else
577 1.1 christos {
578 1.1 christos warning (_("Invalid baud rate %d. Minimum value is %d."),
579 1.1 christos rate, baudtab[0].rate);
580 1.1 christos }
581 1.1 christos return -1;
582 1.1 christos }
583 1.1 christos }
584 1.1 christos }
585 1.1 christos
586 1.1 christos /* The requested speed was too large. */
587 1.1 christos warning (_("Invalid baud rate %d. Maximum value is %d."),
588 1.1 christos rate, baudtab[i - 1].rate);
589 1.1 christos return -1;
590 1.1 christos }
591 1.1 christos
592 1.1 christos static int
593 1.1 christos hardwire_setbaudrate (struct serial *scb, int rate)
594 1.1 christos {
595 1.1 christos struct hardwire_ttystate state;
596 1.1 christos int baud_code = rate_to_code (rate);
597 1.1 christos
598 1.1 christos if (baud_code < 0)
599 1.1 christos {
600 1.1 christos /* The baud rate was not valid.
601 1.1 christos A warning has already been issued. */
602 1.1 christos errno = EINVAL;
603 1.1 christos return -1;
604 1.1 christos }
605 1.1 christos
606 1.1 christos if (get_tty_state (scb, &state))
607 1.1 christos return -1;
608 1.1 christos
609 1.1 christos #ifdef HAVE_TERMIOS
610 1.1 christos cfsetospeed (&state.termios, baud_code);
611 1.1 christos cfsetispeed (&state.termios, baud_code);
612 1.1 christos #endif
613 1.1 christos
614 1.1 christos #ifdef HAVE_TERMIO
615 1.1 christos #ifndef CIBAUD
616 1.1 christos #define CIBAUD CBAUD
617 1.1 christos #endif
618 1.1 christos
619 1.1 christos state.termio.c_cflag &= ~(CBAUD | CIBAUD);
620 1.1 christos state.termio.c_cflag |= baud_code;
621 1.1 christos #endif
622 1.1 christos
623 1.1 christos #ifdef HAVE_SGTTY
624 1.1 christos state.sgttyb.sg_ispeed = baud_code;
625 1.1 christos state.sgttyb.sg_ospeed = baud_code;
626 1.1 christos #endif
627 1.1 christos
628 1.1 christos return set_tty_state (scb, &state);
629 1.1 christos }
630 1.1 christos
631 1.1 christos static int
632 1.1 christos hardwire_setstopbits (struct serial *scb, int num)
633 1.1 christos {
634 1.1 christos struct hardwire_ttystate state;
635 1.1 christos int newbit;
636 1.1 christos
637 1.1 christos if (get_tty_state (scb, &state))
638 1.1 christos return -1;
639 1.1 christos
640 1.1 christos switch (num)
641 1.1 christos {
642 1.1 christos case SERIAL_1_STOPBITS:
643 1.1 christos newbit = 0;
644 1.1 christos break;
645 1.1 christos case SERIAL_1_AND_A_HALF_STOPBITS:
646 1.1 christos case SERIAL_2_STOPBITS:
647 1.1 christos newbit = 1;
648 1.1 christos break;
649 1.1 christos default:
650 1.1 christos return 1;
651 1.1 christos }
652 1.1 christos
653 1.1 christos #ifdef HAVE_TERMIOS
654 1.1 christos if (!newbit)
655 1.1 christos state.termios.c_cflag &= ~CSTOPB;
656 1.1 christos else
657 1.1 christos state.termios.c_cflag |= CSTOPB; /* two bits */
658 1.1 christos #endif
659 1.1 christos
660 1.1 christos #ifdef HAVE_TERMIO
661 1.1 christos if (!newbit)
662 1.1 christos state.termio.c_cflag &= ~CSTOPB;
663 1.1 christos else
664 1.1 christos state.termio.c_cflag |= CSTOPB; /* two bits */
665 1.1 christos #endif
666 1.1 christos
667 1.1 christos #ifdef HAVE_SGTTY
668 1.1 christos return 0; /* sgtty doesn't support this */
669 1.1 christos #endif
670 1.1 christos
671 1.1 christos return set_tty_state (scb, &state);
672 1.1 christos }
673 1.1 christos
674 1.5 christos /* Implement the "setparity" serial_ops callback. */
675 1.5 christos
676 1.5 christos static int
677 1.5 christos hardwire_setparity (struct serial *scb, int parity)
678 1.5 christos {
679 1.5 christos struct hardwire_ttystate state;
680 1.5 christos int newparity = 0;
681 1.5 christos
682 1.5 christos if (get_tty_state (scb, &state))
683 1.5 christos return -1;
684 1.5 christos
685 1.5 christos switch (parity)
686 1.5 christos {
687 1.5 christos case GDBPARITY_NONE:
688 1.5 christos newparity = 0;
689 1.5 christos break;
690 1.5 christos case GDBPARITY_ODD:
691 1.5 christos newparity = PARENB | PARODD;
692 1.5 christos break;
693 1.5 christos case GDBPARITY_EVEN:
694 1.5 christos newparity = PARENB;
695 1.5 christos break;
696 1.5 christos default:
697 1.5 christos internal_warning (__FILE__, __LINE__,
698 1.5 christos "Incorrect parity value: %d", parity);
699 1.5 christos return -1;
700 1.5 christos }
701 1.5 christos
702 1.5 christos #ifdef HAVE_TERMIOS
703 1.5 christos state.termios.c_cflag &= ~(PARENB | PARODD);
704 1.5 christos state.termios.c_cflag |= newparity;
705 1.5 christos #endif
706 1.5 christos
707 1.5 christos #ifdef HAVE_TERMIO
708 1.5 christos state.termio.c_cflag &= ~(PARENB | PARODD);
709 1.5 christos state.termio.c_cflag |= newparity;
710 1.5 christos #endif
711 1.5 christos
712 1.5 christos #ifdef HAVE_SGTTY
713 1.5 christos return 0; /* sgtty doesn't support this */
714 1.5 christos #endif
715 1.5 christos return set_tty_state (scb, &state);
716 1.5 christos }
717 1.5 christos
718 1.5 christos
719 1.1 christos static void
720 1.1 christos hardwire_close (struct serial *scb)
721 1.1 christos {
722 1.1 christos if (scb->fd < 0)
723 1.1 christos return;
724 1.1 christos
725 1.1 christos close (scb->fd);
726 1.1 christos scb->fd = -1;
727 1.1 christos }
728 1.1 christos
729 1.1 christos
731 1.1 christos
733 1.1 christos /* The hardwire ops. */
734 1.1 christos
735 1.1 christos static const struct serial_ops hardwire_ops =
736 1.1 christos {
737 1.1 christos "hardwire",
738 1.1 christos hardwire_open,
739 1.7 christos hardwire_close,
740 1.1 christos NULL,
741 1.1 christos ser_base_readchar,
742 1.1 christos ser_base_write,
743 1.1 christos hardwire_flush_output,
744 1.1 christos hardwire_flush_input,
745 1.1 christos hardwire_send_break,
746 1.1 christos hardwire_raw,
747 1.1 christos hardwire_get_tty_state,
748 1.1 christos hardwire_copy_tty_state,
749 1.1 christos hardwire_set_tty_state,
750 1.1 christos hardwire_print_tty_state,
751 1.1 christos hardwire_noflush_set_tty_state,
752 1.5 christos hardwire_setbaudrate,
753 1.1 christos hardwire_setstopbits,
754 1.1 christos hardwire_setparity,
755 1.1 christos hardwire_drain_output,
756 1.1 christos ser_base_async,
757 1.1 christos ser_unix_read_prim,
758 1.1 christos ser_unix_write_prim
759 1.1 christos };
760 1.1 christos
761 1.1 christos void
762 1.1 christos _initialize_ser_hardwire (void)
763 1.1 christos {
764 1.1 christos serial_add_interface (&hardwire_ops);
765 1.1 christos
766 1.1 christos #ifdef HAVE_TERMIOS
767 1.1 christos #ifdef CRTSCTS
768 1.1 christos add_setshow_boolean_cmd ("remoteflow", no_class,
769 1.1 christos &serial_hwflow, _("\
770 1.1 christos Set use of hardware flow control for remote serial I/O."), _("\
771 1.1 christos Show use of hardware flow control for remote serial I/O."), _("\
772 1.1 christos Enable or disable hardware flow control (RTS/CTS) on the serial port\n\
773 1.1 christos when debugging using remote targets."),
774 1.1 christos NULL,
775 1.1 christos show_serial_hwflow,
776 1.1 christos &setlist, &showlist);
777 1.1 christos #endif
778 1.1 christos #endif
779 1.1 christos }
780 1.1 christos
781 1.1 christos int
782 1.6 christos ser_unix_read_prim (struct serial *scb, size_t count)
783 1.1 christos {
784 1.1 christos return read (scb->fd, scb->buf, count);
785 1.1 christos }
786 1.1 christos
787 1.1 christos int
788 1.1 christos ser_unix_write_prim (struct serial *scb, const void *buf, size_t len)
789 1.1 christos {
790 return write (scb->fd, buf, len);
791 }
792