summaryrefslogtreecommitdiff
path: root/src/jtag
diff options
context:
space:
mode:
Diffstat (limited to 'src/jtag')
-rw-r--r--src/jtag/zy1000/jtag_minidriver.h4
-rw-r--r--src/jtag/zy1000/zy1000.c22
2 files changed, 26 insertions, 0 deletions
diff --git a/src/jtag/zy1000/jtag_minidriver.h b/src/jtag/zy1000/jtag_minidriver.h
index d556699a..f3fe5a6a 100644
--- a/src/jtag/zy1000/jtag_minidriver.h
+++ b/src/jtag/zy1000/jtag_minidriver.h
@@ -48,6 +48,7 @@ extern uint32_t zy1000_tcpin(uint32_t address);
+#if BUILD_ECOSBOARD
// FIFO empty?
static __inline__ void waitIdle(void)
{
@@ -57,6 +58,9 @@ static __inline__ void waitIdle(void)
ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, empty);
} while ((empty & 0x100) == 0);
}
+#else
+extern void waitIdle(void);
+#endif
static __inline__ void waitQueue(void)
{
diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c
index a1104ef4..97c94f7c 100644
--- a/src/jtag/zy1000/zy1000.c
+++ b/src/jtag/zy1000/zy1000.c
@@ -1107,6 +1107,7 @@ enum ZY1000_CMD
ZY1000_CMD_POKE = 0x0,
ZY1000_CMD_PEEK = 0x8,
ZY1000_CMD_SLEEP = 0x1,
+ ZY1000_CMD_WAITIDLE = 2
};
@@ -1167,6 +1168,22 @@ void zy1000_tcpout(uint32_t address, uint32_t data)
}
}
+/* By sending the wait to the server, we avoid a readback
+ * of status. Radically improves performance for this operation
+ * with long ping times.
+ */
+void waitIdle(void)
+{
+ tcpip_open();
+ if (!writeLong((ZY1000_CMD_WAITIDLE << 24)))
+ {
+ fprintf(stderr, "Could not write to zy1000 server\n");
+ exit(-1);
+ }
+}
+
+
+
uint32_t zy1000_tcpin(uint32_t address)
{
tcpip_open();
@@ -1241,6 +1258,11 @@ static void tcpipserver(void)
jtag_sleep(data);
break;
}
+ case ZY1000_CMD_WAITIDLE:
+ {
+ waitIdle();
+ break;
+ }
default:
return;
}