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 --