This commit was generated by cvs2svn to track changes on a CVS vendor
[platform/upstream/binutils.git] / gdb / ser-ocd.c
index 1bded76..733d692 100644 (file)
@@ -1,7 +1,7 @@
 /* Remote serial interface for Macraigor Systems implementation of
-       On-Chip Debugging using serial target box or serial wiggler
+   On-Chip Debugging using serial target box or serial wiggler
 
-   Copyright 1994, 1997 Free Software Foundation, Inc.
+   Copyright 1994, 1997, 1999, 2000 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include "defs.h"
 #include "serial.h"
 
-static int ser_ocd_open PARAMS ((serial_t scb, const char *name));
-static void ser_ocd_raw PARAMS ((serial_t scb));
-static int ser_ocd_readchar PARAMS ((serial_t scb, int timeout));
-static int ser_ocd_setbaudrate PARAMS ((serial_t scb, int rate));
-static int ser_ocd_write PARAMS ((serial_t scb, const char *str, int len));
-static void ser_ocd_close PARAMS ((serial_t scb));
-static serial_ttystate ser_ocd_get_tty_state PARAMS ((serial_t scb));
-static int ser_ocd_set_tty_state PARAMS ((serial_t scb, serial_ttystate state));
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#ifdef _WIN32
+/* On Windows, this function pointer is initialized to a function in
+   the wiggler DLL.  */
+static int (*dll_do_command) PARAMS ((const char *, char *));
+#endif
 
 static int
 ocd_open (scb, name)
      serial_t scb;
      const char *name;
 {
+#ifdef _WIN32
+  /* Find the wiggler DLL which talks to the board.  */
+  if (dll_do_command == NULL)
+    {
+      HINSTANCE handle;
+
+      /* FIXME: Should the user be able to configure this?  */
+      handle = LoadLibrary ("Wigglers.dll");
+      if (handle == NULL)
+       error ("Can't load Wigglers.dll");
+
+      dll_do_command = ((int (*)PARAMS ((const char *, char *)))
+                       GetProcAddress (handle, "do_command"));
+      if (dll_do_command == NULL)
+       error ("Can't find do_command function in Wigglers.dll");
+    }
+#else
+  /* No wiggler DLLs on Unix yet, fail.  */
+  error ("Wiggler library not available for this type of host.");
+#endif /* _WIN32 */
   return 0;
 }
 
@@ -56,22 +78,23 @@ ocd_raw (scb)
 /* We need a buffer to store responses from the Wigglers.dll */
 #define WIGGLER_BUFF_SIZE 512
 unsigned char from_wiggler_buffer[WIGGLER_BUFF_SIZE];
-unsigned char * wiggler_buffer_ptr;    /* curr spot in buffer */
-
-static void
-ocd_readremote ()
-{
-}
+unsigned char *wiggler_buffer_ptr;     /* curr spot in buffer */
 
 static int
 ocd_readchar (scb, timeout)
      serial_t scb;
      int timeout;
 {
-  return (int) *wiggler_buffer_ptr++; /* return curr char and increment ptr */
+  /* Catch attempts at reading past the end of the buffer */
+  if (wiggler_buffer_ptr >
+      (from_wiggler_buffer + (sizeof (char *) * WIGGLER_BUFF_SIZE)))
+      error ("ocd_readchar asked to read past the end of the buffer!");
+
+  return (int) *wiggler_buffer_ptr++;  /* return curr char and increment ptr */
 }
 
-struct ocd_ttystate {
+struct ocd_ttystate
+{
   int dummy;
 };
 
@@ -107,9 +130,9 @@ ocd_noflush_set_tty_state (scb, new_ttystate, old_ttystate)
 }
 
 static void
-ocd_print_tty_state (scb, ttystate)
-     serial_t scb;
-     serial_ttystate ttystate;
+ocd_print_tty_state (serial_t scb,
+                    serial_ttystate ttystate,
+                    struct ui_file *stream)
 {
   /* Nothing to print.  */
   return;
@@ -129,12 +152,10 @@ ocd_write (scb, str, len)
      const char *str;
      int len;
 {
-  char c;
-
-#ifdef __CYGWIN32__ 
+#ifdef _WIN32
   /* send packet to Wigglers.dll and store response so we can give it to
-       remote-wiggler.c when get_packet is run */
-  do_command (str, from_wiggler_buffer);
+     remote-wiggler.c when get_packet is run */
+  dll_do_command (str, from_wiggler_buffer);
   wiggler_buffer_ptr = from_wiggler_buffer;
 #endif
 
@@ -155,15 +176,16 @@ static struct serial_ops ocd_ops =
   ocd_close,
   ocd_readchar,
   ocd_write,
-  ocd_noop,            /* flush output */
-  ocd_noop,            /* flush input */
-  ocd_noop,            /* send break -- currently used only for nindy */
+  ocd_noop,                    /* flush output */
+  ocd_noop,                    /* flush input */
+  ocd_noop,                    /* send break -- currently used only for nindy */
   ocd_raw,
   ocd_get_tty_state,
   ocd_set_tty_state,
   ocd_print_tty_state,
   ocd_noflush_set_tty_state,
   ocd_setbaudrate,
+  ocd_noop,                    /* wait for output to drain */
 };
 
 void
@@ -171,9 +193,3 @@ _initialize_ser_ocd_bdm ()
 {
   serial_add_interface (&ocd_ops);
 }
-
-
-
-
-
-