Skip to content

Commit

Permalink
jtagspi/pld: add support from gatemate driver
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-on: https://review.openocd.org/c/openocd/+/7838
Reviewed-by: Antonio Borneo <[email protected]>
Tested-by: jenkins
  • Loading branch information
danselmi authored and borneoa committed Sep 23, 2023
1 parent b86726b commit 198a914
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 0 deletions.
66 changes: 66 additions & 0 deletions src/pld/gatemate.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
};
6 changes: 6 additions & 0 deletions tcl/board/gatemate_eval.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 198a914

Please sign in to comment.