/***************************************************************************
- * Copyright (C) 2007-2008 by Øyvind Harboe *
+ * Copyright (C) 2007-2009 by Øyvind Harboe *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
#endif
#include "embeddedice.h"
-#include "minidriver.h"
-#include "interface.h"
+#include <jtag/minidriver.h>
+#include <jtag/interface.h>
#include "zy1000_version.h"
#include <cyg/hal/hal_io.h> // low level i/o
#include <cyg/hal/hal_diag.h>
+#include <time.h>
+
#define ZYLIN_VERSION GIT_ZY1000_VERSION
#define ZYLIN_DATE __DATE__
#define ZYLIN_TIME __TIME__
#define ZYLIN_OPENOCD GIT_OPENOCD_VERSION
-#define ZYLIN_OPENOCD_VERSION "Zylin JTAG ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE " " ZYLIN_TIME
-
-/* low level command set
- */
-void zy1000_reset(int trst, int srst);
-
+#define ZYLIN_OPENOCD_VERSION "ZY1000 " ZYLIN_VERSION " " ZYLIN_DATE
-int zy1000_speed(int speed);
-int zy1000_register_commands(struct command_context_s *cmd_ctx);
-int zy1000_init(void);
-int zy1000_quit(void);
-
-/* interface commands */
-int zy1000_handle_zy1000_port_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int zy1000_khz(int khz, int *jtag_speed)
{
return ERROR_OK;
}
-
-jtag_interface_t zy1000_interface =
-{
- .name = "ZY1000",
- .execute_queue = NULL,
- .speed = zy1000_speed,
- .register_commands = zy1000_register_commands,
- .init = zy1000_init,
- .quit = zy1000_quit,
- .khz = zy1000_khz,
- .speed_div = zy1000_speed_div,
- .power_dropout = zy1000_power_dropout,
- .srst_asserted = zy1000_srst_asserted,
-};
-
void zy1000_reset(int trst, int srst)
{
LOG_DEBUG("zy1000 trst=%d, srst=%d", trst, srst);
}
}
-int handle_power_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+COMMAND_HANDLER(handle_power_command)
{
- if (argc > 1)
+ switch (CMD_ARGC)
{
- return ERROR_INVALID_ARGUMENTS;
+ case 1: {
+ bool enable;
+ COMMAND_PARSE_ON_OFF(CMD_ARGV[0], enable);
+ setPower(enable);
+ // fall through
}
-
- if (argc == 1)
- {
- if (strcmp(args[0], "on") == 0)
- {
- setPower(1);
- }
- else if (strcmp(args[0], "off") == 0)
- {
- setPower(0);
- } else
- {
- command_print(cmd_ctx, "arg is \"on\" or \"off\"");
- return ERROR_INVALID_ARGUMENTS;
- }
+ case 0:
+ LOG_INFO("Target power %s", savePower ? "on" : "off");
+ break;
+ default:
+ return ERROR_INVALID_ARGUMENTS;
}
- command_print(cmd_ctx, "Target power %s", savePower ? "on" : "off");
-
return ERROR_OK;
}
/* Give TELNET a way to find out what version this is */
static int jim_zy1000_version(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
- if ((argc < 1) || (argc > 2))
+ if ((argc < 1) || (argc > 3))
return JIM_ERR;
- char buff[128];
const char *version_str = NULL;
if (argc == 1)
} else
{
const char *str = Jim_GetString(argv[1], NULL);
+ const char *str2 = NULL;
+ if (argc > 2)
+ str2 = Jim_GetString(argv[2], NULL);
if (strcmp("openocd", str) == 0)
{
version_str = ZYLIN_OPENOCD;
{
version_str = ZYLIN_DATE;
}
+ else if (strcmp("time", str) == 0)
+ {
+ version_str = ZYLIN_TIME;
+ }
else if (strcmp("pcb", str) == 0)
{
#ifdef CYGPKG_HAL_NIOS2
version_str="b";
#endif
}
+#ifdef CYGPKG_HAL_NIOS2
+ else if (strcmp("fpga", str) == 0)
+ {
+
+ /* return a list of 32 bit integers to describe the expected
+ * and actual FPGA
+ */
+ static char *fpga_id = "0x12345678 0x12345678 0x12345678 0x12345678";
+ cyg_uint32 id, timestamp;
+ HAL_READ_UINT32(SYSID_BASE, id);
+ HAL_READ_UINT32(SYSID_BASE+4, timestamp);
+ sprintf(fpga_id, "0x%08x 0x%08x 0x%08x 0x%08x", id, timestamp, SYSID_ID, SYSID_TIMESTAMP);
+ version_str = fpga_id;
+ if ((argc>2) && (strcmp("time", str2) == 0))
+ {
+ time_t last_mod = timestamp;
+ char * t = ctime (&last_mod) ;
+ t[strlen(t)-1] = 0;
+ version_str = t;
+ }
+ }
+#endif
+
else
{
return JIM_ERR;
return JIM_OK;
}
-int zy1000_register_commands(struct command_context_s *cmd_ctx)
-{
- register_command(cmd_ctx, NULL, "power", handle_power_command, COMMAND_ANY,
- "power <on/off> - turn power switch to target on/off. No arguments - print status.");
-
- Jim_CreateCommand(interp, "zy1000_version", jim_zy1000_version, NULL, NULL);
-
-
- Jim_CreateCommand(interp, "powerstatus", zylinjtag_Jim_Command_powerstatus, NULL, NULL);
-
-#ifdef CYGPKG_HAL_NIOS2
- Jim_CreateCommand(interp, "updatezy1000firmware", jim_zy1000_writefirmware, NULL, NULL);
-#endif
-
-
- return ERROR_OK;
-}
-
}
#endif
-extern int jtag_check_value(uint8_t *captured, void *priv);
-
static void gotoEndState(tap_state_t end_state)
{
setCurrentState(end_state);
}
-static __inline void scanFields(int num_fields, const scan_field_t *fields, tap_state_t shiftState, int pause)
+static __inline void scanFields(int num_fields, const struct scan_field *fields, tap_state_t shiftState, int pause)
{
int i;
int j;
}
}
/* mask away unused bits for easier debugging */
- value&=~(((uint32_t)0xffffffff) << k);
+ if (k < 32)
+ {
+ value&=~(((uint32_t)0xffffffff) << k);
+ } else
+ {
+ /* Shifting by >= 32 is not defined by the C standard
+ * and will in fact shift by &0x1f bits on nios */
+ }
shiftValueInner(shiftState, pause_state, k, value);
}
}
-int interface_jtag_set_end_state(tap_state_t state)
-{
- return ERROR_OK;
-}
-
-
-int interface_jtag_add_ir_scan(int num_fields, const scan_field_t *fields, tap_state_t state)
+int interface_jtag_add_ir_scan(int num_fields, const struct scan_field *fields, tap_state_t state)
{
int j;
int scan_size = 0;
- jtag_tap_t *tap, *nextTap;
+ struct jtag_tap *tap, *nextTap;
for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap)
{
nextTap = jtag_tap_next_enabled(tap);
/* if a device isn't listed, set it to BYPASS */
uint8_t ones[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
- scan_field_t tmp;
+ struct scan_field tmp;
memset(&tmp, 0, sizeof(tmp));
tmp.out_value = ones;
tmp.num_bits = scan_size;
-int interface_jtag_add_plain_ir_scan(int num_fields, const scan_field_t *fields, tap_state_t state)
+int interface_jtag_add_plain_ir_scan(int num_fields, const struct scan_field *fields, tap_state_t state)
{
scanFields(num_fields, fields, TAP_IRSHIFT, 1);
gotoEndState(state);
return ERROR_OK;
}
-/*extern jtag_command_t **jtag_get_last_command_p(void);*/
-
-int interface_jtag_add_dr_scan(int num_fields, const scan_field_t *fields, tap_state_t state)
+int interface_jtag_add_dr_scan(int num_fields, const struct scan_field *fields, tap_state_t state)
{
int j;
- jtag_tap_t *tap, *nextTap;
+ struct jtag_tap *tap, *nextTap;
for (tap = jtag_tap_next_enabled(NULL); tap!= NULL; tap = nextTap)
{
nextTap = jtag_tap_next_enabled(tap);
}
if (!found)
{
- scan_field_t tmp;
+ struct scan_field tmp;
/* program the scan field to 1 bit length, and ignore it's value */
tmp.num_bits = 1;
tmp.out_value = NULL;
return ERROR_OK;
}
-int interface_jtag_add_plain_dr_scan(int num_fields, const scan_field_t *fields, tap_state_t state)
+int interface_jtag_add_plain_dr_scan(int num_fields, const struct scan_field *fields, tap_state_t state)
{
scanFields(num_fields, fields, TAP_DRSHIFT, 1);
gotoEndState(state);
-void embeddedice_write_dcc(jtag_tap_t *tap, int reg_addr, uint8_t *buffer, int little, int count)
+void embeddedice_write_dcc(struct jtag_tap *tap, int reg_addr, uint8_t *buffer, int little, int count)
{
// static int const reg_addr = 0x5;
tap_state_t end_state = jtag_get_end_state();
}
+static const struct command_registration zy1000_commands[] = {
+ {
+ .name = "power",
+ .handler = &handle_power_command,
+ .mode = COMMAND_ANY,
+ .help = "turn power switch to target on/off. No arguments - print status.",
+ .usage = "power <on/off>",
+ },
+ {
+ .name = "zy1000_version",
+ .mode = COMMAND_ANY,
+ .jim_handler = &jim_zy1000_version,
+ .help = "print version info for zy1000",
+ },
+ {
+ .name = "powerstatus",
+ .mode = COMMAND_ANY,
+ .jim_handler = & zylinjtag_Jim_Command_powerstatus,
+ .help = "print power status of target",
+ },
+#ifdef CYGPKG_HAL_NIOS2
+ {
+ .name = "updatezy1000firmware",
+ .mode = COMMAND_ANY,
+ .jim_handler = &jim_zy1000_writefirmware,
+ .help = "writes firmware to flash",
+ },
+#endif
+ COMMAND_REGISTRATION_DONE
+};
+
+
+
+struct jtag_interface zy1000_interface =
+{
+ .name = "ZY1000",
+ .execute_queue = NULL,
+ .speed = zy1000_speed,
+ .commands = zy1000_commands,
+ .init = zy1000_init,
+ .quit = zy1000_quit,
+ .khz = zy1000_khz,
+ .speed_div = zy1000_speed_div,
+ .power_dropout = zy1000_power_dropout,
+ .srst_asserted = zy1000_srst_asserted,
+};
+