Home | History | Annotate | Line # | Download | only in gdb
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