pld: harmonize refresh commands

add refresh command for lattice devices
rename gowin reprogram to refresh
rename virtex2 program to refresh

Change-Id: I9da83a614b96da3e947ac4608b0a291b1d126914
Signed-off-by: Daniel Anselmi <danselmi@gmx.ch>
Reviewed-on: https://review.openocd.org/c/openocd/+/7839
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
This commit is contained in:
Daniel Anselmi 2022-12-17 13:11:30 +01:00 committed by Antonio Borneo
parent 198a914cf9
commit eb22a37b42
11 changed files with 112 additions and 10 deletions

View File

@ -8764,8 +8764,8 @@ Change values for boundary scan instructions selecting the registers USER1 to US
Description of the arguments can be found at command @command{virtex2 set_instr_codes}.
@end deffn
@deffn {Command} {virtex2 program} pld_name
Load the bitstream from external memory for FPGA @var{pld_name}. A.k.a. refresh.
@deffn {Command} {virtex2 refresh} pld_name
Load the bitstream from external memory for FPGA @var{pld_name}. A.k.a. program.
@end deffn
@end deffn
@ -8796,6 +8796,10 @@ for FPGA @var{pld_name} with value @var{val}.
Set the length of the register for the preload. This is needed when the JTAG ID of the device is not known by openocd (newer NX devices).
The load command for the FPGA @var{pld_name} will use a length for the preload of @var{length}.
@end deffn
@deffn {Command} {lattice refresh} pld_name
Load the bitstream from external memory for FPGA @var{pld_name}. A.k.a program.
@end deffn
@end deffn
@ -8850,9 +8854,9 @@ Reads and displays the user register
for FPGA @var{pld_name}.
@end deffn
@deffn {Command} {gowin reload} pld_name
@deffn {Command} {gowin refresh} pld_name
Load the bitstream from external memory for
FPGA @var{pld_name}. A.k.a. refresh.
FPGA @var{pld_name}. A.k.a. reload.
@end deffn
@end deffn

View File

@ -304,3 +304,27 @@ int lattice_certus_get_facing_read_bits(struct lattice_pld_device *pld_device_in
return ERROR_OK;
}
int lattice_certus_refresh(struct lattice_pld_device *lattice_device)
{
struct jtag_tap *tap = lattice_device->tap;
if (!tap)
return ERROR_FAIL;
int retval = lattice_preload(lattice_device);
if (retval != ERROR_OK)
return retval;
retval = lattice_set_instr(tap, LSC_REFRESH, TAP_IDLE);
if (retval != ERROR_OK)
return retval;
jtag_add_runtest(2, TAP_IDLE);
jtag_add_sleep(200000);
retval = lattice_set_instr(tap, BYPASS, TAP_IDLE);
if (retval != ERROR_OK)
return retval;
jtag_add_runtest(100, TAP_IDLE);
jtag_add_sleep(1000);
return jtag_execute_queue();
}

View File

