{
[JTAG_TRST_ASSERTED] = "JTAG controller reset (TLR or TRST)",
[JTAG_TAP_EVENT_ENABLE] = "TAP enabled",
+ [JTAG_TAP_EVENT_POST_RESET] = "post reset",
[JTAG_TAP_EVENT_DISABLE] = "TAP disabled",
};
void jtag_add_ir_scan(int in_num_fields, scan_field_t *in_fields, tap_state_t state)
{
+ assert(state != TAP_RESET);
+
if (jtag_verify && jtag_verify_capture_ir)
{
/* 8 x 32 bit id's is enough for all invocations */
void jtag_add_plain_ir_scan(int in_num_fields, const scan_field_t *in_fields,
tap_state_t state)
{
+ assert(state != TAP_RESET);
+
jtag_prelude(state);
int retval = interface_jtag_add_plain_ir_scan(
void jtag_add_dr_scan(int in_num_fields, const scan_field_t *in_fields,
tap_state_t state)
{
+ assert(state != TAP_RESET);
+
jtag_prelude(state);
int retval;
void jtag_add_plain_dr_scan(int in_num_fields, const scan_field_t *in_fields,
tap_state_t state)
{
+ assert(state != TAP_RESET);
+
jtag_prelude(state);
int retval;
int num_fields, const int* num_bits, const uint32_t* value,
tap_state_t end_state)
{
+ assert(end_state != TAP_RESET);
+
assert(end_state != TAP_INVALID);
cmd_queue_cur_state = end_state;
{
jtag_prelude(TAP_RESET);
jtag_set_error(interface_jtag_add_tlr());
+
+ jtag_notify_reset();
+
jtag_call_event_callbacks(JTAG_TRST_ASSERTED);
}
LOG_DEBUG("TRST line released");
if (jtag_ntrst_delay)
jtag_add_sleep(jtag_ntrst_delay * 1000);
+
+ jtag_notify_reset();
}
}
}
for (unsigned i = 0; i < JTAG_MAX_CHAIN_SIZE; i++)
buf_set_u32(idcode_buffer, i * 32, 32, 0x000000FF);
- jtag_add_plain_dr_scan(1, &field, TAP_RESET);
+ jtag_add_plain_dr_scan(1, &field, TAP_DRPAUSE);
+ jtag_add_tlr();
return jtag_execute_queue();
}
field.in_value = ir_test;
- jtag_add_plain_ir_scan(1, &field, TAP_RESET);
+ jtag_add_plain_ir_scan(1, &field, TAP_IRPAUSE);
+ jtag_add_tlr();
+
int retval;
retval = jtag_execute_queue();
if (retval != ERROR_OK)
JTAG_TRST_ASSERTED,
JTAG_TAP_EVENT_ENABLE,
JTAG_TAP_EVENT_DISABLE,
+ JTAG_TAP_EVENT_POST_RESET,
};
struct jtag_tap_event_action_s
/// @returns the number of times the scan queue has been flushed
int jtag_get_flush_queue_count(void);
+/// Notify all TAP's about a TLR reset
+void jtag_notify_reset(void);
+
/* can be implemented by hw + sw */
extern int jtag_power_dropout(int* dropout);
#endif
static const Jim_Nvp nvp_jtag_tap_event[] = {
+ { .value = JTAG_TAP_EVENT_POST_RESET, .name = "post-reset" },
{ .value = JTAG_TAP_EVENT_ENABLE, .name = "tap-enable" },
{ .value = JTAG_TAP_EVENT_DISABLE, .name = "tap-disable" },
return JIM_ERR;
}
+
+void jtag_notify_reset(void)
+{
+ jtag_tap_t *tap;
+ for (tap = jtag_all_taps(); tap; tap = tap->next_tap)
+ {
+ jtag_tap_handle_event(tap, JTAG_TAP_EVENT_POST_RESET);
+ }
+}
+
+
int jtag_register_commands(struct command_context_s *cmd_ctx)
{
register_jim(cmd_ctx, "jtag", jim_jtag_command, "perform jtag tap actions");