driver/ftdi: skip trst in swd mode
authorAntonio Borneo <borneo.antonio@gmail.com>
Thu, 5 Mar 2020 16:00:50 +0000 (17:00 +0100)
committerAntonio Borneo <borneo.antonio@gmail.com>
Mon, 18 Jan 2021 15:32:21 +0000 (15:32 +0000)
When using the adapter olimex arm-jtag-swd (to convert to SWD a
JTAG-only FTDI adapter), the pin trst on JTAG side is re-used to
control the direction of pin SWDIO on SWD side.
There is a single reset API at adapter driver to assert/deassert
either srst and/or trst. A request to assert/deassert srst can
cause also trst to change value, hanging the SWD communication.

In SWD mode, ignore the value passed to trst.

Change-Id: I5fe1eed851177d405d77ae6079da9642dc1a08f1
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: http://openocd.zylin.com/6006
Tested-by: jenkins
src/jtag/drivers/ftdi.c

index 9d1c85cbd01e88d876f9d3ec42ef5a7b5f0f098e..9e47d3cad180909bf2f3ab18904a29217220136a 100644 (file)
@@ -524,17 +524,19 @@ static int ftdi_reset(int trst, int srst)
 
        LOG_DEBUG_IO("reset trst: %i srst %i", trst, srst);
 
-       if (trst == 1) {
-               if (sig_ntrst)
-                       ftdi_set_signal(sig_ntrst, '0');
-               else
-                       LOG_ERROR("Can't assert TRST: nTRST signal is not defined");
-       } else if (sig_ntrst && jtag_get_reset_config() & RESET_HAS_TRST &&
-                       trst == 0) {
-               if (jtag_get_reset_config() & RESET_TRST_OPEN_DRAIN)
-                       ftdi_set_signal(sig_ntrst, 'z');
-               else
-                       ftdi_set_signal(sig_ntrst, '1');
+       if (!swd_mode) {
+               if (trst == 1) {
+                       if (sig_ntrst)
+                               ftdi_set_signal(sig_ntrst, '0');
+                       else
+                               LOG_ERROR("Can't assert TRST: nTRST signal is not defined");
+               } else if (sig_ntrst && jtag_get_reset_config() & RESET_HAS_TRST &&
+                               trst == 0) {
+                       if (jtag_get_reset_config() & RESET_TRST_OPEN_DRAIN)
+                               ftdi_set_signal(sig_ntrst, 'z');
+                       else
+                               ftdi_set_signal(sig_ntrst, '1');
+               }
        }
 
        if (srst == 1) {