* Copyright (C) 2005 by Dominic Rath *
* Dominic.Rath@gmx.de *
* *
- * Copyright (C) 2007,2008 Øyvind Harboe *
+ * Copyright (C) 2007,2008 Øyvind Harboe *
* oyvind.harboe@zylin.com *
* *
* Copyright (C) 2009 SoftPLC Corporation *
#include "jtag.h"
#include "minidriver.h"
#include "interface.h"
+#include "interfaces.h"
#ifdef HAVE_STRINGS_H
#include <strings.h>
{ .name = NULL, .value = -1 }
};
-/* jtag interfaces (parport, FTDI-USB, TI-USB, ...)
- */
-
-#if BUILD_ZY1000 == 1
- extern jtag_interface_t zy1000_interface;
-#elif defined(BUILD_MINIDRIVER_DUMMY)
- extern jtag_interface_t minidummy_interface;
-#else // standard drivers
-#if BUILD_PARPORT == 1
- extern jtag_interface_t parport_interface;
-#endif
-
-#if BUILD_DUMMY == 1
- extern jtag_interface_t dummy_interface;
-#endif
-
-#if BUILD_FT2232_FTD2XX == 1
- extern jtag_interface_t ft2232_interface;
-#endif
-
-#if BUILD_FT2232_LIBFTDI == 1
- extern jtag_interface_t ft2232_interface;
-#endif
-
-#if BUILD_AMTJTAGACCEL == 1
- extern jtag_interface_t amt_jtagaccel_interface;
-#endif
-
-#if BUILD_EP93XX == 1
- extern jtag_interface_t ep93xx_interface;
-#endif
-
-#if BUILD_AT91RM9200 == 1
- extern jtag_interface_t at91rm9200_interface;
-#endif
-
-#if BUILD_GW16012 == 1
- extern jtag_interface_t gw16012_interface;
-#endif
-
-#if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
- extern jtag_interface_t presto_interface;
-#endif
-
-#if BUILD_USBPROG == 1
- extern jtag_interface_t usbprog_interface;
-#endif
-
-#if BUILD_JLINK == 1
- extern jtag_interface_t jlink_interface;
-#endif
-
-#if BUILD_VSLLINK == 1
- extern jtag_interface_t vsllink_interface;
-#endif
-
-#if BUILD_RLINK == 1
- extern jtag_interface_t rlink_interface;
-#endif
-
-#if BUILD_ARMJTAGEW == 1
- extern jtag_interface_t armjtagew_interface;
-#endif
-#endif // standard drivers
-
-/**
- * The list of built-in JTAG interfaces, containing entries for those
- * drivers that were enabled by the @c configure script.
- *
- * The list should be defined to contain either one minidriver interface
- * or some number of standard driver interfaces, never both.
- */
-jtag_interface_t *jtag_interfaces[] = {
-#if BUILD_ZY1000 == 1
- &zy1000_interface,
-#elif defined(BUILD_MINIDRIVER_DUMMY)
- &minidummy_interface,
-#else // standard drivers
-#if BUILD_PARPORT == 1
- &parport_interface,
-#endif
-#if BUILD_DUMMY == 1
- &dummy_interface,
-#endif
-#if BUILD_FT2232_FTD2XX == 1
- &ft2232_interface,
-#endif
-#if BUILD_FT2232_LIBFTDI == 1
- &ft2232_interface,
-#endif
-#if BUILD_AMTJTAGACCEL == 1
- &amt_jtagaccel_interface,
-#endif
-#if BUILD_EP93XX == 1
- &ep93xx_interface,
-#endif
-#if BUILD_AT91RM9200 == 1
- &at91rm9200_interface,
-#endif
-#if BUILD_GW16012 == 1
- &gw16012_interface,
-#endif
-#if BUILD_PRESTO_LIBFTDI == 1 || BUILD_PRESTO_FTD2XX == 1
- &presto_interface,
-#endif
-#if BUILD_USBPROG == 1
- &usbprog_interface,
-#endif
-#if BUILD_JLINK == 1
- &jlink_interface,
-#endif
-#if BUILD_VSLLINK == 1
- &vsllink_interface,
-#endif
-#if BUILD_RLINK == 1
- &rlink_interface,
-#endif
-#if BUILD_ARMJTAGEW == 1
- &armjtagew_interface,
-#endif
-#endif // standard drivers
- NULL,
-};
-
extern jtag_interface_t *jtag_interface;
/* jtag commands */
static int handle_interface_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int handle_jtag_speed_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int handle_jtag_khz_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+static int handle_jtag_rclk_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int handle_jtag_device_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int handle_reset_config_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
static int handle_jtag_nsrst_delay_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
}
if (goi->isconfigure) {
+ bool replace = true;
if (jteap == NULL) {
/* create new */
jteap = calloc(1, sizeof (*jteap));
+ replace = false;
}
jteap->event = n->value;
Jim_GetOpt_Obj(goi, &o);
jteap->body = Jim_DuplicateObj(goi->interp, o);
Jim_IncrRefCount(jteap->body);
- /* add to head of event list */
- jteap->next = tap->event_action;
- tap->event_action = jteap;
+ if (!replace)
+ {
+ /* add to head of event list */
+ jteap->next = tap->event_action;
+ tap->event_action = jteap;
+ }
Jim_SetEmptyResult(goi->interp);
} else {
/* get */
/*
* we expect CHIP + TAP + OPTIONS
* */
- if (goi->argc < 3){
+ if (goi->argc < 3) {
Jim_SetResult_sprintf(goi->interp, "Missing CHIP TAP OPTIONS ....");
+ free(pTap);
return JIM_ERR;
}
Jim_GetOpt_String(goi, &cp, NULL);
/* clear them as we find them */
reqbits = (NTREQ_IRLEN | NTREQ_IRCAPTURE | NTREQ_IRMASK);
- while (goi->argc){
+ while (goi->argc) {
e = Jim_GetOpt_Nvp(goi, opts, &n);
- if (e != JIM_OK){
+ if (e != JIM_OK) {
Jim_GetOpt_NvpUnknown(goi, opts, 0);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return e;
}
LOG_DEBUG("Processing option: %s", n->name);
- switch (n->value){
+ switch (n->value) {
case NTAP_OPT_ENABLED:
pTap->disabled_after_reset = false;
break;
e = Jim_GetOpt_Wide(goi, &w);
if (e != JIM_OK) {
Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return e;
}
new_expected_ids = malloc(sizeof(uint32_t) * (pTap->expected_ids_cnt + 1));
if (new_expected_ids == NULL) {
Jim_SetResult_sprintf(goi->interp, "no memory");
+ free((void *)pTap->dotted_name);
+ free(pTap);
return JIM_ERR;
}
case NTAP_OPT_IRMASK:
case NTAP_OPT_IRCAPTURE:
e = Jim_GetOpt_Wide(goi, &w);
- if (e != JIM_OK){
+ if (e != JIM_OK) {
Jim_SetResult_sprintf(goi->interp, "option: %s bad parameter", n->name);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return e;
}
- switch (n->value){
+ switch (n->value) {
case NTAP_OPT_IRLEN:
if (w > (jim_wide) (8 * sizeof(pTap->ir_capture_value)))
LOG_WARNING("huge IR length %d", (int) w);
if (is_bad_irval(pTap->ir_length, w)) {
LOG_ERROR("IR mask %x too big",
(int) w);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return ERROR_FAIL;
}
pTap->ir_capture_mask = w;
if (is_bad_irval(pTap->ir_length, w)) {
LOG_ERROR("IR capture %x too big",
(int) w);
+ free((void *)pTap->dotted_name);
+ free(pTap);
return ERROR_FAIL;
}
pTap->ir_capture_value = w;
* can't fail. That presumes later code
* will be verifying the scan chains ...
*/
- tap->enabled = (e == JTAG_TAP_EVENT_ENABLE);
+ if (e == JTAG_TAP_EVENT_ENABLE)
+ tap->enabled = true;
}
}
JTAG_CMD_TAPDISABLE,
JTAG_CMD_TAPISENABLED,
JTAG_CMD_CONFIGURE,
- JTAG_CMD_CGET
+ JTAG_CMD_CGET,
+ JTAG_CMD_NAMES,
};
const Jim_Nvp jtag_cmds[] = {
{ .name = "tapdisable" , .value = JTAG_CMD_TAPDISABLE },
{ .name = "configure" , .value = JTAG_CMD_CONFIGURE },
{ .name = "cget" , .value = JTAG_CMD_CGET },
+ { .name = "names" , .value = JTAG_CMD_NAMES },
{ .name = NULL, .value = -1 },
};
Jim_GetOpt_Setup(&goi, interp, argc-1, argv + 1);
e = Jim_GetOpt_Nvp(&goi, jtag_cmds, &n);
- if (e != JIM_OK){
+ if (e != JIM_OK) {
Jim_GetOpt_NvpUnknown(&goi, jtag_cmds, 0);
return e;
}
Jim_SetEmptyResult(goi.interp);
- switch (n->value){
+ switch (n->value) {
case JTAG_CMD_INTERFACE:
/* return the name of the interface */
/* TCL code might need to know the exact type... */
/* FUTURE: we allow this as a means to "set" the interface. */
- if (goi.argc != 0){
+ if (goi.argc != 0) {
Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");
return JIM_ERR;
}
Jim_SetResultString(goi.interp, jtag_interface->name, -1);
return JIM_OK;
case JTAG_CMD_INIT_RESET:
- if (goi.argc != 0){
+ if (goi.argc != 0) {
Jim_WrongNumArgs(goi.interp, 1, goi.argv-1, "(no params)");
return JIM_ERR;
}
e = jtag_init_reset(context);
- if (e != ERROR_OK){
+ if (e != ERROR_OK) {
Jim_SetResult_sprintf(goi.interp, "error: %d", e);
return JIM_ERR;
}
case JTAG_CMD_TAPISENABLED:
case JTAG_CMD_TAPENABLE:
case JTAG_CMD_TAPDISABLE:
- if (goi.argc != 1){
+ if (goi.argc != 1) {
Jim_SetResultString(goi.interp, "Too many parameters",-1);
return JIM_ERR;
}
break;
case JTAG_CMD_CGET:
- if (goi.argc < 2){
- Jim_WrongNumArgs(goi.interp, 0, NULL, "?tap-name? -option ...");
+ if (goi.argc < 2) {
+ Jim_WrongNumArgs(goi.interp, 0, NULL,
+ "cget tap_name queryparm");
return JIM_ERR;
}
Jim_GetOpt_Obj(&goi, &o);
t = jtag_tap_by_jim_obj(goi.interp, o);
- if (t == NULL){
+ if (t == NULL) {
return JIM_ERR;
}
break;
case JTAG_CMD_CONFIGURE:
- if (goi.argc < 3){
- Jim_WrongNumArgs(goi.interp, 0, NULL, "?tap-name? -option ?VALUE? ...");
+ if (goi.argc < 3) {
+ Jim_WrongNumArgs(goi.interp, 0, NULL,
+ "configure tap_name attribute value ...");
return JIM_ERR;
}
Jim_GetOpt_Obj(&goi, &o);
t = jtag_tap_by_jim_obj(goi.interp, o);
- if (t == NULL){
+ if (t == NULL) {
return JIM_ERR;
}
goi.isconfigure = 1;
return jtag_tap_configure_cmd(&goi, t);
}
+ break;
+
+ case JTAG_CMD_NAMES:
+ if (goi.argc != 0) {
+ Jim_WrongNumArgs(goi.interp, 1, goi.argv, "Too many parameters");
+ return JIM_ERR;
+ }
+ Jim_SetResult(goi.interp, Jim_NewListObj(goi.interp, NULL, 0));
+ {
+ jtag_tap_t *tap;
+
+ for (tap = jtag_all_taps(); tap; tap = tap->next_tap) {
+ Jim_ListAppendElement(goi.interp,
+ Jim_GetResult(goi.interp),
+ Jim_NewStringObj(goi.interp,
+ tap->dotted_name, -1));
+ }
+ return JIM_OK;
+ }
+ break;
+
}
return JIM_ERR;
register_command(cmd_ctx, NULL, "jtag_khz", handle_jtag_khz_command,
COMMAND_ANY, "set maximum jtag speed (if supported); "
"parameter is maximum khz, or 0 for adaptive clocking (RTCK).");
+ register_command(cmd_ctx, NULL, "jtag_rclk", handle_jtag_rclk_command,
+ COMMAND_ANY, "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed");
register_command(cmd_ctx, NULL, "jtag_device", handle_jtag_device_command,
COMMAND_CONFIG, "(DEPRECATED) jtag_device <ir_length> <ir_expected> <ir_mask>");
register_command(cmd_ctx, NULL, "reset_config", handle_reset_config_command,
* argv[ 3] = not actually used by anything but in the docs
*/
- if (argc < 4){
+ if (argc < 4) {
command_print(cmd_ctx, "OLD DEPRECATED SYNTAX: Please use the NEW syntax");
return ERROR_OK;
}
Jim_GetString(newargs[9], NULL));
e = jim_jtag_command(interp, 10, newargs);
- if (e != JIM_OK){
+ if (e != JIM_OK) {
command_print(cmd_ctx, "%s", Jim_GetString(Jim_GetResult(interp), NULL));
}
return e;
command_print(cmd_ctx, " TapName | Enabled | IdCode Expected IrLen IrCap IrMask Instr ");
command_print(cmd_ctx, "---|--------------------|---------|------------|------------|------|------|------|---------");
- while (tap){
+ while (tap) {
uint32_t expected, expected_mask, cur_instr, ii;
expected = buf_get_u32(tap->expected, 0, tap->ir_length);
expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length);
{
int retval = ERROR_OK;
+ command_print(cmd_ctx, "OLD SYNTAX: DEPRECATED - "
+ "use jtag_khz, not jtag_speed");
+
if (argc > 1)
return ERROR_COMMAND_SYNTAX_ERROR;
if (argc == 1)
int retval = parse_uint(args[0], &cur_speed);
if (ERROR_OK != retval)
return retval;
- retval = jtag_set_speed(cur_speed);
+ retval = jtag_config_speed(cur_speed);
}
command_print(cmd_ctx, "jtag_speed: %d", jtag_get_speed());
return retval;
}
+static int handle_jtag_rclk_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
+{
+ if (argc > 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+
+ int retval = ERROR_OK;
+ if (argc == 1)
+ {
+ unsigned khz = 0;
+ int retval = parse_uint(args[0], &khz);
+ if (ERROR_OK != retval)
+ return retval;
+ retval = jtag_config_rclk(khz);
+ if (ERROR_OK != retval)
+ return retval;
+ }
+
+ int cur_khz = jtag_get_speed_khz();
+ retval = jtag_get_speed_readable(&cur_khz);
+ if (ERROR_OK != retval)
+ return retval;
+
+ if (cur_khz)
+ command_print(cmd_ctx, "RCLK not supported - fallback to %d kHz", cur_khz);
+ else
+ command_print(cmd_ctx, "RCLK - adaptive");
+
+ return retval;
+}
+
static int handle_jtag_reset_command(struct command_context_s *cmd_ctx,
char *cmd, char **args, int argc)
{
return ERROR_JTAG_INIT_FAILED;
jtag_add_reset(trst, srst);
- jtag_execute_queue();
-
- return ERROR_OK;
+ return jtag_execute_queue();
}
static int handle_runtest_command(struct command_context_s *cmd_ctx,
return retval;
jtag_add_runtest(num_clocks, TAP_IDLE);
- jtag_execute_queue();
-
- return ERROR_OK;
+ return jtag_execute_queue();
}
/*
*/
endstate = TAP_IDLE;
- if (argc >= 4){
+ if (argc >= 4) {
/* have at least one pair of numbers. */
/* is last pair the magic text? */
- if (0 == strcmp("-endstate", args[ argc - 2 ])){
+ if (0 == strcmp("-endstate", args[ argc - 2 ])) {
const char *cpA;
const char *cpS;
cpA = args[ argc-1 ];
- for (endstate = 0 ; endstate < TAP_NUM_STATES ; endstate++){
+ for (endstate = 0 ; endstate < TAP_NUM_STATES ; endstate++) {
cpS = tap_state_name(endstate);
- if (0 == strcmp(cpA, cpS)){
+ if (0 == strcmp(cpA, cpS)) {
break;
}
}
- if (endstate >= TAP_NUM_STATES){
+ if (endstate >= TAP_NUM_STATES) {
return ERROR_COMMAND_SYNTAX_ERROR;
} else {
if (!scan_is_safe(endstate))
tap = jtag_tap_by_string(args[i*2]);
if (tap == NULL)
{
+ int j;
+ for (j = 0; j < i; j++)
+ free(fields[j].out_value);
+ free(fields);
command_print(cmd_ctx, "Tap: %s unknown", args[i*2]);
+
return ERROR_FAIL;
}
int field_size = tap->ir_length;
e = Jim_GetLong(interp, args[i], &bits);
/* If valid - try next arg */
- if (e == JIM_OK){
+ if (e == JIM_OK) {
continue;
}
/* Not valid.. are we at the end? */
- if (((i + 2) != argc)){
+ if (((i + 2) != argc)) {
/* nope, then error */
return e;
}
/* get arg as a string. */
cp = Jim_GetString(args[i], NULL);
/* is it the magic? */
- if (0 == strcmp("-endstate", cp)){
+ if (0 == strcmp("-endstate", cp)) {
/* is the statename valid? */
cp = Jim_GetString(args[i + 1], NULL);
/* see if it is a valid state name */
endstate = tap_state_by_name(cp);
- if (endstate < 0){
+ if (endstate < 0) {
/* update the error message */
Jim_SetResult_sprintf(interp,"endstate: %s invalid", cp);
} else {
}
/* Still an error? */
- if (e != JIM_OK){
+ if (e != JIM_OK) {
return e; /* too bad */
}
} /* validate args */
tap = jtag_tap_by_jim_obj(interp, args[1]);
- if (tap == NULL){
+ if (tap == NULL) {
return JIM_ERR;
}