@ -17,5 +17,6 @@ int lattice_certus_load(struct lattice_pld_device *lattice_device, struct lattic
int lattice_certus_connect_spi_to_jtag(struct lattice_pld_device *pld_device_info);
int lattice_certus_disconnect_spi_from_jtag(struct lattice_pld_device *pld_device_info);
int lattice_certus_get_facing_read_bits(struct lattice_pld_device *pld_device_info, unsigned int *facing_read_bits);
int lattice_certus_refresh(struct lattice_pld_device *lattice_device);
#endif /* OPENOCD_PLD_CERTUS_H */

View File

@ -304,3 +304,14 @@ int lattice_ecp2_3_get_facing_read_bits(struct lattice_pld_device *pld_device_in
return ERROR_OK;
}
int lattice_ecp2_3_refresh(struct lattice_pld_device *lattice_device)
{
if (!lattice_device || !lattice_device->tap)
return ERROR_FAIL;
int retval = lattice_set_instr(lattice_device->tap, LSCC_REFRESH, TAP_IDLE);
if (retval != ERROR_OK)
return retval;
return jtag_execute_queue();
}

View File

@ -18,5 +18,6 @@ int lattice_ecp3_load(struct lattice_pld_device *lattice_device, struct lattice_
int lattice_ecp2_3_connect_spi_to_jtag(struct lattice_pld_device *pld_device_info);
int lattice_ecp2_3_disconnect_spi_from_jtag(struct lattice_pld_device *pld_device_info);
int lattice_ecp2_3_get_facing_read_bits(struct lattice_pld_device *pld_device_info, unsigned int *facing_read_bits);
int lattice_ecp2_3_refresh(struct lattice_pld_device *lattice_device);
#endif /* OPENOCD_PLD_ECP2_3_H */

View File

@ -276,3 +276,27 @@ int lattice_ecp5_get_facing_read_bits(struct lattice_pld_device *pld_device_info
return ERROR_OK;
}
int lattice_ecp5_refresh(struct lattice_pld_device *lattice_device)
{
struct jtag_tap *tap = lattice_device->tap;
if (!tap)
return ERROR_FAIL;
int retval = lattice_preload(lattice_device);
if (retval != ERROR_OK)
return retval;
retval = lattice_set_instr(tap, LSC_REFRESH, TAP_IDLE);
if (retval != ERROR_OK)
return retval;
jtag_add_runtest(2, TAP_IDLE);
jtag_add_sleep(200000);
retval = lattice_set_instr(tap, BYPASS, TAP_IDLE);
if (retval != ERROR_OK)
return retval;
jtag_add_runtest(100, TAP_IDLE);
jtag_add_sleep(1000);
return jtag_execute_queue();
}

View File

@ -17,5 +17,6 @@ int lattice_ecp5_load(struct lattice_pld_device *lattice_device, struct lattice_
int lattice_ecp5_connect_spi_to_jtag(struct lattice_pld_device *pld_device_info);
int lattice_ecp5_disconnect_spi_from_jtag(struct lattice_pld_device *pld_device_info);
int lattice_ecp5_get_facing_read_bits(struct lattice_pld_device *pld_device_info, unsigned int *facing_read_bits);
int lattice_ecp5_refresh(struct lattice_pld_device *lattice_device);
#endif /* OPENOCD_PLD_ECP5_H */

View File

@ -543,10 +543,10 @@ static const struct command_registration gowin_exec_command_handlers[] = {
.help = "reading user register from FPGA",
.usage = "pld_name",
}, {
.name = "reload",
.name = "refresh",
.mode = COMMAND_EXEC,
.handler = gowin_reload_command_handler,
.help = "reloading bitstream from flash to SRAM",
.help = "reload bitstream from flash to SRAM",
.usage = "pld_name",
},
COMMAND_REGISTRATION_DONE

View File

@ -575,6 +575,35 @@ COMMAND_HANDLER(lattice_read_status_command_handler)
return retval;
}
COMMAND_HANDLER(lattice_refresh_command_handler)
{
if (CMD_ARGC != 1)
return ERROR_COMMAND_SYNTAX_ERROR;
struct pld_device *device = get_pld_device_by_name_or_numstr(CMD_ARGV[0]);
if (!device) {
command_print(CMD, "pld device '#%s' is out of bounds or unknown", CMD_ARGV[0]);
return ERROR_FAIL;
}
struct lattice_pld_device *lattice_device = device->driver_priv;
if (!lattice_device)
return ERROR_FAIL;
int retval = lattice_check_device_family(lattice_device);
if (retval != ERROR_OK)
return retval;
if (lattice_device->family == LATTICE_ECP2 || lattice_device->family == LATTICE_ECP3)
return lattice_ecp2_3_refresh(lattice_device);
else if (lattice_device->family == LATTICE_ECP5)
return lattice_ecp5_refresh(lattice_device);
else if (lattice_device->family == LATTICE_CERTUS)
return lattice_certus_refresh(lattice_device);
return ERROR_FAIL;
}
static const struct command_registration lattice_exec_command_handlers[] = {
{
.name = "read_status",
@ -600,6 +629,12 @@ static const struct command_registration lattice_exec_command_handlers[] = {
.handler = lattice_set_preload_command_handler,
.help = "set length for preload (device specific)",
.usage = "pld_name value",
}, {
.name = "refresh",
.mode = COMMAND_EXEC,
.handler = lattice_refresh_command_handler,
.help = "refresh from configuration memory",
.usage = "pld_name",
},
COMMAND_REGISTRATION_DONE
};

View File

@ -13,6 +13,7 @@
#define PROGRAM_SPI 0x3A
#define LSC_READ_STATUS 0x3C
#define LSC_INIT_ADDRESS 0x46
#define LSC_REFRESH 0x79
#define LSC_BITSTREAM_BURST 0x7A
#define READ_USERCODE 0xC0
#define ISC_ENABLE 0xC6

View File

@ -265,7 +265,7 @@ static int virtex2_load(struct pld_device *pld_device, const char *filename)
return retval;
}
COMMAND_HANDLER(virtex2_handle_program_command)
COMMAND_HANDLER(virtex2_handle_refresh_command)
{
struct pld_device *device;
@ -449,10 +449,10 @@ static const struct command_registration virtex2_exec_command_handlers[] = {
.help = "set instructions codes used for jtag-hub",
.usage = "pld_name user1 [user2 [user3 [user4]]]",
}, {
.name = "program",
.name = "refresh",
.mode = COMMAND_EXEC,
.handler = virtex2_handle_program_command,
.help = "start loading of configuration (refresh)",
.handler = virtex2_handle_refresh_command,
.help = "start loading of configuration (program)",
.usage = "pld_name",
},
COMMAND_REGISTRATION_DONE