This is an automated email from Gerrit.

"Daniel Anselmi <danse...@gmx.ch>" just uploaded a new patch set to Gerrit, 
which you can find at https://review.openocd.org/c/openocd/+/7838

-- gerrit

commit 2b4048d2c4c0de219ae2dd8e5c8ef6f625fc2877
Author: Daniel Anselmi <danse...@gmx.ch>
Date:   Thu Jan 12 00:41:41 2023 +0100

    jtagspi/pld: add support from gatemate driver
    
    Change-Id: Ifa1c4ca6e215d7f49bd21620898991af213812e9
    Signed-off-by: Daniel Anselmi <danse...@gmx.ch>

diff --git a/src/pld/gatemate.c b/src/pld/gatemate.c
index 4ad2665c6a..e112803089 100644
--- a/src/pld/gatemate.c
+++ b/src/pld/gatemate.c
@@ -15,6 +15,8 @@
 #include "raw_bit.h"
 
 #define JTAG_CONFIGURE  0x06
+#define JTAG_SPI_BYPASS 0x05
+#define BYPASS          0x3F
 
 struct gatemate_pld_device {
        struct jtag_tap *tap;
@@ -209,6 +211,79 @@ static int gatemate_load(struct pld_device *pld_device, 
const char *filename)
        return retval;
 }
 
+static int gatemate_connect_spi_to_jtag(struct pld_device *pld_device)
+{
+       if (!pld_device)
+               return ERROR_FAIL;
+
+       struct gatemate_pld_device *pld_device_info = pld_device->driver_priv;
+       if (!pld_device_info)
+               return ERROR_FAIL;
+
+       struct jtag_tap *tap = pld_device_info->tap;
+       if (!tap)
+               return ERROR_FAIL;
+
+       if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) == JTAG_SPI_BYPASS)
+               return ERROR_OK;
+
+       gatemate_set_instr(tap, JTAG_SPI_BYPASS);
+
+       return jtag_execute_queue();
+}
+
+static int gatemate_disconnect_spi_from_jtag(struct pld_device *pld_device)
+{
+       if (!pld_device)
+               return ERROR_FAIL;
+
+       struct gatemate_pld_device *pld_device_info = pld_device->driver_priv;
+       if (!pld_device_info)
+               return ERROR_FAIL;
+
+       struct jtag_tap *tap = pld_device_info->tap;
+       if (!tap)
+               return ERROR_FAIL;
+
+       if (buf_get_u32(tap->cur_instr, 0, tap->ir_length) != JTAG_SPI_BYPASS)
+               return ERROR_OK;
+
+       gatemate_set_instr(tap, BYPASS);
+
+       return jtag_execute_queue();
+}
+
+static int gatemate_get_facing_read_bits(struct pld_device *pld_device, 
unsigned int *facing_read_bits)
+{
+       if (!pld_device)
+               return ERROR_FAIL;
+
+       *facing_read_bits = 1;
+
+       return ERROR_OK;
+}
+
+static int gatemate_get_trailing_write_bits(struct pld_device *pld_device, 
unsigned int *trailing_write_bits)
+{
+       if (!pld_device)
+               return ERROR_FAIL;
+
+       *trailing_write_bits = 1;
+
+       return ERROR_OK;
+}
+
+static int gatemate_get_jtagspi_info(struct pld_jtagspi *pld_jtagspi)
+{
+       pld_jtagspi->mode = JTAGSPI_MODE_SPECIFIC_INSTRUCTION;
+       pld_jtagspi->connect_spi_to_jtag = gatemate_connect_spi_to_jtag;
+       pld_jtagspi->disconnect_spi_from_jtag = 
gatemate_disconnect_spi_from_jtag;
+       pld_jtagspi->get_facing_read_bits = gatemate_get_facing_read_bits;
+       pld_jtagspi->get_trailing_write_bits = gatemate_get_trailing_write_bits;
+
+       return ERROR_OK;
+}
+
 PLD_CREATE_COMMAND_HANDLER(gatemate_pld_create_command)
 {
        if (CMD_ARGC != 4)
@@ -239,4 +314,5 @@ struct pld_driver gatemate_pld = {
        .name = "gatemate",
        .pld_create_command = &gatemate_pld_create_command,
        .load = &gatemate_load,
+       .get_jtagspi_info = gatemate_get_jtagspi_info,
 };
diff --git a/tcl/board/gatemate_eval.cfg b/tcl/board/gatemate_eval.cfg
index cc078a0e30..c4d3f3dfda 100644
--- a/tcl/board/gatemate_eval.cfg
+++ b/tcl/board/gatemate_eval.cfg
@@ -14,3 +14,9 @@ transport select jtag
 adapter speed 6000
 
 source [find fpga/gatemate.cfg]
+
+set JTAGSPI_CHAIN_ID gatemate.pld
+source [find cpld/jtagspi.cfg]
+
+#jtagspi_init gatemate.pld "" -1
+#jtagspi_program workspace/blink/blink_slow.cfg.bit 0

-- 

Reply via email to