This is an automated email from Gerrit.

Tilman Sauerbeck ([email protected]) just uploaded a new patch set to 
Gerrit, which you can find at http://openocd.zylin.com/5200

-- gerrit

commit 7382f36bf7bc6ab4cbdfdd0b04a9090188c5df73
Author: Tilman Sauerbeck <[email protected]>
Date:   Mon Jun 3 21:19:07 2019 +0200

    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 15 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]>

diff --git a/src/jtag/drivers/buspirate.c b/src/jtag/drivers/buspirate.c
index 14c719d..45c76a9 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;
 }

-- 


_______________________________________________
OpenOCD-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/openocd-devel

Reply via email to