diff options
author | Øyvind Harboe <oyvind.harboe@zylin.com> | 2011-03-03 11:00:14 +0100 |
---|---|---|
committer | Øyvind Harboe <oyvind.harboe@zylin.com> | 2011-03-18 13:29:24 +0100 |
commit | 558f760ff06c499b4525dcb4ba731f585256dacb (patch) | |
tree | df133d701c78de32595cab32c6d77ca5046ed839 | |
parent | 4332bc32e4a65b0b5b169a143febeb02e6517f39 (diff) | |
download | openocd+libswd-558f760ff06c499b4525dcb4ba731f585256dacb.tar.gz openocd+libswd-558f760ff06c499b4525dcb4ba731f585256dacb.tar.bz2 openocd+libswd-558f760ff06c499b4525dcb4ba731f585256dacb.tar.xz openocd+libswd-558f760ff06c499b4525dcb4ba731f585256dacb.zip |
zy1000: add code to check that SRST asserts
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
-rw-r--r-- | src/jtag/zy1000/zy1000.c | 76 |
1 files changed, 42 insertions, 34 deletions
diff --git a/src/jtag/zy1000/zy1000.c b/src/jtag/zy1000/zy1000.c index 71ae6f43..f2db47b3 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); } } |