aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Anselmi <danselmi@gmx.ch>2022-12-17 13:11:30 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2023-09-23 14:35:51 +0000
commit198a914cf99a8602a05227ac5327a805714e4b87 (patch)
tree5abb65e51439e33c2bcb4e128a9f4bc37528075c /src
parentb86726b5a5bb1d2689a786b3294e8617867d5ef4 (diff)
downloadriscv-openocd-198a914cf99a8602a05227ac5327a805714e4b87.zip
riscv-openocd-198a914cf99a8602a05227ac5327a805714e4b87.tar.gz
riscv-openocd-198a914cf99a8602a05227ac5327a805714e4b87.tar.bz2
jtagspi/pld: add support from gatemate driver
Provide jtagspi with specific procedures to be able to use jtagspi for programming spi-flash devices on cologne chip gatemate devices. Change-Id: Ifa1c4ca6e215d7f49bd21620898991af213812e9 Signed-off-by: Daniel Anselmi <danselmi@gmx.ch> Reviewed-on: https://review.openocd.org/c/openocd/+/7838 Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com> Tested-by: jenkins
Diffstat (limited to 'src')
-rw-r--r--src/pld/gatemate.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/pld/gatemate.c b/src/pld/gatemate.c
index 4ad2665..f35b39a 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,66 @@ static int gatemate_load(struct pld_device *pld_device, const char *filename)
return retval;
}
+static int gatemate_has_jtagspi_instruction(struct pld_device *device, bool *has_instruction)
+{
+ *has_instruction = true;
+ return ERROR_OK;
+}
+
+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_stuff_bits(struct pld_device *pld_device, unsigned int *facing_read_bits,
+ unsigned int *trailing_write_bits)
+{
+ if (!pld_device)
+ return ERROR_FAIL;
+
+ *facing_read_bits = 1;
+ *trailing_write_bits = 1;
+
+ return ERROR_OK;
+}
+
PLD_CREATE_COMMAND_HANDLER(gatemate_pld_create_command)
{
if (CMD_ARGC != 4)
@@ -239,4 +301,8 @@ struct pld_driver gatemate_pld = {
.name = "gatemate",
.pld_create_command = &gatemate_pld_create_command,
.load = &gatemate_load,
+ .has_jtagspi_instruction = gatemate_has_jtagspi_instruction,
+ .connect_spi_to_jtag = gatemate_connect_spi_to_jtag,
+ .disconnect_spi_from_jtag = gatemate_disconnect_spi_from_jtag,
+ .get_stuff_bits = gatemate_get_stuff_bits,
};