* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
+
+/* This file supports the zy1000 debugger: http://www.zylin.com/zy1000.html
+ *
+ * The zy1000 is a standalone debugger that has a web interface and
+ * requires no drivers on the developer host as all communication
+ * is via TCP/IP. The zy1000 gets it performance(~400-700kBytes/s
+ * DCC downloads @ 16MHz target) as it has an FPGA to hardware
+ * accelerate the JTAG commands, while offering *very* low latency
+ * between OpenOCD and the FPGA registers.
+ *
+ * The disadvantage of the zy1000 is that it has a feeble CPU compared to
+ * a PC(ca. 50-500 DMIPS depending on how one counts it), whereas a PC
+ * is on the order of 10000 DMIPS(i.e. at a factor of 20-200).
+ *
+ * The zy1000 revc hardware is using an Altera Nios CPU, whereas the
+ * revb is using ARM7 + Xilinx.
+ *
+ * See Zylin web pages or contact Zylin for more information.
+ *
+ * The reason this code is in OpenOCD rather than OpenOCD linked with the
+ * ZY1000 code is that OpenOCD is the long road towards getting
+ * libopenocd into place. libopenocd will support both low performance,
+ * low latency systems(embedded) and high performance high latency
+ * systems(PCs).
+ */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
-#include "embeddedice.h"
+#include <target/embeddedice.h>
#include <jtag/minidriver.h>
#include <jtag/interface.h>
#include "zy1000_version.h"
#include <time.h>
+#ifdef CYGPKG_HAL_NIOS2
+#include <cyg/hal/io.h>
+#include <cyg/firmwareutil/firmwareutil.h>
+#endif
+
#define ZYLIN_VERSION GIT_ZY1000_VERSION
#define ZYLIN_DATE __DATE__
#define ZYLIN_TIME __TIME__
{
cyg_uint32 state;
// sample and clear power dropout
- HAL_WRITE_UINT32(ZY1000_JTAG_BASE + 0x10, 0x80);
- HAL_READ_UINT32(ZY1000_JTAG_BASE + 0x10, state);
+ ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x80);
+ ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, state);
bool powerDropout;
powerDropout = (state & 0x80) != 0;
return powerDropout;
{
cyg_uint32 state;
// sample and clear SRST sensing
- HAL_WRITE_UINT32(ZY1000_JTAG_BASE + 0x10, 0x00000040);
- HAL_READ_UINT32(ZY1000_JTAG_BASE + 0x10, state);
+ ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x00000040);
+ ZY1000_PEEK(ZY1000_JTAG_BASE + 0x10, state);
bool srstAsserted;
srstAsserted = (state & 0x40) != 0;
return srstAsserted;
void zy1000_reset(int trst, int srst)
{
LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst);
+
+ /* flush the JTAG FIFO. Not flushing the queue before messing with
+ * reset has such interesting bugs as causing hard to reproduce
+ * RCLK bugs as RCLK will stop responding when TRST is asserted
+ */
+ waitIdle();
+
if (!srst)
{
ZY1000_POKE(ZY1000_JTAG_BASE + 0x14, 0x00000001);
if (trst||(srst && (jtag_get_reset_config() & RESET_SRST_PULLS_TRST)))
{
- waitIdle();
/* we're now in the RESET state until trst is deasserted */
ZY1000_POKE(ZY1000_JTAG_BASE + 0x20, TAP_RESET);
} else
savePower = power;
if (power)
{
- HAL_WRITE_UINT32(ZY1000_JTAG_BASE + 0x14, 0x8);
+ ZY1000_POKE(ZY1000_JTAG_BASE + 0x14, 0x8);
} else
{
- HAL_WRITE_UINT32(ZY1000_JTAG_BASE + 0x10, 0x8);
+ ZY1000_POKE(ZY1000_JTAG_BASE + 0x10, 0x8);
}
}
#ifdef CYGPKG_HAL_NIOS2
+
+
+struct info_forward
+{
+ void *data;
+ struct cyg_upgrade_info *upgraded_file;
+};
+
+static void report_info(void *data, const char * format, va_list args)
+{
+ char *s = alloc_vprintf(format, args);
+ LOG_USER_N("%s", s);
+ free(s);
+}
+
+struct cyg_upgrade_info firmware_info =
+{
+ (cyg_uint8 *)0x84000000,
+ "/ram/firmware.phi",
+ "Firmware",
+ 0x0300000,
+ 0x1f00000 -
+ 0x0300000,
+ "ZylinNiosFirmware\n",
+ report_info,
+};
+
static int jim_zy1000_writefirmware(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
if (argc != 2)
return JIM_ERR;
int length;
- int stat;
const char *str = Jim_GetString(argv[1], &length);
- /* BUG!!!! skip header! */
- void *firmware_address=0x4000000;
- int firmware_length=0x100000;
-
- if (length>firmware_length)
+ /* */
+ int tmpFile;
+ if ((tmpFile = open(firmware_info.file, O_RDWR | O_CREAT | O_TRUNC)) <= 0)
+ {
+ return JIM_ERR;
+ }
+ bool success;
+ success = write(tmpFile, str, length) == length;
+ close(tmpFile);
+ if (!success)
return JIM_ERR;
- void *err_addr;
-
- if ((stat = flash_erase((void *)firmware_address, firmware_length, (void **)&err_addr)) != 0)
- {
- return JIM_ERR;
- }
-
- if ((stat = flash_program(firmware_address, str, length, (void **)&err_addr)) != 0)
- return JIM_ERR;
+ if (!cyg_firmware_upgrade(NULL, firmware_info))
+ return JIM_ERR;
- return JIM_OK;
+ return JIM_OK;
}
#endif
static const struct command_registration zy1000_commands[] = {
{
.name = "power",
- .handler = &handle_power_command,
+ .handler = handle_power_command,
.mode = COMMAND_ANY,
- .help = "turn power switch to target on/off. No arguments - print status.",
- .usage = "power <on/off>",
+ .help = "Turn power switch to target on/off. "
+ "With no arguments, prints status.",
+ .usage = "('on'|'off)",
},
{
.name = "zy1000_version",
.mode = COMMAND_ANY,
- .jim_handler = &jim_zy1000_version,
- .help = "print version info for zy1000",
+ .jim_handler = jim_zy1000_version,
+ .help = "Print version info for zy1000.",
+ .usage = "['openocd'|'zy1000'|'date'|'time'|'pcb'|'fpga']",
},
{
.name = "powerstatus",
.mode = COMMAND_ANY,
- .jim_handler = & zylinjtag_Jim_Command_powerstatus,
- .help = "print power status of target",
+ .jim_handler = zylinjtag_Jim_Command_powerstatus,
+ .help = "Returns power status of target",
},
#ifdef CYGPKG_HAL_NIOS2
{
.name = "updatezy1000firmware",
.mode = COMMAND_ANY,
- .jim_handler = &jim_zy1000_writefirmware,
+ .jim_handler = jim_zy1000_writefirmware,
.help = "writes firmware to flash",
+ /* .usage = "some_string", */
},
#endif
COMMAND_REGISTRATION_DONE