sysfsgpio: enable only the transport specific gpio 56/5556/3
authorAntonio Borneo <borneo.antonio@gmail.com>
Wed, 1 Apr 2020 09:37:54 +0000 (11:37 +0200)
committerAntonio Borneo <borneo.antonio@gmail.com>
Mon, 13 Jul 2020 23:38:28 +0000 (00:38 +0100)
If the configuration file specifies both SWD and JTAG gpios, the
current code request all of them. In case of overlap a warning is
generated when the same gpio is released for the second time.

Require and release only the gpio needed by the specified
transport.

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

index a5896209864a027529ed18a9d8d15b937200a652..d9fd7756aab05af4a2afe88e5d7267e8d20c7d7d 100644 (file)
@@ -54,6 +54,7 @@
 
 #include <helper/time_support.h>
 #include <jtag/interface.h>
+#include <transport/transport.h>
 #include "bitbang.h"
 
 /*
@@ -586,14 +587,18 @@ static void cleanup_fd(int fd, int gpio)
 
 static void cleanup_all_fds(void)
 {
-       cleanup_fd(tck_fd, tck_gpio);
-       cleanup_fd(tms_fd, tms_gpio);
-       cleanup_fd(tdi_fd, tdi_gpio);
-       cleanup_fd(tdo_fd, tdo_gpio);
-       cleanup_fd(trst_fd, trst_gpio);
+       if (transport_is_jtag()) {
+               cleanup_fd(tck_fd, tck_gpio);
+               cleanup_fd(tms_fd, tms_gpio);
+               cleanup_fd(tdi_fd, tdi_gpio);
+               cleanup_fd(tdo_fd, tdo_gpio);
+               cleanup_fd(trst_fd, trst_gpio);
+       }
+       if (transport_is_swd()) {
+               cleanup_fd(swclk_fd, swclk_gpio);
+               cleanup_fd(swdio_fd, swdio_gpio);
+       }
        cleanup_fd(srst_fd, srst_gpio);
-       cleanup_fd(swclk_fd, swclk_gpio);
-       cleanup_fd(swdio_fd, swdio_gpio);
 }
 
 static bool sysfsgpio_jtag_mode_possible(void)
@@ -624,74 +629,64 @@ static int sysfsgpio_init(void)
 
        LOG_INFO("SysfsGPIO JTAG/SWD bitbang driver");
 
-       if (sysfsgpio_jtag_mode_possible()) {
-               if (sysfsgpio_swd_mode_possible())
-                       LOG_INFO("JTAG and SWD modes enabled");
-               else
-                       LOG_INFO("JTAG only mode enabled (specify swclk and swdio gpio to add SWD mode)");
-       } else if (sysfsgpio_swd_mode_possible()) {
-               LOG_INFO("SWD only mode enabled (specify tck, tms, tdi and tdo gpios to add JTAG mode)");
-       } else {
-               LOG_ERROR("Require tck, tms, tdi and tdo gpios for JTAG mode and/or swclk and swdio gpio for SWD mode");
-               return ERROR_JTAG_INIT_FAILED;
-       }
-
-
        /*
         * Configure TDO as an input, and TDI, TCK, TMS, TRST, SRST
         * as outputs.  Drive TDI and TCK low, and TMS/TRST/SRST high.
         * For SWD, SWCLK and SWDIO are configures as output high.
         */
-       if (tck_gpio >= 0) {
+
+       if (transport_is_jtag()) {
+               if (!sysfsgpio_jtag_mode_possible()) {
+                       LOG_ERROR("Require tck, tms, tdi and tdo gpios for JTAG mode");
+                       return ERROR_JTAG_INIT_FAILED;
+               }
+
                tck_fd = setup_sysfs_gpio(tck_gpio, 1, 0);
                if (tck_fd < 0)
                        goto out_error;
-       }
 
-       if (tms_gpio >= 0) {
                tms_fd = setup_sysfs_gpio(tms_gpio, 1, 1);
                if (tms_fd < 0)
                        goto out_error;
-       }
 
-       if (tdi_gpio >= 0) {
                tdi_fd = setup_sysfs_gpio(tdi_gpio, 1, 0);
                if (tdi_fd < 0)
                        goto out_error;
-       }
 
-       if (tdo_gpio >= 0) {
                tdo_fd = setup_sysfs_gpio(tdo_gpio, 0, 0);
                if (tdo_fd < 0)
                        goto out_error;
-       }
 
-       /* assume active low*/
-       if (trst_gpio >= 0) {
-               trst_fd = setup_sysfs_gpio(trst_gpio, 1, 1);
-               if (trst_fd < 0)
-                       goto out_error;
+               /* assume active low*/
+               if (trst_gpio >= 0) {
+                       trst_fd = setup_sysfs_gpio(trst_gpio, 1, 1);
+                       if (trst_fd < 0)
+                               goto out_error;
+               }
        }
 
-       /* assume active low*/
-       if (srst_gpio >= 0) {
-               srst_fd = setup_sysfs_gpio(srst_gpio, 1, 1);
-               if (srst_fd < 0)
-                       goto out_error;
-       }
+       if (transport_is_swd()) {
+               if (!sysfsgpio_swd_mode_possible()) {
+                       LOG_ERROR("Require swclk and swdio gpio for SWD mode");
+                       return ERROR_JTAG_INIT_FAILED;
+               }
 
-       if (swclk_gpio >= 0) {
                swclk_fd = setup_sysfs_gpio(swclk_gpio, 1, 0);
                if (swclk_fd < 0)
                        goto out_error;
-       }
 
-       if (swdio_gpio >= 0) {
                swdio_fd = setup_sysfs_gpio(swdio_gpio, 1, 0);
                if (swdio_fd < 0)
                        goto out_error;
        }
 
+       /* assume active low*/
+       if (srst_gpio >= 0) {
+               srst_fd = setup_sysfs_gpio(srst_gpio, 1, 1);
+               if (srst_fd < 0)
+                       goto out_error;
+       }
+
        return ERROR_OK;
 
 out_error:

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)