* List all TAPs that have been created.
*/
static struct jtag_tap *__jtag_all_taps;
-/**
- * The number of TAPs in the __jtag_all_taps list, used to track the
- * assigned chain position to new TAPs
- */
-static unsigned jtag_num_taps;
static enum reset_types jtag_reset_config = RESET_NONE;
tap_state_t cmd_queue_cur_state = TAP_RESET;
* It is also implicitly disabled while TRST is active and
* while SRST is gating the JTAG clock.
*/
+ if (!transport_is_jtag())
+ return jtag_poll;
+
if (!jtag_poll || jtag_trst != 0)
return false;
return jtag_srst == 0 || (jtag_reset_config & RESET_SRST_NO_GATING);
unsigned jtag_tap_count(void)
{
- return jtag_num_taps;
+ struct jtag_tap *t = jtag_all_taps();
+ unsigned n = 0;
+ while (t) {
+ n++;
+ t = t->next_tap;
+ }
+ return n;
}
unsigned jtag_tap_count_enabled(void)
/** Append a new TAP to the chain of all taps. */
void jtag_tap_add(struct jtag_tap *t)
{
- t->abs_chain_position = jtag_num_taps++;
+ unsigned jtag_num_taps = 0;
struct jtag_tap **tap = &__jtag_all_taps;
- while (*tap != NULL)
+ while (*tap != NULL) {
+ jtag_num_taps++;
tap = &(*tap)->next_tap;
+ }
*tap = t;
+ t->abs_chain_position = jtag_num_taps;
}
/* returns a pointer to the n-th device in the scan chain */
{
jtag_unregister_event_callback(&jtag_reset_callback, tap);
- /** @todo is anything missing? no memory leaks please */
free(tap->expected);
+ free(tap->expected_mask);
free(tap->expected_ids);
+ free(tap->cur_instr);
free(tap->chip);
free(tap->tapname);
free(tap->dotted_name);
* REVISIT once Tcl code can read the reset_config modes, this won't
* need to be a C routine at all...
*/
- jtag_add_reset(1, 0); /* TAP_RESET, using TMS+TCK or TRST */
if (jtag_reset_config & RESET_HAS_SRST) {
jtag_add_reset(1, 1);
if ((jtag_reset_config & RESET_SRST_PULLS_TRST) == 0)
jtag_add_reset(0, 1);
+ } else {
+ jtag_add_reset(1, 0); /* TAP_RESET, using TMS+TCK or TRST */
}
/* some targets enable us to connect with srst asserted */