* infptrace.c (child_resume): Don't try to step if
[deliverable/binutils-gdb.git] / gdb / ocd.c
index 721ae3fff72b3f45e8bb7f9ec2c88b4ff8ecdba1..268d7bbf9b4366f33173e782d11f08673cae6333 100644 (file)
--- a/gdb/ocd.c
+++ b/gdb/ocd.c
@@ -74,9 +74,10 @@ static int last_run_status;
    other form of hairy serial connection, I would think 2 seconds would
    be plenty.  */
 
-/* Changed to allow option to set timeout value.
-   was static int remote_timeout = 2; */
-extern int remote_timeout;
+/* FIXME: Change to allow option to set timeout value on a per target
+   basis.
+
+static int remote_timeout = 2;
 
 /* Descriptor for I/O to remote machine.  Initialize it to NULL so that
    ocd_open knows that we don't have a file open when the program
@@ -196,9 +197,12 @@ ocd_start_remote (dummy)
     ocd_stop ();
 
 #if 1
+  /* When using a target box, we want to asynchronously return status when
+     target stops.  The OCD_SET_CTL_FLAGS command is ignored by Wigglers.dll
+     when using a parallel Wiggler */
   buf[0] = OCD_SET_CTL_FLAGS;
   buf[1] = 0;
-  buf[2] = 1;          /* Asynchronously return status when target stops */
+  buf[2] = 1;
   ocd_put_packet (buf, 3);
 
   p = ocd_get_packet (buf[0], &pktlen, remote_timeout);
@@ -446,37 +450,38 @@ int
 ocd_wait ()
 {
   unsigned char *p;
-  int error_code, status;
+  int error_code;
   int pktlen;
+  char buf[1];
 
   ocd_interrupt_flag = 0;
 
-  /* Target may already be stopped by the time we get here. */
+  /* Target might already be stopped by the time we get here. */
+  /* If we aren't already stopped, we need to loop until we've dropped
+     back into BDM mode */
 
-  if (!(last_run_status & OCD_FLAG_BDM))
+  while (!(last_run_status & OCD_FLAG_BDM))
     {
-      ofunc = (void (*)()) signal (SIGINT, ocd_interrupt);
-
+      buf[0] = OCD_AYT;
+      ocd_put_packet (buf, 1);
       p = ocd_get_packet (OCD_AYT, &pktlen, -1);
 
+      ofunc = (void (*)()) signal (SIGINT, ocd_interrupt);
       signal (SIGINT, ofunc);
 
       if (pktlen < 2)
        error ("Truncated response packet from OCD device");
 
-      status = p[1];
+      last_run_status = p[1];
       error_code = p[2];
 
       if (error_code != 0)
        ocd_error ("target_wait:", error_code);
 
-      if (status & OCD_FLAG_PWF)
+      if (last_run_status & OCD_FLAG_PWF)
        error ("OCD device lost VCC at BDM interface.");
-      else if (status & OCD_FLAG_CABLE_DISC)
-       error ("BDM cable appears to have been disconnected.");
-
-      if (!(status & OCD_FLAG_BDM))
-       error ("OCD device woke up, but wasn't stopped: 0x%x", status);
+      else if (last_run_status & OCD_FLAG_CABLE_DISC)
+       error ("OCD device cable appears to have been disconnected.");
     }
 
   if (ocd_interrupt_flag)
@@ -1030,15 +1035,13 @@ ocd_get_packet (cmd, lenp, timeout)
   unsigned char *packet_ptr;
   unsigned char checksum;
 
- find_packet:
-
   ch = readchar (timeout);
 
   if (ch < 0)
     error ("ocd_get_packet (readchar): %d", ch);
 
   if (ch != 0x55)
-    goto find_packet;
+    error ("ocd_get_packet (readchar): %d", ch);
 
 /* Found the start of a packet */
 
@@ -1129,8 +1132,7 @@ ocd_get_packet (cmd, lenp, timeout)
          len = 257;
          break;
        default:
-         fprintf_filtered (gdb_stderr, "Unknown packet type 0x%x\n", ch);
-         goto find_packet;
+         error ("ocd_get_packet: unknown packet type 0x%x\n", ch);
        }
     }
 
@@ -1158,7 +1160,7 @@ ocd_get_packet (cmd, lenp, timeout)
     }
 
   if (checksum != 0)
-    goto find_packet;
+    error ("ocd_get_packet: bad packet checksum");
 
   if (cmd != -1 && cmd != packet[0])
     error ("Response phase error.  Got 0x%x, expected 0x%x", packet[0], cmd);
This page took 0.034837 seconds and 4 git commands to generate.