zy1000: add code to check that SRST asserts
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
This commit is contained in:
parent
4332bc32e4
commit
558f760ff0
|
@ -172,6 +172,45 @@ static int zy1000_power_dropout(int *dropout)
|
||||||
return ERROR_OK;
|
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)
|
void zy1000_reset(int trst, int srst)
|
||||||
{
|
{
|
||||||
LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, 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.
|
* idle in TAP_IDLE, reset halt on str912 will fail.
|
||||||
*/
|
*/
|
||||||
ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000001);
|
ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000001);
|
||||||
|
|
||||||
|
waitSRST(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!trst)
|
if (!trst)
|
||||||
|
@ -218,40 +259,7 @@ void zy1000_reset(int trst, int srst)
|
||||||
if ((!srst && ((jtag_get_reset_config() & RESET_TRST_PULLS_SRST) == 0))||
|
if ((!srst && ((jtag_get_reset_config() & RESET_TRST_PULLS_SRST) == 0))||
|
||||||
(!srst && !trst && (jtag_get_reset_config() & RESET_TRST_PULLS_SRST)))
|
(!srst && !trst && (jtag_get_reset_config() & RESET_TRST_PULLS_SRST)))
|
||||||
{
|
{
|
||||||
bool first = true;
|
waitSRST(false);
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue