summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit558f760ff06c499b4525dcb4ba731f585256dacb (patch)
treedf133d701c78de32595cab32c6d77ca5046ed839
parent4332bc32e4a65b0b5b169a143febeb02e6517f39 (diff)
downloadopenocd+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.c76
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);
}
}