jtag: sysfsgpio: clean up swd gpios
[openocd.git] / src / jtag / drivers / sysfsgpio.c
index e60181459db8218feb4a78ef43405db82bae214b..24dc4bc92b668e4154619f452cf4797976e791f6 100644 (file)
@@ -12,9 +12,7 @@
  *   GNU General Public License for more details.                          *
  *                                                                         *
  *   You should have received a copy of the GNU General Public License     *
- *   along with this program; if not, write to the                         *
- *   Free Software Foundation, Inc.,                                       *
- *   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.           *
+ *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
 /* 2014-12: Addition of the SWD protocol support is based on the initial work
 /*
  * Helper func to determine if gpio number valid
  *
- * Assume here that there will be less than 1000 gpios on a system
+ * Assume here that there will be less than 10000 gpios on a system
  */
 static int is_gpio_valid(int gpio)
 {
-       return gpio >= 0 && gpio < 1000;
+       return gpio >= 0 && gpio < 10000;
 }
 
 /*
@@ -91,7 +89,7 @@ static int open_write_close(const char *name, const char *valstr)
  */
 static void unexport_sysfs_gpio(int gpio)
 {
-       char gpiostr[4];
+       char gpiostr[5];
 
        if (!is_gpio_valid(gpio))
                return;
@@ -115,7 +113,7 @@ static void unexport_sysfs_gpio(int gpio)
 static int setup_sysfs_gpio(int gpio, int is_output, int init_high)
 {
        char buf[40];
-       char gpiostr[4];
+       char gpiostr[5];
        int ret;
 
        if (!is_gpio_valid(gpio))
@@ -210,7 +208,7 @@ static int sysfsgpio_swdio_read(void)
                return 0;
        }
 
-       return buf[0] == '1';
+       return buf[0] != '0';
 }
 
 static void sysfsgpio_swdio_write(int swclk, int swdio)
@@ -246,7 +244,7 @@ static void sysfsgpio_swdio_write(int swclk, int swdio)
  * The sysfs value will read back either '0' or '1'. The trick here is to call
  * lseek to bypass buffering in the sysfs kernel driver.
  */
-static int sysfsgpio_read(void)
+static bb_value_t sysfsgpio_read(void)
 {
        char buf[1];
 
@@ -259,7 +257,7 @@ static int sysfsgpio_read(void)
                return 0;
        }
 
-       return buf[0] == '1';
+       return buf[0] == '0' ? BB_LOW : BB_HIGH;
 }
 
 /*
@@ -268,11 +266,11 @@ static int sysfsgpio_read(void)
  * Seeing as this is the only function where the outputs are changed,
  * we can cache the old value to avoid needlessly writing it.
  */
-static void sysfsgpio_write(int tck, int tms, int tdi)
+static int sysfsgpio_write(int tck, int tms, int tdi)
 {
        if (swd_mode) {
                sysfsgpio_swdio_write(tck, tdi);
-               return;
+               return ERROR_OK;
        }
 
        const char one[] = "1";
@@ -314,6 +312,8 @@ static void sysfsgpio_write(int tck, int tms, int tdi)
        last_tdi = tdi;
        last_tms = tms;
        last_tck = tck;
+
+       return ERROR_OK;
 }
 
 /*
@@ -321,7 +321,7 @@ static void sysfsgpio_write(int tck, int tms, int tdi)
  *
  * (1) assert or (0) deassert reset lines
  */
-static void sysfsgpio_reset(int trst, int srst)
+static int sysfsgpio_reset(int trst, int srst)
 {
        LOG_DEBUG("sysfsgpio_reset");
        const char one[] = "1";
@@ -341,6 +341,8 @@ static void sysfsgpio_reset(int trst, int srst)
                if (bytes_written != 1)
                        LOG_WARNING("writing trst failed");
        }
+
+       return ERROR_OK;
 }
 
 COMMAND_HANDLER(sysfsgpio_handle_jtag_gpionums)
@@ -559,6 +561,8 @@ static void cleanup_all_fds(void)
        cleanup_fd(tdo_fd, tdo_gpio);
        cleanup_fd(trst_fd, trst_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)
@@ -594,10 +598,6 @@ static int sysfsgpio_init(void)
                        LOG_INFO("JTAG and SWD modes enabled");
                else
                        LOG_INFO("JTAG only mode enabled (specify swclk and swdio gpio to add SWD mode)");
-               if (!is_gpio_valid(trst_gpio) && !is_gpio_valid(srst_gpio)) {
-                       LOG_ERROR("Require at least one of trst or srst gpios to be specified");
-                       return ERROR_JTAG_INIT_FAILED;
-               }
        } else if (sysfsgpio_swd_mode_possible()) {
                LOG_INFO("SWD only mode enabled (specify tck, tms, tdi and tdo gpios to add JTAG mode)");
        } else {

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)