set/show remotestopbits

Mark Salter
2001-09-26T05:35:00Z

(Once more with ChangeLog)

I have a target board with a stub and a serial port that is fixed
at 2 stopbits, so I need a way to tell gdb to use something other
than the default 1.

--Mark

2001-09-26 Mark Salter <msalter@redhat.com>

* cli/cli-cmds.c: Add support for set/show remotestopbits.
* top.c: Add stop_bits declaration.
* target.h: Add extern declaration for stop_bits.
* remote.c: Set serial stopbits as necessary.

Index: remote.c
===================================================================
RCS file: /cvs/src/src/gdb/remote.c,v
retrieving revision 1.62
diff -u -p -5 -r1.62 remote.c
--- remote.c 2001/08/10 09:59:32 1.62
+++ remote.c 2001/09/26 12:14:55
@@ -2159,10 +2159,13 @@ serial device is attached to the remote
serial_close (remote_desc);
perror_with_name (name);
}
}

+ if (stop_bits != -1)
+ serial_setstopbits (remote_desc, stop_bits);
+
serial_raw (remote_desc);

/* If there is something sitting in the buffer we might take it as a
response to a command, which would be bad. */
serial_flush_input (remote_desc);
@@ -2255,10 +2258,13 @@ serial device is attached to the remote
{
serial_close (remote_desc);
perror_with_name (name);
}
}
+
+ if (stop_bits != -1)
+ serial_setstopbits (remote_desc, stop_bits);

serial_raw (remote_desc);

/* If there is something sitting in the buffer we might take it as a
response to a command, which would be bad. */
Index: target.h
===================================================================
RCS file: /cvs/src/src/gdb/target.h,v
retrieving revision 1.20
diff -u -p -5 -r1.20 target.h
--- target.h 2001/08/11 00:59:29 1.20
+++ target.h 2001/09/26 12:14:57
@@ -1209,10 +1209,13 @@ extern void remove_target_sections (bfd
information (higher values, more information). */
extern int remote_debug;

/* Speed in bits per second, or -1 which means don't mess with the speed. */
extern int baud_rate;
+/* Number of stop bits (as defined in serial.h), or -1 which means don't
+ mess with the stopbits. */
+extern int stop_bits;
/* Timeout limit for response from target. */
extern int remote_timeout;

\f
/* Functions for helping to write a native target. */
Index: top.c
===================================================================
RCS file: /cvs/src/src/gdb/top.c,v
retrieving revision 1.45
diff -u -p -5 -r1.45 top.c
--- top.c 2001/09/07 21:33:08 1.45
+++ top.c 2001/09/26 12:14:57
@@ -133,10 +133,14 @@ int server_command;
/* FIXME: This means that "show remotebaud" and gr_files_info can print -1
or (unsigned int)-1. This is a Bad User Interface. */

int baud_rate = -1;

+/* Stop bits for talking to serial target systems. Default
+ is left as -1, so targets can choose their own defaults. */
+int stop_bits = -1;
+
/* Timeout limit for response from target. */

/* The default value has been changed many times over the years. It
was originally 5 seconds. But that was thought to be a long time
to sit and wait, so it was changed to 2 seconds. That was thought
Index: cli/cli-cmds.c
===================================================================
RCS file: /cvs/src/src/gdb/cli/cli-cmds.c,v
retrieving revision 1.10
diff -u -p -5 -r1.10 cli-cmds.c
--- cli-cmds.c 2001/09/01 21:38:05 1.10
+++ cli-cmds.c 2001/09/26 12:14:57
@@ -22,10 +22,11 @@
#include "completer.h"
#include "target.h" /* For baud_rate, remote_debug and remote_timeout */
#include "gdb_wait.h" /* For shell escape implementation */
#include "gdb_regex.h" /* Used by apropos_command */
#include "filenames.h" /* for DOSish file names */
+#include "serial.h"

#ifdef UI_OUT
#include "ui-out.h"
#endif

@@ -78,10 +79,12 @@ static void show_user (char *, int);
static void make_command (char *, int);

static void shell_escape (char *, int);

void apropos_command (char *, int);
+
+static void set_stopbits_command (char *, int);
\f
/* Define all cmd_list_elements. */

/* Chain containing all defined commands. */

@@ -160,10 +163,17 @@ struct cmd_list_element *setdebuglist;
struct cmd_list_element *showdebuglist;

struct cmd_list_element *setchecklist;

struct cmd_list_element *showchecklist;
+
+/* The "set remotestopbits" command put stuff in this buffer.
+ This is to make it work as set/show commands. The user's
+ string is copied here, then the set_* commands look at it
+ and update it to something that looks nice when it is
+ printed out. */
+static char *stop_bits_str;
\f
/* Utility used everywhere when at least one argument is needed and
none is supplied. */

void
@@ -554,10 +564,46 @@ apropos_command (char *searchstr, int fr
regerror(regcomp(&pattern,searchstr,REG_ICASE),NULL,errorbuffer,512);
error("Error in regular expression:%s",errorbuffer);
}
xfree (pattern_fastmap);
}
+
+/* Set command. Change the setting for type checking. */
+static void
+set_stopbits_command (char *ignore, int from_tty)
+{
+ if (STREQ (stop_bits_str, "1"))
+ stop_bits = SERIAL_1_STOPBITS;
+ else if (STREQ (stop_bits_str, "1.5"))
+ stop_bits = SERIAL_1_AND_A_HALF_STOPBITS;
+ else if (STREQ (stop_bits_str, "2"))
+ stop_bits = SERIAL_2_STOPBITS;
+ else if (STREQ (stop_bits_str, "default"))
+ stop_bits = -1;
+ else
+ {
+ warning ("Unrecognized stopbits value: \"%s\"", stop_bits_str);
+ /* change stop_bits_str to match previous value. */
+ xfree (stop_bits_str);
+ switch (stop_bits)
+ {
+ case SERIAL_1_STOPBITS:
+ stop_bits_str = xstrdup ("1");
+ break;
+ case SERIAL_1_AND_A_HALF_STOPBITS:
+ stop_bits_str = xstrdup ("1.5");
+ break;
+ case SERIAL_2_STOPBITS:
+ stop_bits_str = xstrdup ("2");
+ break;
+ default:
+ stop_bits = -1;
+ stop_bits_str = xstrdup ("default");
+ break;
+ }
+ }
+}
\f
static void
set_debug (char *arg, int from_tty)
{
printf_unfiltered ("\"set debug\" must be followed by the name of a print subcommand.\n");
@@ -734,10 +780,18 @@ is used, the same rules apply to its nes
var_zinteger, (char *) &baud_rate,
"Set baud rate for remote serial I/O.\n\
This value is used to set the speed of the serial port when debugging\n\
using remote targets.", &setlist),
&showlist);
+
+ c = add_set_cmd ("remotestopbits", no_class, var_string_noescape,
+ (char *) &stop_bits_str,
+ "Set number of stopbits for remote serial I/O.\n\
+Valid values are 1, 1.5, and 2.", &setlist);
+ c->function.cfunc = set_stopbits_command;
+ add_show_from_set (c, &showlist);
+ stop_bits_str = xstrdup ("default");

c = add_set_cmd ("remotedebug", no_class, var_zinteger,
(char *) &remote_debug,
"Set debugging of remote protocol.\n\
When enabled, each packet sent or received with the remote target\n\