jtag_registers: Avalon bridge flushing tweaks
authorØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 17 Nov 2009 10:03:55 +0000 (11:03 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 17 Nov 2009 14:39:05 +0000 (15:39 +0100)
The code is now much more explicit. It flushes every
N writes. For now flush every time, but tinkering with
the bridge FIFO size and how often we flush clearly
points in the direction of the Avalon write FIFO full
being the culprit.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
src/jtag/zy1000/jtag_minidriver.h

index 3fe16ef3d275f6f03081db52724ed89e943f1aa0..afbea13a4509ebd3dddbbceffe0a9ad22a78825d 100644 (file)
@@ -30,8 +30,19 @@ int  diag_printf(const char *fmt, ...);
 #define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b); diag_printf("poke 0x%08x,0x%08x\n", a, b)
 #define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b); diag_printf("peek 0x%08x = 0x%08x\n", a, b)
 #else
-#define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b)
 #define ZY1000_PEEK(a, b) HAL_READ_UINT32(a, b)
+#define ZY1000_POKE(a, b) HAL_WRITE_UINT32(a, b);\
+ {/* This will flush the bridge FIFO. Overflowed bridge FIFO fails. We must \
+ flush every "often". No precise system has been found, but 4 seems solid. \
+  */ \
+ static int overflow_counter = 0; \
+   if (++overflow_counter >= 1) \
+   { \
+          /* clear FIFO */ \
+          cyg_uint32 empty; ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, empty); \
+          overflow_counter = 0; \
+   } \
+ }
 #endif
 
 // FIFO empty?