#include "jtag.h"
#include "interface.h"
-#include "transport.h"
+#include <transport/transport.h>
#ifdef HAVE_STRINGS_H
#include <strings.h>
static int speed_khz = 0;
/* speed to fallback to when RCLK is requested but not supported */
static int rclk_fallback_speed_khz = 0;
-static enum {CLOCK_MODE_SPEED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode;
+static enum {CLOCK_MODE_UNSELECTED, CLOCK_MODE_KHZ, CLOCK_MODE_RCLK} clock_mode;
static int jtag_speed = 0;
static struct jtag_interface *jtag = NULL;
if (callback == NULL)
{
- return ERROR_INVALID_ARGUMENTS;
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
if (*callbacks_p)
if (callback == NULL)
{
- return ERROR_INVALID_ARGUMENTS;
+ return ERROR_COMMAND_SYNTAX_ERROR;
}
while (*p)
cmd_queue_cur_state = state;
}
-void jtag_alloc_in_value32(struct scan_field *field)
-{
- interface_jtag_alloc_in_value32(field);
-}
-
void jtag_add_ir_scan_noverify(struct jtag_tap *active, const struct scan_field *in_fields,
tap_state_t state)
{
jtag_add_ir_scan_noverify(active, in_fields, state);
}
+/* If fields->in_value is filled out, then the captured IR value will be checked */
void jtag_add_ir_scan(struct jtag_tap *active, struct scan_field *in_fields, tap_state_t state)
{
assert(state != TAP_RESET);
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)
{
- for (int i = 0; i < in_num_fields; i++)
- {
- struct scan_field *field = &in_fields[i];
- field->allocated = 0;
- field->modified = 0;
- if (field->check_value || field->in_value)
- continue;
- interface_jtag_add_scan_check_alloc(field);
- field->modified = 1;
- }
-
jtag_add_scan(active, in_num_fields, in_fields, state);
for (int i = 0; i < in_num_fields; i++)
(jtag_callback_data_t)in_fields[i].check_mask,
(jtag_callback_data_t)in_fields[i].num_bits);
}
- if (in_fields[i].allocated)
- {
- free(in_fields[i].in_value);
- }
- if (in_fields[i].modified)
- {
- in_fields[i].in_value = NULL;
- }
}
}
return ERROR_OK;
}
+/* sleep at least us microseconds. When we sleep more than 1000ms we
+ * do an alive sleep, i.e. keep GDB alive. Note that we could starve
+ * GDB if we slept for <1000ms many times.
+ */
void jtag_sleep(uint32_t us)
{
- alive_sleep(us/1000);
+ if (us < 1000)
+ usleep(us);
+ else
+ alive_sleep((us+999)/1000);
}
/* Maximum number of enabled JTAG devices we expect in the scan chain,
return ERROR_JTAG_INVALID_INTERFACE;
}
- jtag = jtag_interface;
- if (jtag_interface->init() != ERROR_OK)
+ int retval;
+ retval = jtag_interface->init();
+ if (retval != ERROR_OK)
{
- jtag = NULL;
- return ERROR_JTAG_INIT_FAILED;
+ return retval;
}
+ jtag = jtag_interface;
/* LEGACY SUPPORT ... adapter drivers must declare what
* transports they allow. Until they all do so, assume
LOG_ERROR("Adapter driver '%s' did not declare "
"which transports it allows; assuming "
"JTAG-only", jtag->name);
- int retval = allow_transports(cmd_ctx, jtag_only);
+ retval = allow_transports(cmd_ctx, jtag_only);
if (retval != ERROR_OK)
return retval;
}
+ if (CLOCK_MODE_UNSELECTED == clock_mode)
+ {
+ LOG_ERROR("An adapter speed is not selected in the init script."
+ " Insert a call to adapter_khz or jtag_rclk to proceed.");
+ return ERROR_JTAG_INIT_FAILED;
+ }
+
int requested_khz = jtag_get_speed_khz();
int actual_khz = requested_khz;
- int jtag_speed_var;
- int retval = jtag_get_speed(&jtag_speed_var);
+ int jtag_speed_var = 0;
+ retval = jtag_get_speed(&jtag_speed_var);
+ if (retval != ERROR_OK)
+ return retval;
+ retval = jtag->speed(jtag_speed_var);
if (retval != ERROR_OK)
return retval;
retval = jtag_get_speed_readable(&actual_khz);
{
switch(clock_mode)
{
- case CLOCK_MODE_SPEED:
- *speed = jtag_speed;
- break;
case CLOCK_MODE_KHZ:
adapter_khz_to_speed(jtag_get_speed_khz(), speed);
break;
int jtag_get_speed_readable(int *khz)
{
- int jtag_speed_var;
+ int jtag_speed_var = 0;
int retval = jtag_get_speed(&jtag_speed_var);
if (retval != ERROR_OK)
return retval;