jtag: drivers: buspirate: chunk SWD switch sequence transfer.

Commit c2e18bfaea 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 <tilman@code-monkey.de>
Reviewed-on: http://openocd.zylin.com/5200
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
bscan_optimization
Tilman Sauerbeck 2019-06-03 21:19:07 +02:00 committed by Tomas Vanek
parent b6fa208759
commit 8ed19a2e29
1 changed files with 17 additions and 8 deletions

View File

@ -1312,7 +1312,7 @@ static int buspirate_swd_switch_seq(enum swd_special_seq seq)
{ {
const uint8_t *sequence; const uint8_t *sequence;
int sequence_len; int sequence_len;
uint8_t tmp[64]; uint32_t no_bytes, sequence_offset;
switch (seq) { switch (seq) {
case LINE_RESET: case LINE_RESET:
@ -1335,15 +1335,24 @@ static int buspirate_swd_switch_seq(enum swd_special_seq seq)
return ERROR_FAIL; return ERROR_FAIL;
} }
/* FIXME: all above sequences fit into one pirate command for now no_bytes = sequence_len;
* but it may cause trouble later sequence_offset = 0;
*/
tmp[0] = 0x10 + ((sequence_len - 1) & 0x0F); while (no_bytes) {
memcpy(tmp + 1, sequence, sequence_len); uint8_t tmp[17];
uint32_t to_send;
buspirate_serial_write(buspirate_fd, tmp, sequence_len + 1); to_send = no_bytes > 16 ? 16 : no_bytes;
buspirate_serial_read(buspirate_fd, tmp, sequence_len + 1);
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; return ERROR_OK;
} }