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:
parent
b86726b5a5
commit
198a914cf9
|
@ -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,
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue