diff options
author | Daniel Anselmi <danselmi@gmx.ch> | 2022-12-17 13:11:30 +0100 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2023-09-23 14:35:51 +0000 |
commit | 198a914cf99a8602a05227ac5327a805714e4b87 (patch) | |
tree | 5abb65e51439e33c2bcb4e128a9f4bc37528075c /src | |
parent | b86726b5a5bb1d2689a786b3294e8617867d5ef4 (diff) | |
download | riscv-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.c | 66 |
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, }; |