arm_adi_v5: add arm SoC-600 part numbers
[fw/openocd] / src / jtag / drivers / imx_gpio.c
index 196d0e4a1a0af609d03fef82423a45fc5d9303fd..39b463d3139fb00f359bf84bdffc43b94939df5a 100644 (file)
@@ -22,6 +22,7 @@
 #endif
 
 #include <jtag/interface.h>
+#include <transport/transport.h>
 #include "bitbang.h"
 
 #include <sys/mman.h>
@@ -84,10 +85,10 @@ static inline bool gpio_level(int g)
 
 static bb_value_t imx_gpio_read(void);
 static int imx_gpio_write(int tck, int tms, int tdi);
-static int imx_gpio_reset(int trst, int srst);
 
 static int imx_gpio_swdio_read(void);
 static void imx_gpio_swdio_drive(bool is_output);
+static int imx_gpio_swd_write(int swclk, int swdio);
 
 static int imx_gpio_init(void);
 static int imx_gpio_quit(void);
@@ -95,9 +96,9 @@ static int imx_gpio_quit(void);
 static struct bitbang_interface imx_gpio_bitbang = {
        .read = imx_gpio_read,
        .write = imx_gpio_write,
-       .reset = imx_gpio_reset,
        .swdio_read = imx_gpio_swdio_read,
        .swdio_drive = imx_gpio_swdio_drive,
+       .swd_write = imx_gpio_swd_write,
        .blink = NULL
 };
 
@@ -145,10 +146,10 @@ static int imx_gpio_write(int tck, int tms, int tdi)
        return ERROR_OK;
 }
 
-static int imx_gpio_swd_write(int tck, int tms, int tdi)
+static int imx_gpio_swd_write(int swclk, int swdio)
 {
-       tdi ? gpio_set(swdio_gpio) : gpio_clear(swdio_gpio);
-       tck ? gpio_set(swclk_gpio) : gpio_clear(swclk_gpio);
+       swdio ? gpio_set(swdio_gpio) : gpio_clear(swdio_gpio);
+       swclk ? gpio_set(swclk_gpio) : gpio_clear(swclk_gpio);
 
        for (unsigned int i = 0; i < jtag_delay; i++)
                asm volatile ("");
@@ -323,7 +324,7 @@ COMMAND_HANDLER(imx_gpio_handle_speed_coeffs)
                COMMAND_PARSE_NUMBER(int, CMD_ARGV[1], speed_offset);
        }
 
-       command_print(CMD_CTX, "imx_gpio: speed_coeffs = %d, speed_offset = %d",
+       command_print(CMD, "imx_gpio: speed_coeffs = %d, speed_offset = %d",
                                  speed_coeff, speed_offset);
        return ERROR_OK;
 }
@@ -333,7 +334,7 @@ COMMAND_HANDLER(imx_gpio_handle_peripheral_base)
        if (CMD_ARGC == 1)
                COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], imx_gpio_peri_base);
 
-       command_print(CMD_CTX, "imx_gpio: peripheral_base = 0x%08x",
+       command_print(CMD, "imx_gpio: peripheral_base = 0x%08x",
                                  imx_gpio_peri_base);
        return ERROR_OK;
 }
