From 2d99a0defa8fde13d4f421d54dbb6246b908303d Mon Sep 17 00:00:00 2001 From: Robert Jordens Date: Thu, 2 Jul 2015 23:15:53 -0600 Subject: [PATCH] cpld/virtex2: allow JSTART to be disabled 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 Reviewed-on: http://openocd.zylin.com/2860 Tested-by: jenkins Reviewed-by: Spencer Oliver --- doc/openocd.texi | 8 +++++--- src/pld/virtex2.c | 16 +++++++++++----- src/pld/virtex2.h | 1 + 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/doc/openocd.texi b/doc/openocd.texi index 0208fcf8..140e86b4 100644 --- a/doc/openocd.texi +++ b/doc/openocd.texi @@ -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) diff --git a/src/pld/virtex2.c b/src/pld/virtex2.c index b6005615..82eb788f 100644 --- a/src/pld/virtex2.c +++ b/src/pld/virtex2.c @@ -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; diff --git a/src/pld/virtex2.h b/src/pld/virtex2.h index 94419ebf..8ed1c1c7 100644 --- a/src/pld/virtex2.h +++ b/src/pld/virtex2.h @@ -25,6 +25,7 @@ struct virtex2_pld_device { struct jtag_tap *tap; + int no_jstart; }; #endif /* VIRTEX2_H */ -- 2.39.5