From 558f760ff06c499b4525dcb4ba731f585256dacb Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Harboe?= Date: Thu, 3 Mar 2011 11:00:14 +0100 Subject: [PATCH] zy1000: add code to check that SRST asserts MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Øyvind Harboe --- src/jtag/zy1000/zy1000.c | 76 ++++++++++++++++++++++------------------ 1 file changed, 42 insertions(+), 34 deletions(-) diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index 71ae6f4374..f2db47b3ad 100644 --- a/src/jtag/zy1000/zy1000.c +++ b/src/jtag/zy1000/zy1000.c @@ -172,6 +172,45 @@ static int zy1000_power_dropout(int *dropout) return ERROR_OK; } +/* Wait for SRST to assert or deassert */ +static void waitSRST(bool asserted) +{ + bool first = true; + long long start = 0; + long total = 0; + const char *mode = asserted ? "assert" : "deassert"; + + for (;;) + { + bool srstAsserted = readSRST(); + if ( (asserted && srstAsserted) || (!asserted && !srstAsserted) ) + { + if (total > 1) + { + LOG_USER("SRST took %dms to %s", (int)total, mode); + } + break; + } + + if (first) + { + first = false; + start = timeval_ms(); + } + + total = timeval_ms() - start; + + keep_alive(); + + if (total > 5000) + { + LOG_ERROR("SRST took too long to %s: %dms", mode, (int)total); + break; + } + } +} + + void zy1000_reset(int trst, int srst) { LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst); @@ -192,6 +231,8 @@ void zy1000_reset(int trst, int srst) * idle in TAP_IDLE, reset halt on str912 will fail. */ ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000001); + + waitSRST(true); } if (!trst) @@ -218,40 +259,7 @@ void zy1000_reset(int trst, int srst) if ((!srst && ((jtag_get_reset_config() & RESET_TRST_PULLS_SRST) == 0))|| (!srst && !trst && (jtag_get_reset_config() & RESET_TRST_PULLS_SRST))) { - bool first = true; - long long start = 0; - long total = 0; - for (;;) - { - // We don't want to sense our own reset, so we clear here. - // There is of course a timing hole where we could loose - // a "real" reset. - if (!readSRST()) - { - if (total > 1) - { - LOG_USER("SRST took %dms to deassert", (int)total); - } - break; - } - - if (first) - { - first = false; - start = timeval_ms(); - } - - total = timeval_ms() - start; - - keep_alive(); - - if (total > 5000) - { - LOG_ERROR("SRST took too long to deassert: %dms", (int)total); - break; - } - } - + waitSRST(false); } } -- 2.30.2