From 8ed19a2e29bd438db055b2bcda336ddf5a041410 Mon Sep 17 00:00:00 2001 From: Tilman Sauerbeck Date: Mon, 3 Jun 2019 21:19:07 +0200 Subject: [PATCH] jtag: drivers: buspirate: chunk SWD switch sequence transfer. Commit c2e18bfaeafd changed the size of the JTAG-to-SWD sequence from 15 bytes to 17 bytes. This broke SWD switch sequence transfer for buspirate, since buspirate packets can only hold a payload of up to 16 bytes and we tried to fit the whole sequence in a single packet. Splitting up the sequence transfer in appropriately sized packets makes buspirate SWD work again (successfully tested with buspirate firmwares v6.1 and v7.0). Change-Id: Ib5b412b9e77287d705d2762e31c16d30318b50e3 Signed-off-by: Tilman Sauerbeck Reviewed-on: http://openocd.zylin.com/5200 Tested-by: jenkins Reviewed-by: Antonio Borneo Reviewed-by: Tomas Vanek --- src/jtag/drivers/buspirate.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/jtag/drivers/buspirate.c b/src/jtag/drivers/buspirate.c index 2e771cc85..872896ba3 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; - tmp[0] = 0x10 + ((sequence_len - 1) & 0x0F); - memcpy(tmp + 1, sequence, sequence_len); + while (no_bytes) { + uint8_t tmp[17]; + uint32_t to_send; - buspirate_serial_write(buspirate_fd, tmp, sequence_len + 1); - buspirate_serial_read(buspirate_fd, tmp, sequence_len + 1); + to_send = no_bytes > 16 ? 16 : no_bytes; + + tmp[0] = 0x10 + ((to_send - 1) & 0x0F); + memcpy(tmp + 1, &sequence[sequence_offset], to_send); + + buspirate_serial_write(buspirate_fd, tmp, to_send + 1); + buspirate_serial_read(buspirate_fd, tmp, to_send + 1); + + no_bytes -= to_send; + sequence_offset += to_send; + } return ERROR_OK; }