drivers/ftdi: add support for SWD multidrop
authorTomas Vanek <vanekt@fbl.cz>
Fri, 12 Nov 2021 13:14:32 +0000 (14:14 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Sat, 20 Nov 2021 14:45:06 +0000 (14:45 +0000)
Ignore ack received after DP_TARGETSEL write to prevent false error.

Inspired by Graham Sanderson's http://review.openocd.org/4935

Change-Id: I04fd77cde3244de250743d8c8bfb93ed26379385
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: https://review.openocd.org/c/openocd/+/6698
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
src/jtag/drivers/ftdi.c

index d03a4ca233381b1c8298e4580076e4a2a6557700..8366774bc1e527a95b556627cc028905c75b1dd2 100644 (file)
@@ -1121,7 +1121,11 @@ static int ftdi_swd_run_queue(void)
        for (size_t i = 0; i < swd_cmd_queue_length; i++) {
                int ack = buf_get_u32(swd_cmd_queue[i].trn_ack_data_parity_trn, 1, 3);
 
-               LOG_DEBUG_IO("%s %s %s reg %X = %08"PRIx32,
+               /* Devices do not reply to DP_TARGETSEL write cmd, ignore received ack */
+               bool check_ack = swd_cmd_returns_ack(swd_cmd_queue[i].cmd);
+
+               LOG_DEBUG_IO("%s%s %s %s reg %X = %08"PRIx32,
+                               check_ack ? "" : "ack ignored ",
                                ack == SWD_ACK_OK ? "OK" : ack == SWD_ACK_WAIT ? "WAIT" : ack == SWD_ACK_FAULT ? "FAULT" : "JUNK",
                                swd_cmd_queue[i].cmd & SWD_CMD_APNDP ? "AP" : "DP",
                                swd_cmd_queue[i].cmd & SWD_CMD_RNW ? "read" : "write",
@@ -1129,8 +1133,8 @@ static int ftdi_swd_run_queue(void)
                                buf_get_u32(swd_cmd_queue[i].trn_ack_data_parity_trn,
                                                1 + 3 + (swd_cmd_queue[i].cmd & SWD_CMD_RNW ? 0 : 1), 32));
 
-               if (ack != SWD_ACK_OK) {
-                       queued_retval = ack == SWD_ACK_WAIT ? ERROR_WAIT : ERROR_FAIL;
+               if (ack != SWD_ACK_OK && check_ack) {
+                       queued_retval = swd_ack_to_error_code(ack);
                        goto skip;
 
                } else if (swd_cmd_queue[i].cmd & SWD_CMD_RNW) {