extern struct target_type arm11_target;
extern struct target_type mips_m4k_target;
extern struct target_type avr_target;
+extern struct target_type testee_target;
struct target_type *target_types[] =
{
&arm11_target,
&mips_m4k_target,
&avr_target,
+ &testee_target,
NULL,
};
{ .value = TARGET_EVENT_RESET_START, .name = "reset-start" },
{ .value = TARGET_EVENT_RESET_ASSERT_PRE, .name = "reset-assert-pre" },
+ { .value = TARGET_EVENT_RESET_ASSERT, .name = "reset-assert" },
{ .value = TARGET_EVENT_RESET_ASSERT_POST, .name = "reset-assert-post" },
{ .value = TARGET_EVENT_RESET_DEASSERT_PRE, .name = "reset-deassert-pre" },
{ .value = TARGET_EVENT_RESET_DEASSERT_POST, .name = "reset-deassert-post" },
{ .value = TARGET_EVENT_RESET_HALT_POST, .name = "reset-halt-post" },
{ .value = TARGET_EVENT_RESET_WAIT_PRE, .name = "reset-wait-pre" },
{ .value = TARGET_EVENT_RESET_WAIT_POST, .name = "reset-wait-post" },
- { .value = TARGET_EVENT_RESET_INIT , .name = "reset-init" },
- { .value = TARGET_EVENT_RESET_END, .name = "reset-end" },
+ { .value = TARGET_EVENT_RESET_INIT, .name = "reset-init" },
+ { .value = TARGET_EVENT_RESET_END, .name = "reset-end" },
{ .value = TARGET_EVENT_EXAMINE_START, .name = "examine-start" },
{ .value = TARGET_EVENT_EXAMINE_END, .name = "examine-end" },
}
return retval;
}
-const char *target_get_name(struct target *target)
+const char *target_type_name(struct target *target)
{
return target->type->name;
}
}
if (!target->type->soft_reset_halt_imp) {
LOG_ERROR("Target %s does not support soft_reset_halt",
- target->cmd_name);
+ target_name(target));
return ERROR_FAIL;
}
return target->type->soft_reset_halt_imp(target);
int target_add_breakpoint(struct target *target,
struct breakpoint *breakpoint)
{
+ if (target->state != TARGET_HALTED) {
+ LOG_WARNING("target %s is not halted", target->cmd_name);
+ return ERROR_TARGET_NOT_HALTED;
+ }
return target->type->add_breakpoint(target, breakpoint);
}
int target_remove_breakpoint(struct target *target,
int target_add_watchpoint(struct target *target,
struct watchpoint *watchpoint)
{
+ if (target->state != TARGET_HALTED) {
+ LOG_WARNING("target %s is not halted", target->cmd_name);
+ return ERROR_TARGET_NOT_HALTED;
+ }
return target->type->add_watchpoint(target, watchpoint);
}
int target_remove_watchpoint(struct target *target,
if ((retval = target->type->init_target(cmd_ctx, target)) != ERROR_OK)
{
- LOG_ERROR("target '%s' init failed", target_get_name(target));
+ LOG_ERROR("target '%s' init failed", target_name(target));
return retval;
}
target->type->mcr = default_mcr;
} else
{
- /* FIX! multiple targets will generally register global commands
- * multiple times. Only register this one if *one* of the
- * targets need the command. Hmm... make it a command on the
- * Jim Tcl target object?
- */
- register_jim(cmd_ctx, "mcr", jim_mcrmrc, "write coprocessor <cpnum> <op1> <op2> <CRn> <CRm> <value>");
+ const struct command_registration mcr_cmd = {
+ .name = "mcr",
+ .mode = COMMAND_EXEC,
+ .jim_handler = &jim_mcrmrc,
+ .help = "write coprocessor",
+ .usage = "<cpnum> <op1> <op2> <CRn> <CRm> <value>",
+ };
+ register_command(cmd_ctx, NULL, &mcr_cmd);
}
if (target->type->mrc == NULL)
target->type->mrc = default_mrc;
} else
{
- register_jim(cmd_ctx, "mrc", jim_mcrmrc, "read coprocessor <cpnum> <op1> <op2> <CRn> <CRm>");
+ const struct command_registration mrc_cmd = {
+ .name = "mrc",
+ .jim_handler = &jim_mcrmrc,
+ .help = "read coprocessor",
+ .usage = "<cpnum> <op1> <op2> <CRn> <CRm>",
+ };
+ register_command(cmd_ctx, NULL, &mrc_cmd);
}
command_print(CMD_CTX, "%2d%c %-18s %-10s %-6s %-18s %s",
target->target_number,
marker,
- target->cmd_name,
- target_get_name(target),
+ target_name(target),
+ target_type_name(target),
Jim_Nvp_value2name_simple(nvp_target_endian,
target->endianness)->name,
target->tap->dotted_name,
if (teap->event == e) {
LOG_DEBUG("target: (%d) %s (%s) event: %d (%s) action: %s",
target->target_number,
- target->cmd_name,
- target_get_name(target),
+ target_name(target),
+ target_type_name(target),
e,
Jim_Nvp_value2name_simple(nvp_target_event, e)->name,
Jim_GetString(teap->body, NULL));
}
}
+/**
+ * Returns true only if the target has a handler for the specified event.
+ */
+bool target_has_event_action(struct target *target, enum target_event event)
+{
+ struct target_event_action *teap;
+
+ for (teap = target->event_action; teap != NULL; teap = teap->next) {
+ if (teap->event == event)
+ return true;
+ }
+ return false;
+}
+
enum target_cfg_param {
TCFG_TYPE,
TCFG_EVENT,
case TCFG_TYPE:
/* not setable */
if (goi->isconfigure) {
- Jim_SetResult_sprintf(goi->interp, "not setable: %s", n->name);
+ Jim_SetResult_sprintf(goi->interp,
+ "not settable: %s", n->name);
return JIM_ERR;
} else {
no_params:
if (goi->argc != 0) {
- Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "NO PARAMS");
+ Jim_WrongNumArgs(goi->interp,
+ goi->argc, goi->argv,
+ "NO PARAMS");
return JIM_ERR;
}
}
- Jim_SetResultString(goi->interp, target_get_name(target), -1);
+ Jim_SetResultString(goi->interp,
+ target_type_name(target), -1);
/* loop for more */
break;
case TCFG_EVENT:
|| !target->type->deassert_reset) {
Jim_SetResult_sprintf(interp,
"No target-specific reset for %s",
- target->cmd_name);
+ target_name(target));
return JIM_ERR;
}
/* determine if we should halt or not. */
e = target_wait_state(target, n->value, a);
if (e != ERROR_OK) {
Jim_SetResult_sprintf(goi.interp,
- "target: %s wait %s fails (%d) %s",
- target->cmd_name,
- n->name,
- e, target_strerror_safe(e));
+ "target: %s wait %s fails (%d) %s",
+ target_name(target), n->name,
+ e, target_strerror_safe(e));
return JIM_ERR;
} else {
return JIM_OK;
{
struct target_event_action *teap;
teap = target->event_action;
- command_print(cmd_ctx, "Event actions for target (%d) %s\n",
- target->target_number,
- target->cmd_name);
+ command_print(cmd_ctx,
+ "Event actions for target (%d) %s\n",
+ target->target_number,
+ target_name(target));
command_print(cmd_ctx, "%-25s | Body", "Event");
command_print(cmd_ctx, "------------------------- | ----------------------------------------");
while (teap) {
}
/* now - create the new target name command */
- e = Jim_CreateCommand(goi->interp,
- /* name */
- cp,
- tcl_target_func, /* C function */
- target, /* private data */
- NULL); /* no del proc */
-
- return e;
+ const struct command_registration target_command = {
+ .name = cp,
+ .jim_handler = &tcl_target_func,
+ .jim_handler_data = target,
+ .help = "target command group",
+ };
+ struct command *c = register_command(cmd_ctx, NULL, &target_command);
+ return (NULL != c) ? ERROR_OK : ERROR_FAIL;
}
-static int jim_target(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+static int jim_target_current(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
{
- int x,r,e;
- jim_wide w;
- struct command_context *cmd_ctx;
- struct target *target;
- Jim_GetOptInfo goi;
- enum tcmd {
- /* TG = target generic */
- TG_CMD_CREATE,
- TG_CMD_TYPES,
- TG_CMD_NAMES,
- TG_CMD_CURRENT,
- TG_CMD_NUMBER,
- TG_CMD_COUNT,
- };
- const char *target_cmds[] = {
- "create", "types", "names", "current", "number",
- "count",
- NULL /* terminate */
- };
-
- LOG_DEBUG("Target command params:");
- LOG_DEBUG("%s", Jim_Debug_ArgvString(interp, argc, argv));
-
- cmd_ctx = Jim_GetAssocData(interp, "context");
+ if (argc != 1)
+ {
+ Jim_WrongNumArgs(interp, 1, argv, "Too many parameters");
+ return JIM_ERR;
+ }
+ struct command_context *cmd_ctx = Jim_GetAssocData(interp, "context");
+ Jim_SetResultString(interp, get_current_target(cmd_ctx)->cmd_name, -1);
+ return JIM_OK;
+}
- Jim_GetOpt_Setup(&goi, interp, argc-1, argv + 1);
+static int jim_target_types(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+ if (argc != 1)
+ {
+ Jim_WrongNumArgs(interp, 1, argv, "Too many parameters");
+ return JIM_ERR;
+ }
+ Jim_SetResult(interp, Jim_NewListObj(interp, NULL, 0));
+ for (unsigned x = 0; NULL != target_types[x]; x++)
+ {
+ Jim_ListAppendElement(interp, Jim_GetResult(interp),
+ Jim_NewStringObj(interp, target_types[x]->name, -1));
+ }
+ return JIM_OK;
+}
- if (goi.argc == 0) {
- Jim_WrongNumArgs(interp, 1, argv, "missing: command ...");
+static int jim_target_names(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+ if (argc != 1)
+ {
+ Jim_WrongNumArgs(interp, 1, argv, "Too many parameters");
return JIM_ERR;
}
+ Jim_SetResult(interp, Jim_NewListObj(interp, NULL, 0));
+ struct target *target = all_targets;
+ while (target)
+ {
+ Jim_ListAppendElement(interp, Jim_GetResult(interp),
+ Jim_NewStringObj(interp, target_name(target), -1));
+ target = target->next;
+ }
+ return JIM_OK;
+}
- /* Jim_GetOpt_Debug(&goi); */
- r = Jim_GetOpt_Enum(&goi, target_cmds, &x);
- if (r != JIM_OK) {
- return r;
+static int jim_target_create(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+ Jim_GetOptInfo goi;
+ Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
+ if (goi.argc < 3)
+ {
+ Jim_WrongNumArgs(goi.interp, goi.argc, goi.argv,
+ "<name> <target_type> [<target_options> ...]");
+ return JIM_ERR;
}
+ return target_create(&goi);
+}
- switch (x) {
- default:
- Jim_Panic(goi.interp,"Why am I here?");
+static int jim_target_number(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+ Jim_GetOptInfo goi;
+ Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
+
+ /* It's OK to remove this mechanism sometime after August 2010 or so */
+ LOG_WARNING("don't use numbers as target identifiers; use names");
+ if (goi.argc != 1)
+ {
+ Jim_SetResult_sprintf(goi.interp, "usage: target number <number>");
return JIM_ERR;
- case TG_CMD_CURRENT:
- if (goi.argc != 0) {
- Jim_WrongNumArgs(goi.interp, 1, goi.argv, "Too many parameters");
- return JIM_ERR;
- }
- Jim_SetResultString(goi.interp, get_current_target(cmd_ctx)->cmd_name, -1);
- return JIM_OK;
- case TG_CMD_TYPES:
- 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));
- for (x = 0 ; target_types[x] ; x++) {
- Jim_ListAppendElement(goi.interp,
- Jim_GetResult(goi.interp),
- Jim_NewStringObj(goi.interp, target_types[x]->name, -1));
- }
- return JIM_OK;
- case TG_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));
- target = all_targets;
- while (target) {
- Jim_ListAppendElement(goi.interp,
- Jim_GetResult(goi.interp),
- Jim_NewStringObj(goi.interp, target->cmd_name, -1));
- target = target->next;
- }
- return JIM_OK;
- case TG_CMD_CREATE:
- if (goi.argc < 3) {
- Jim_WrongNumArgs(goi.interp, goi.argc, goi.argv, "?name ... config options ...");
- return JIM_ERR;
- }
- return target_create(&goi);
- break;
- case TG_CMD_NUMBER:
- /* It's OK to remove this mechanism sometime after August 2010 or so */
- LOG_WARNING("don't use numbers as target identifiers; use names");
- if (goi.argc != 1) {
- Jim_SetResult_sprintf(goi.interp, "expected: target number ?NUMBER?");
- return JIM_ERR;
- }
- e = Jim_GetOpt_Wide(&goi, &w);
- if (e != JIM_OK) {
- return JIM_ERR;
- }
- for (x = 0, target = all_targets; target; target = target->next, x++) {
- if (target->target_number == w)
- break;
- }
- if (target == NULL) {
- Jim_SetResult_sprintf(goi.interp,
- "Target: number %d does not exist", (int)(w));
- return JIM_ERR;
- }
- Jim_SetResultString(goi.interp, target->cmd_name, -1);
- return JIM_OK;
- case TG_CMD_COUNT:
- if (goi.argc != 0) {
- Jim_WrongNumArgs(goi.interp, 0, goi.argv, "<no parameters>");
- return JIM_ERR;
- }
- for (x = 0, target = all_targets; target; target = target->next, x++)
+ }
+ jim_wide w;
+ int e = Jim_GetOpt_Wide(&goi, &w);
+ if (e != JIM_OK)
+ return JIM_ERR;
+
+ struct target *target;
+ for (target = all_targets; NULL != target; target = target->next)
+ {
+ if (target->target_number != w)
continue;
- Jim_SetResult(goi.interp, Jim_NewIntObj(goi.interp, x));
+
+ Jim_SetResultString(goi.interp, target_name(target), -1);
return JIM_OK;
}
-
+ Jim_SetResult_sprintf(goi.interp,
+ "Target: number %d does not exist", (int)(w));
return JIM_ERR;
}
+static int jim_target_count(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+{
+ if (argc != 1)
+ {
+ Jim_WrongNumArgs(interp, 1, argv, "<no parameters>");
+ return JIM_ERR;
+ }
+ unsigned count = 0;
+ struct target *target = all_targets;
+ while (NULL != target)
+ {
+ target = target->next;
+ count++;
+ }
+ Jim_SetResult(interp, Jim_NewIntObj(interp, count));
+ return JIM_OK;
+}
+
+static const struct command_registration target_subcommand_handlers[] = {
+ {
+ .name = "create",
+ .mode = COMMAND_ANY,
+ .jim_handler = &jim_target_create,
+ .usage = "<name> <type> ...",
+ .help = "Returns the currently selected target",
+ },
+ {
+ .name = "current",
+ .mode = COMMAND_ANY,
+ .jim_handler = &jim_target_current,
+ .help = "Returns the currently selected target",
+ },
+ {
+ .name = "types",
+ .mode = COMMAND_ANY,
+ .jim_handler = &jim_target_types,
+ .help = "Returns the available target types as a list of strings",
+ },
+ {
+ .name = "names",
+ .mode = COMMAND_ANY,
+ .jim_handler = &jim_target_names,
+ .help = "Returns the names of all targets as a list of strings",
+ },
+ {
+ .name = "number",
+ .mode = COMMAND_ANY,
+ .jim_handler = &jim_target_number,
+ .usage = "<number>",
+ .help = "Returns the name of target <n>",
+ },
+ {
+ .name = "count",
+ .mode = COMMAND_ANY,
+ .jim_handler = &jim_target_count,
+ .help = "Returns the number of targets as an integer",
+ },
+ COMMAND_REGISTRATION_DONE
+};
+
struct FastLoad
{
"or list targets (no parameters)",
.usage = "[<new_current_target>]",
},
+ {
+ .name = "target",
+ .mode = COMMAND_CONFIG,
+ .help = "configure target",
+
+ .chain = target_subcommand_handlers,
+ },
COMMAND_REGISTRATION_DONE
};
int target_register_commands(struct command_context *cmd_ctx)
{
- register_jim(cmd_ctx, "target", jim_target, "configure target");
return register_commands(cmd_ctx, NULL, target_command_handlers);
}
.mode = COMMAND_EXEC,
.usage = "<file> [offset] [type]",
},
+ {
+ .name = "ocd_mem2array",
+ .mode = COMMAND_EXEC,
+ .jim_handler = &jim_mem2array,
+ .help = "read memory and return as a TCL array "
+ "for script processing",
+ .usage = "<arrayname> <width=32|16|8> <address> <count>",
+ },
+ {
+ .name = "ocd_array2mem",
+ .mode = COMMAND_EXEC,
+ .jim_handler = &jim_array2mem,
+ .help = "convert a TCL array to memory locations "
+ "and write the values",
+ .usage = "<arrayname> <width=32|16|8> <address> <count>",
+ },
COMMAND_REGISTRATION_DONE
};
int target_register_user_commands(struct command_context *cmd_ctx)
if ((retval = trace_register_commands(cmd_ctx)) != ERROR_OK)
return retval;
- register_jim(cmd_ctx, "ocd_mem2array", jim_mem2array,
- "read memory and return as a TCL array for script processing "
- "<ARRAYNAME> <WIDTH = 32/16/8> <ADDRESS> <COUNT>");
-
- register_jim(cmd_ctx, "ocd_array2mem", jim_array2mem,
- "convert a TCL array to memory locations and write the values "
- "<ARRAYNAME> <WIDTH = 32/16/8> <ADDRESS> <COUNT>");
return register_commands(cmd_ctx, NULL, target_exec_command_handlers);
}