diff --git a/src/jtag/drivers/at91rm9200.c b/src/jtag/drivers/at91rm9200.c index abaf3adb7..89d7000ca 100644 --- a/src/jtag/drivers/at91rm9200.c +++ b/src/jtag/drivers/at91rm9200.c @@ -126,6 +126,7 @@ struct jtag_interface at91rm9200_interface = { .name = "at91rm9200", + .supported = DEBUG_CAP_TMS_SEQ, .execute_queue = bitbang_execute_queue, .speed = at91rm9200_speed, diff --git a/src/jtag/drivers/bitbang.c b/src/jtag/drivers/bitbang.c index 83c2d29ec..6159ef7a5 100644 --- a/src/jtag/drivers/bitbang.c +++ b/src/jtag/drivers/bitbang.c @@ -91,6 +91,31 @@ static void bitbang_state_move(int skip) tap_set_state(tap_get_end_state()); } + +/** + * Clock a bunch of TMS (or SWDIO) transitions, to change the JTAG + * (or SWD) state machine. + */ +static int bitbang_execute_tms(struct jtag_command *cmd) +{ + unsigned num_bits = cmd->cmd.tms->num_bits; + const uint8_t *bits = cmd->cmd.tms->bits; + + DEBUG_JTAG_IO("TMS: %d bits", num_bits); + + int tms = 0; + for (unsigned i = 0; i < num_bits; i++) + { + tms = ((bits[i/8] >> (i % 8)) & 1); + bitbang_interface->write(0, tms, 0); + bitbang_interface->write(1, tms, 0); + } + bitbang_interface->write(CLOCK_IDLE(), tms, 0); + + return ERROR_OK; +} + + static void bitbang_path_move(struct pathmove_command *cmd) { int num_states = cmd->num_states; @@ -312,6 +337,9 @@ int bitbang_execute_queue(void) #endif jtag_sleep(cmd->cmd.sleep->us); break; + case JTAG_TMS: + retval = bitbang_execute_tms(cmd); + break; default: LOG_ERROR("BUG: unknown JTAG command type encountered"); exit(-1); diff --git a/src/jtag/drivers/dummy.c b/src/jtag/drivers/dummy.c index 1880712a8..7cb0e33c5 100644 --- a/src/jtag/drivers/dummy.c +++ b/src/jtag/drivers/dummy.c @@ -164,6 +164,7 @@ static const struct command_registration dummy_command_handlers[] = { struct jtag_interface dummy_interface = { .name = "dummy", + .supported = DEBUG_CAP_TMS_SEQ, .commands = dummy_command_handlers, .execute_queue = &bitbang_execute_queue, diff --git a/src/jtag/drivers/ep93xx.c b/src/jtag/drivers/ep93xx.c index 61dc76ede..0959a5692 100644 --- a/src/jtag/drivers/ep93xx.c +++ b/src/jtag/drivers/ep93xx.c @@ -57,6 +57,7 @@ struct jtag_interface ep93xx_interface = { .name = "ep93xx", + .supported = DEBUG_CAP_TMS_SEQ, .execute_queue = bitbang_execute_queue, .speed = ep93xx_speed, diff --git a/src/jtag/drivers/parport.c b/src/jtag/drivers/parport.c index fa3373b0c..2323ec56a 100644 --- a/src/jtag/drivers/parport.c +++ b/src/jtag/drivers/parport.c @@ -524,6 +524,7 @@ static const struct command_registration parport_command_handlers[] = { struct jtag_interface parport_interface = { .name = "parport", + .supported = DEBUG_CAP_TMS_SEQ, .commands = parport_command_handlers, .init = parport_init, diff --git a/src/jtag/drivers/usb_blaster.c b/src/jtag/drivers/usb_blaster.c index 3703323bf..59c5715bd 100644 --- a/src/jtag/drivers/usb_blaster.c +++ b/src/jtag/drivers/usb_blaster.c @@ -580,6 +580,7 @@ static const struct command_registration usb_blaster_command_handlers[] = { struct jtag_interface usb_blaster_interface = { .name = "usb_blaster", .commands = usb_blaster_command_handlers, + .supported = DEBUG_CAP_TMS_SEQ, .execute_queue = bitbang_execute_queue,