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:
parent
198a914cf9
commit
eb22a37b42
|
@ -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
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue