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
This commit is contained in:
Daniel Anselmi 2022-12-17 13:11:30 +01:00 committed by Antonio Borneo
parent b86726b5a5
commit 198a914cf9
2 changed files with 72 additions and 0 deletions

View File

@ -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,
};

View File

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