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
-}

-- 

Reply via email to