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
parent
b6fa208759
commit
8ed19a2e29
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue