diff --git a/doc/openocd.texi b/doc/openocd.texi index 0208fcf83..140e86b40 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 b60056158..82eb788f9 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 94419ebf5..8ed1c1c77 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 */