svf: implement sleep for RUNTEST min_time
Signed-off-by: Jon Povey <jon.povey@racelogic.co.uk> min_time was effectively ignored, I needed it to program a Lattice MachXO which uses a RUNTEST to wait for an erase operation, amongst other things. With this patch pauses happen and I can program the device with an SVF generated in LSC ispVM (with "Rev D Standard" checked to suppress nonstandard LOOP statements)
This commit is contained in:
parent
18a5a46bd9
commit
d356034f03
|
@ -1478,47 +1478,45 @@ static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str)
|
||||||
}
|
}
|
||||||
i += 2;
|
i += 2;
|
||||||
}
|
}
|
||||||
// calculate run_count
|
|
||||||
if ((0 == run_count) && (min_time > 0))
|
|
||||||
{
|
|
||||||
run_count = min_time * svf_para.frequency;
|
|
||||||
}
|
|
||||||
// all parameter should be parsed
|
// all parameter should be parsed
|
||||||
if (i == num_of_argu)
|
if (i == num_of_argu)
|
||||||
{
|
{
|
||||||
if (run_count > 0)
|
|
||||||
{
|
|
||||||
// run_state and end_state is checked to be stable state
|
|
||||||
// TODO: do runtest
|
|
||||||
#if 1
|
#if 1
|
||||||
/* FIXME handle statemove failures */
|
/* FIXME handle statemove failures */
|
||||||
int retval;
|
int retval;
|
||||||
|
uint32_t min_usec = 1000000 * min_time;
|
||||||
|
|
||||||
// enter into run_state if necessary
|
// enter into run_state if necessary
|
||||||
if (cmd_queue_cur_state != svf_para.runtest_run_state)
|
if (cmd_queue_cur_state != svf_para.runtest_run_state)
|
||||||
{
|
{
|
||||||
retval = svf_add_statemove(svf_para.runtest_run_state);
|
retval = svf_add_statemove(svf_para.runtest_run_state);
|
||||||
}
|
|
||||||
|
|
||||||
// call jtag_add_clocks
|
|
||||||
jtag_add_clocks(run_count);
|
|
||||||
|
|
||||||
// move to end_state if necessary
|
|
||||||
if (svf_para.runtest_end_state != svf_para.runtest_run_state)
|
|
||||||
{
|
|
||||||
retval = svf_add_statemove(svf_para.runtest_end_state);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (svf_para.runtest_run_state != TAP_IDLE)
|
|
||||||
{
|
|
||||||
LOG_ERROR("cannot runtest in %s state",
|
|
||||||
tap_state_name(svf_para.runtest_run_state));
|
|
||||||
return ERROR_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
jtag_add_runtest(run_count, svf_para.runtest_end_state);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add clocks and/or min wait
|
||||||
|
if (run_count > 0) {
|
||||||
|
jtag_add_clocks(run_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (min_usec > 0) {
|
||||||
|
jtag_add_sleep(min_usec);
|
||||||
|
}
|
||||||
|
|
||||||
|
// move to end_state if necessary
|
||||||
|
if (svf_para.runtest_end_state != svf_para.runtest_run_state)
|
||||||
|
{
|
||||||
|
retval = svf_add_statemove(svf_para.runtest_end_state);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (svf_para.runtest_run_state != TAP_IDLE)
|
||||||
|
{
|
||||||
|
LOG_ERROR("cannot runtest in %s state",
|
||||||
|
tap_state_name(svf_para.runtest_run_state));
|
||||||
|
return ERROR_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
jtag_add_runtest(run_count, svf_para.runtest_end_state);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue