X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fjtag%2Fdrivers%2Fbitbang.c;h=4548cb531ed33683d8155f52c99d53ab77c523a7;hb=ed13d3d3bea6847dc40787d82ff161fef7ca68ca;hp=da19171c15fe67ad054185cfce1e081435445b9a;hpb=c9e448222cc5d1162f5e495cdfd327732c50a484;p=openocd.git diff --git a/src/jtag/drivers/bitbang.c b/src/jtag/drivers/bitbang.c index da19171c15..4548cb531e 100644 --- a/src/jtag/drivers/bitbang.c +++ b/src/jtag/drivers/bitbang.c @@ -25,7 +25,7 @@ #endif #include "bitbang.h" -#include "interface.h" +#include #include /** @@ -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; @@ -279,7 +304,7 @@ int bitbang_execute_queue(void) bitbang_stableclocks(cmd->cmd.stableclocks->num_cycles); break; - case JTAG_STATEMOVE: + case JTAG_TLR_RESET: #ifdef _DEBUG_JTAG_IO_ LOG_DEBUG("statemove end in %s", tap_state_name(cmd->cmd.statemove->end_state)); #endif @@ -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);