aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/jtag/drivers/buspirate.c25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/jtag/drivers/buspirate.c b/src/jtag/drivers/buspirate.c
index 2e771cc..872896b 100644
--- a/src/jtag/drivers/buspirate.c
+++ b/src/jtag/drivers/buspirate.c
@@ -1312,7 +1312,7 @@ static int buspirate_swd_switch_seq(enum swd_special_seq seq)
{
const uint8_t *sequence;
int sequence_len;
- uint8_t tmp[64];
+ uint32_t no_bytes, sequence_offset;
switch (seq) {
case LINE_RESET:
@@ -1335,15 +1335,24 @@ static int buspirate_swd_switch_seq(enum swd_special_seq seq)
return ERROR_FAIL;
}
- /* FIXME: all above sequences fit into one pirate command for now
- * but it may cause trouble later
- */
+ no_bytes = sequence_len;
+ sequence_offset = 0;
+
+ while (no_bytes) {
+ uint8_t tmp[17];
+ uint32_t to_send;
+
+ to_send = no_bytes > 16 ? 16 : no_bytes;
+
+ tmp[0] = 0x10 + ((to_send - 1) & 0x0F);
+ memcpy(tmp + 1, &sequence[sequence_offset], to_send);
- tmp[0] = 0x10 + ((sequence_len - 1) & 0x0F);
- memcpy(tmp + 1, sequence, sequence_len);
+ buspirate_serial_write(buspirate_fd, tmp, to_send + 1);
+ buspirate_serial_read(buspirate_fd, tmp, to_send + 1);
- buspirate_serial_write(buspirate_fd, tmp, sequence_len + 1);
- buspirate_serial_read(buspirate_fd, tmp, sequence_len + 1);
+ no_bytes -= to_send;
+ sequence_offset += to_send;
+ }
return ERROR_OK;
}