summaryrefslogtreecommitdiff
path: root/src/jtag/drivers/bitbang.c
diff options
context:
space:
mode:
authorØyvind Harboe <oyvind.harboe@zylin.com>2010-03-01 08:25:18 +0100
committerØyvind Harboe <oyvind.harboe@zylin.com>2010-03-16 21:44:38 +0100
commit030ee192dd9647b10ff0841a671facec9d6b833f (patch)
tree3cc50692355eacbe459e1a7e67ccc538f1b81da8 /src/jtag/drivers/bitbang.c
parent679f6602fd1a7e9763bac52f06bbf2db28098d9a (diff)
downloadopenocd+libswd-030ee192dd9647b10ff0841a671facec9d6b833f.tar.gz
openocd+libswd-030ee192dd9647b10ff0841a671facec9d6b833f.tar.bz2
openocd+libswd-030ee192dd9647b10ff0841a671facec9d6b833f.tar.xz
openocd+libswd-030ee192dd9647b10ff0841a671facec9d6b833f.zip
bitbang: add jtag_add_tms_seq support
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Diffstat (limited to 'src/jtag/drivers/bitbang.c')
-rw-r--r--src/jtag/drivers/bitbang.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/jtag/drivers/bitbang.c b/src/jtag/drivers/bitbang.c
index 83c2d29e..6159ef7a 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);