]> git.sur5r.net Git - openocd/commitdiff
svf: implement sleep for RUNTEST min_time
authorJon Povey <jon.povey@racelogic.co.uk>
Sun, 2 Jan 2011 14:52:48 +0000 (23:52 +0900)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Sun, 2 Jan 2011 19:02:16 +0000 (20:02 +0100)
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)

src/svf/svf.c

index a6f2f6f31235075ee4aa2efb074036fdfd7596a1..53994a2d13cc5294437078120fb6150f5f2afd7b 100644 (file)
@@ -1478,47 +1478,45 @@ static int svf_run_command(struct command_context *cmd_ctx, char *cmd_str)
                        }
                        i += 2;
                }
-               // calculate run_count
-               if ((0 == run_count) && (min_time > 0))
-               {
-                       run_count = min_time * svf_para.frequency;
-               }
+
                // all parameter should be parsed
                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
-                               /* FIXME handle statemove failures */
-                               int retval;
+                       /* FIXME handle statemove failures */
+                       int retval;
+                       uint32_t min_usec = 1000000 * min_time;
 
-                               // enter into run_state if necessary
-                               if (cmd_queue_cur_state != svf_para.runtest_run_state)
-                               {
-                                       retval = svf_add_statemove(svf_para.runtest_run_state);
-                               }
+                       // enter into run_state if necessary
+                       if (cmd_queue_cur_state != svf_para.runtest_run_state)
+                       {
+                               retval = svf_add_statemove(svf_para.runtest_run_state);
+                       }
 
-                               // call jtag_add_clocks
+                       // add clocks and/or min wait
+                       if (run_count > 0) {
                                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);
-                               }
+                       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;
-                               }
+                       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);
+                       jtag_add_runtest(run_count, svf_para.runtest_end_state);
 #endif
-                       }
                }
                else
                {