cpld/virtex2: allow JSTART to be disabled
authorRobert Jordens <jordens@gmail.com>
Fri, 3 Jul 2015 05:15:53 +0000 (23:15 -0600)
committerSpencer Oliver <spen@spen-soft.co.uk>
Thu, 6 Aug 2015 12:14:01 +0000 (13:14 +0100)
This adds an option to disable the use of the JSTART instruction
when loading bitstreams to xilinx fpgas. JSTART apparently prevents
configuration if the startup clock is not set to the jtag clock in
the bitstream.

xc3sprog is omitting JSTART for all devices. Problems with loading a bitstream
that does not have StartupClk:JTAGClk are described here:
http://www.xilinx.com/support/answers/56151.html

Change-Id: I8137c0bae05a8c3c6f8e2611869f70a770d1651d
Signed-off-by: Robert Jordens <jordens@gmail.com>
Reviewed-on: http://openocd.zylin.com/2860
Tested-by: jenkins
Reviewed-by: Spencer Oliver <spen@spen-soft.co.uk>
doc/openocd.texi
src/pld/virtex2.c
src/pld/virtex2.h

index 0208fcf835474ee0473ba8d0a54bec0744e13cda..140e86b406756acee46d22af62dadf8350153ef9 100644 (file)
@@ -6274,11 +6274,13 @@ Drivers may support PLD-specific options to the @command{pld device}
 definition command, and may also define commands usable only with
 that particular type of PLD.
 
-@deffn {FPGA Driver} virtex2
+@deffn {FPGA Driver} virtex2 [no_jstart]
 Virtex-II is a family of FPGAs sold by Xilinx.
 It supports the IEEE 1532 standard for In-System Configuration (ISC).
-No driver-specific PLD definition options are used,
-and one driver-specific command is defined.
+
+If @var{no_jstart} is non-zero, the JSTART instruction is not used after
+loading the bitstream. While required for Series2, Series3, and Series6, it
+breaks bitstream loading on Series7.
 
 @deffn {Command} {virtex2 read_stat} num
 Reads and displays the Virtex-II status register (STAT)
index b60056158828c9e6e87547204a72a049f48519c8..82eb788f9576034d1b60c8fa9920180e26642c19 100644 (file)
@@ -159,13 +159,15 @@ static int virtex2_load(struct pld_device *pld_device, const char *filename)
 
        jtag_add_tlr();
 
-       virtex2_set_instr(virtex2_info->tap, 0xc);      /* JSTART */
+       if (!(virtex2_info->no_jstart))
+               virtex2_set_instr(virtex2_info->tap, 0xc);      /* JSTART */
        jtag_add_runtest(13, TAP_IDLE);
-       virtex2_set_instr(virtex2_info->tap, 0x3f);     /* BYPASS */
-       virtex2_set_instr(virtex2_info->tap, 0x3f);     /* BYPASS */
-       virtex2_set_instr(virtex2_info->tap, 0xc);      /* JSTART */
+       virtex2_set_instr(virtex2_info->tap, 0x3f);             /* BYPASS */
+       virtex2_set_instr(virtex2_info->tap, 0x3f);             /* BYPASS */
+       if (!(virtex2_info->no_jstart))
+               virtex2_set_instr(virtex2_info->tap, 0xc);      /* JSTART */
        jtag_add_runtest(13, TAP_IDLE);
-       virtex2_set_instr(virtex2_info->tap, 0x3f);     /* BYPASS */
+       virtex2_set_instr(virtex2_info->tap, 0x3f);             /* BYPASS */
        jtag_execute_queue();
 
        return ERROR_OK;
@@ -212,6 +214,10 @@ PLD_DEVICE_COMMAND_HANDLER(virtex2_pld_device_command)
        virtex2_info = malloc(sizeof(struct virtex2_pld_device));
        virtex2_info->tap = tap;
 
+       virtex2_info->no_jstart = 0;
+       if (CMD_ARGC >= 3)
+               COMMAND_PARSE_NUMBER(int, CMD_ARGV[2], virtex2_info->no_jstart);
+
        pld->driver_priv = virtex2_info;
 
        return ERROR_OK;
index 94419ebf515deb4badfde97a5975c1bd1a3edbfd..8ed1c1c77b4ad6191a684c45465aa1efe5e4ec7b 100644 (file)
@@ -25,6 +25,7 @@
 
 struct virtex2_pld_device {
        struct jtag_tap *tap;
+       int no_jstart;
 };
 
 #endif /* VIRTEX2_H */