@@ -429,18 +430,25 @@ static const struct command_registration imx_gpio_command_handlers[] = {
 
 static const char * const imx_gpio_transports[] = { "jtag", "swd", NULL };
 
-struct jtag_interface imx_gpio_interface = {
-       .name = "imx_gpio",
+static struct jtag_interface imx_gpio_interface = {
        .supported = DEBUG_CAP_TMS_SEQ,
        .execute_queue = bitbang_execute_queue,
+};
+
+struct adapter_driver imx_gpio_adapter_driver = {
+       .name = "imx_gpio",
        .transports = imx_gpio_transports,
-       .swd = &bitbang_swd,
-       .speed = imx_gpio_speed,
-       .khz = imx_gpio_khz,
-       .speed_div = imx_gpio_speed_div,
        .commands = imx_gpio_command_handlers,
+
        .init = imx_gpio_init,
        .quit = imx_gpio_quit,
+       .reset = imx_gpio_reset,
+       .speed = imx_gpio_speed,
+       .khz = imx_gpio_khz,
+       .speed_div = imx_gpio_speed_div,
+
+       .jtag_ops = &imx_gpio_interface,
+       .swd_ops = &bitbang_swd,
 };
 
 static bool imx_gpio_jtag_mode_possible(void)
@@ -471,25 +479,22 @@ static int imx_gpio_init(void)
 
        LOG_INFO("imx_gpio GPIO JTAG/SWD bitbang driver");
 
-       if (imx_gpio_jtag_mode_possible()) {
-               if (imx_gpio_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 (imx_gpio_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");
+       if (transport_is_jtag() && !imx_gpio_jtag_mode_possible()) {
+               LOG_ERROR("Require tck, tms, tdi and tdo gpios for JTAG mode");
+               return ERROR_JTAG_INIT_FAILED;
+       }
+
+       if (transport_is_swd() && !imx_gpio_swd_mode_possible()) {
+               LOG_ERROR("Require swclk and swdio gpio for SWD mode");
                return ERROR_JTAG_INIT_FAILED;
        }
 
        dev_mem_fd = open("/dev/mem", O_RDWR | O_SYNC);
        if (dev_mem_fd < 0) {
-               perror("open");
+               LOG_ERROR("open: %s", strerror(errno));
                return ERROR_JTAG_INIT_FAILED;
        }
 
-
        LOG_INFO("imx_gpio mmap: pagesize: %u, regionsize: %u",
                        (unsigned int) sysconf(_SC_PAGE_SIZE), IMX_GPIO_REGS_COUNT * IMX_GPIO_SIZE);
        pio_base = mmap(NULL, IMX_GPIO_REGS_COUNT * IMX_GPIO_SIZE,
@@ -497,7 +502,7 @@ static int imx_gpio_init(void)
                                MAP_SHARED, dev_mem_fd, imx_gpio_peri_base);
 
        if (pio_base == MAP_FAILED) {
-               perror("mmap");
+               LOG_ERROR("mmap: %s", strerror(errno));
                close(dev_mem_fd);
                return ERROR_JTAG_INIT_FAILED;
        }
@@ -506,7 +511,7 @@ static int imx_gpio_init(void)
         * Configure TDO as an input, and TDI, TCK, TMS, TRST, SRST
         * as outputs.  Drive TDI and TCK low, and TMS/TRST/SRST high.
         */
-       if (imx_gpio_jtag_mode_possible()) {
+       if (transport_is_jtag()) {
                tdo_gpio_mode = gpio_mode_get(tdo_gpio);
                tdi_gpio_mode = gpio_mode_get(tdi_gpio);
                tck_gpio_mode = gpio_mode_get(tck_gpio);
@@ -520,8 +525,15 @@ static int imx_gpio_init(void)
                gpio_mode_output_set(tdi_gpio);
                gpio_mode_output_set(tck_gpio);
                gpio_mode_output_set(tms_gpio);
+
+               if (trst_gpio != -1) {
+                       trst_gpio_mode = gpio_mode_get(trst_gpio);
+                       gpio_set(trst_gpio);
+                       gpio_mode_output_set(trst_gpio);
+               }
        }
-       if (imx_gpio_swd_mode_possible()) {
+
+       if (transport_is_swd()) {
                swclk_gpio_mode = gpio_mode_get(swclk_gpio);
                swdio_gpio_mode = gpio_mode_get(swdio_gpio);
 
@@ -530,11 +542,7 @@ static int imx_gpio_init(void)
                gpio_mode_output_set(swclk_gpio);
                gpio_mode_output_set(swdio_gpio);
        }
-       if (trst_gpio != -1) {
-               trst_gpio_mode = gpio_mode_get(trst_gpio);
-               gpio_set(trst_gpio);
-               gpio_mode_output_set(trst_gpio);
-       }
+
        if (srst_gpio != -1) {
                srst_gpio_mode = gpio_mode_get(srst_gpio);
                gpio_set(srst_gpio);
@@ -545,28 +553,26 @@ static int imx_gpio_init(void)
                  "tdo %d trst %d srst %d", tck_gpio_mode, tms_gpio_mode,
                  tdi_gpio_mode, tdo_gpio_mode, trst_gpio_mode, srst_gpio_mode);
 
-       if (swd_mode) {
-               imx_gpio_bitbang.write = imx_gpio_swd_write;
-               bitbang_switch_to_swd();
-       }
-
        return ERROR_OK;
 }
 
 static int imx_gpio_quit(void)
 {
-       if (imx_gpio_jtag_mode_possible()) {
+       if (transport_is_jtag()) {
                gpio_mode_set(tdo_gpio, tdo_gpio_mode);
                gpio_mode_set(tdi_gpio, tdi_gpio_mode);
                gpio_mode_set(tck_gpio, tck_gpio_mode);
                gpio_mode_set(tms_gpio, tms_gpio_mode);
+
+               if (trst_gpio != -1)
+                       gpio_mode_set(trst_gpio, trst_gpio_mode);
        }
-       if (imx_gpio_swd_mode_possible()) {
+
+       if (transport_is_swd()) {
                gpio_mode_set(swclk_gpio, swclk_gpio_mode);
                gpio_mode_set(swdio_gpio, swdio_gpio_mode);
        }
-       if (trst_gpio != -1)
-               gpio_mode_set(trst_gpio, trst_gpio_mode);
+
        if (srst_gpio != -1)
                gpio_mode_set(srst_gpio, srst_gpio_mode);