Skip to content

Commit

Permalink
jtag: drivers: buspirate: chunk SWD switch sequence transfer.
Browse files Browse the repository at this point in the history
Commit c2e18bf 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 <[email protected]>
Reviewed-on: http:https://openocd.zylin.com/5200
Tested-by: jenkins
Reviewed-by: Antonio Borneo <[email protected]>
Reviewed-by: Tomas Vanek <[email protected]>
  • Loading branch information
tilman2 authored and tom-van committed Jun 13, 2019
1 parent b6fa208 commit 8ed19a2
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions src/jtag/drivers/buspirate.c
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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;
}
Expand Down

0 comments on commit 8ed19a2

Please sign in to comment.