/// The number of JTAG queue flushes (for profiling and debugging purposes).
static int jtag_flush_queue_count;
+// Sleep this # of ms after flushing the queue
+static int jtag_flush_queue_sleep = 0;
+
static void jtag_add_scan_check(struct jtag_tap *active,
void (*jtag_add_scan)(struct jtag_tap *active, int in_num_fields, const struct scan_field *in_fields, tap_state_t state),
int in_num_fields, struct scan_field *in_fields, tap_state_t state);
/* configuration */
struct jtag_interface *jtag_interface = NULL;
+void jtag_set_flush_queue_sleep(int ms)
+{
+ jtag_flush_queue_sleep = ms;
+}
+
void jtag_set_error(int error)
{
if ((error == ERROR_OK) || (jtag_error != ERROR_OK))
{
jtag_flush_queue_count++;
jtag_set_error(interface_jtag_execute_queue());
+
+ if (jtag_flush_queue_sleep > 0)
+ {
+ /* For debug purposes it can be useful to test performance
+ * or behavior when delaying after flushing the queue,
+ * e.g. to simulate long roundtrip times.
+ */
+ usleep(jtag_flush_queue_sleep * 1000);
+ }
}
int jtag_get_flush_queue_count(void)
case ERROR_OK:
/* complete success */
break;
- case ERROR_JTAG_INIT_SOFT_FAIL:
+ default:
/* For backward compatibility reasons, try coping with
* configuration errors involving only ID mismatches.
* We might be able to talk to the devices.
+ *
+ * Also the device might be powered down during startup.
+ *
+ * After OpenOCD starts, we can try to power on the device
+ * and run a reset.
*/
LOG_ERROR("Trying to use configured scan chain anyway...");
issue_setup = false;
break;
- default:
- /* some hard error; already issued diagnostics */
- return retval;
}
/* Now look at IR values. Problems here will prevent real
*/
retval = jtag_validate_ircapture();
if (retval != ERROR_OK)
- return retval;
+ {
+ /* The target might be powered down. The user
+ * can power it up and reset it after firing
+ * up OpenOCD.
+ */
+ issue_setup = false;
+ }
if (issue_setup)
jtag_notify_event(JTAG_TAP_EVENT_SETUP);
int jtag_get_speed(void)
{
- int speed;
+ int speed = 0; /* avoid -O3 warning */
switch(clock_mode)
{
case CLOCK_MODE_SPEED: