This is an automated email from Gerrit. "Daniel Anselmi <danse...@gmx.ch>" just uploaded a new patch set to Gerrit, which you can find at https://review.openocd.org/c/openocd/+/7714
-- gerrit commit cad3db951d401fda0eebfd4090cb2cf36e7635e7 Author: Daniel Anselmi <danse...@gmx.ch> Date: Mon Apr 17 01:01:58 2023 +0200 pld/virtex2: add program/refresh command Change-Id: If6d237a6f27c4232849f73d08e7ca74276e6d464 Signed-off-by: Daniel Anselmi <danse...@gmx.ch> diff --git a/doc/openocd.texi b/doc/openocd.texi index 18a7793c61..3693fa6e4e 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -8525,6 +8525,11 @@ Change values for boundary scan instructions. Default are values for Virtex 2 de Change values for boundary scan instructions selecting the registers USER1 to USER4. @end deffn Description of the arguments can be found at command @command{virtex2 set_instr_codes}. + + +@deffn {Command} {virtex2 program} num +Load the bitstream from external memory for FPGA @var{num}. A.k.a. refresh. +@end deffn @end deffn diff --git a/src/pld/virtex2.c b/src/pld/virtex2.c index 58cc2df3c7..c40a00de6d 100644 --- a/src/pld/virtex2.c +++ b/src/pld/virtex2.c @@ -145,6 +145,35 @@ static int virtex2_read_stat(struct pld_device *pld_device, uint32_t *status) return retval; } +static int virtex2_program(struct pld_device *pld_device) +{ + struct virtex2_pld_device *virtex2_info = pld_device->driver_priv; + if (!virtex2_info) + return ERROR_FAIL; + + int retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.jshutdown); + if (retval != ERROR_OK) + return retval; + + retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.jprog_b); + if (retval != ERROR_OK) + return retval; + + jtag_add_runtest(62000, TAP_IDLE); + if (!(virtex2_info->no_jstart)) { + retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.jstart); + if (retval != ERROR_OK) + return retval; + } + + retval = virtex2_set_instr(virtex2_info->tap, virtex2_info->command_set.bypass); + if (retval != ERROR_OK) + return retval; + jtag_add_runtest(2000, TAP_IDLE); + + return jtag_execute_queue(); +} + static int virtex2_load_prepare(struct pld_device *pld_device) { struct virtex2_pld_device *virtex2_info = pld_device->driver_priv; @@ -238,6 +267,24 @@ static int virtex2_load(struct pld_device *pld_device, const char *filename) return retval; } +COMMAND_HANDLER(virtex2_handle_program_command) +{ + struct pld_device *device; + + if (CMD_ARGC < 1) + return ERROR_COMMAND_SYNTAX_ERROR; + + unsigned int dev_id; + COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], dev_id); + device = get_pld_device_by_num(dev_id); + if (!device) { + command_print(CMD, "pld device '#%s' is out of bounds", CMD_ARGV[0]); + return ERROR_FAIL; + } + + return virtex2_program(device); +} + COMMAND_HANDLER(virtex2_handle_read_stat_command) { struct pld_device *device; @@ -412,6 +459,12 @@ static const struct command_registration virtex2_exec_command_handlers[] = { .handler = virtex2_handle_set_user_codes_command, .help = "set instructions codes used for jtag-hub", .usage = "device.tap user1 [user2 [user3 [user4]]]", + }, { + .name = "program", + .mode = COMMAND_EXEC, + .handler = virtex2_handle_program_command, + .help = "start loading of configuration (refresh)", + .usage = "pld_num", }, COMMAND_REGISTRATION_DONE }; diff --git a/tcl/cpld/xilinx-xc6s.cfg b/tcl/cpld/xilinx-xc6s.cfg index 8d7c1708ea..1794b7c036 100644 --- a/tcl/cpld/xilinx-xc6s.cfg +++ b/tcl/cpld/xilinx-xc6s.cfg @@ -30,18 +30,9 @@ virtex2 set_user_codes $_CHIPNAME.tap 0x02 0x03 0x1A 0x1B set XC6S_CFG_IN 0x05 set XC6S_JSHUTDOWN 0x0d -set XC6S_JPROGRAM 0x0b set XC6S_JSTART 0x0c set XC6S_BYPASS 0x3f -proc xc6s_program {tap} { - global XC6S_JSHUTDOWN XC6S_JPROGRAM XC6S_JSTART XC6S_BYPASS - irscan $tap $XC6S_JSHUTDOWN - irscan $tap $XC6S_JPROGRAM - irscan $tap $XC6S_JSTART - irscan $tap $XC6S_BYPASS -} - #xtp038 and xc3sprog approach proc xc6s_program_iprog {tap} { global XC6S_JSHUTDOWN XC6S_JSTART XC6S_BYPASS XC6S_CFG_IN diff --git a/tcl/cpld/xilinx-xc7.cfg b/tcl/cpld/xilinx-xc7.cfg index 04bcb273fc..72475c5704 100644 --- a/tcl/cpld/xilinx-xc7.cfg +++ b/tcl/cpld/xilinx-xc7.cfg @@ -52,19 +52,3 @@ jtag newtap $_CHIPNAME tap -irlen 6 -ignore-version \ pld device virtex2 $_CHIPNAME.tap 1 virtex2 set_user_codes $_CHIPNAME.tap 0x02 0x03 0x22 0x23 -set XC7_JSHUTDOWN 0x0d -set XC7_JPROGRAM 0x0b -set XC7_JSTART 0x0c -set XC7_BYPASS 0x3f - -proc xc7_program {tap} { - global XC7_JSHUTDOWN XC7_JPROGRAM XC7_JSTART XC7_BYPASS - irscan $tap $XC7_JSHUTDOWN - irscan $tap $XC7_JPROGRAM - runtest 60000 - #JSTART prevents this from working... - #irscan $tap $XC7_JSTART - runtest 2000 - irscan $tap $XC7_BYPASS - runtest 2000 -} --