Browse Source

zy1000: add code to check that SRST asserts

Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
tags/v0.5.0-rc1
Øyvind Harboe 13 years ago
parent
commit
558f760ff0
1 changed files with 42 additions and 34 deletions
  1. +42
    -34
      src/jtag/zy1000/zy1000.c

+ 42
- 34
src/jtag/zy1000/zy1000.c View File

@@ -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);
}
}



Loading…
Cancel
Save