zy1000: wait for srst to deassert

make wait for srst deassert more long latency friendly
(JTAG over TCP/IP), print actual time if it was more than
1ms.

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
__archive__
Øyvind Harboe 2010-05-04 07:36:05 +02:00
parent fe60480b7a
commit 32e647acf4
1 changed files with 27 additions and 13 deletions

View File

@ -49,6 +49,7 @@
#include <jtag/minidriver.h> #include <jtag/minidriver.h>
#include <jtag/interface.h> #include <jtag/interface.h>
#include <time.h> #include <time.h>
#include <helper/time_support.h>
#include <netinet/tcp.h> #include <netinet/tcp.h>
@ -176,28 +177,41 @@ void zy1000_reset(int trst, int srst)
} }
/* wait for srst to float back up */ /* wait for srst to float back up */
if (!srst) if ((!srst && ((jtag_get_reset_config() & RESET_TRST_PULLS_SRST) == 0))||
(!srst && !trst && (jtag_get_reset_config() & RESET_TRST_PULLS_SRST)))
{ {
int i; bool first = true;
for (i = 0; i < 1000; i++) long long start;
{ long total = 0;
for (;;)
{
// We don't want to sense our own reset, so we clear here. // We don't want to sense our own reset, so we clear here.
// There is of course a timing hole where we could loose // There is of course a timing hole where we could loose
// a "real" reset. // a "real" reset.
if (!readSRST()) if (!readSRST())
{
if (total > 1)
{
LOG_USER("SRST took %dms to deassert", (int)total);
}
break; break;
}
/* wait 1ms */ if (first)
alive_sleep(1); {
first = false;
start = timeval_ms();
}
total = timeval_ms() - start;
if (total > 5000)
{
LOG_ERROR("SRST took too long to deassert: %dms", (int)total);
break;
}
} }
if (i == 1000)
{
LOG_USER("SRST didn't deassert after %dms", i);
} else if (i > 1)
{
LOG_USER("SRST took %dms to deassert", i);
}
} }
} }