]> git.sur5r.net Git - openocd/blobdiff - src/target/target.c
ZY1000 help/usage fixups
[openocd] / src / target / target.c
index 4297258246ec0fb103746b96be6c8ff938073b9c..7994affa586b84d887e3379a2f924ee7d1170a67 100644 (file)
 #include "config.h"
 #endif
 
+#include <helper/time_support.h>
+#include <jtag/jtag.h>
+
 #include "target.h"
 #include "target_type.h"
 #include "target_request.h"
 #include "breakpoints.h"
-#include "time_support.h"
 #include "register.h"
 #include "trace.h"
 #include "image.h"
-#include "jtag.h"
-
 
-static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
 
-static int target_array2mem(Jim_Interp *interp, struct target *target, int argc, Jim_Obj *const *argv);
-static int target_mem2array(Jim_Interp *interp, struct target *target, int argc, Jim_Obj *const *argv);
+static int target_array2mem(Jim_Interp *interp, struct target *target,
+               int argc, Jim_Obj *const *argv);
+static int target_mem2array(Jim_Interp *interp, struct target *target,
+               int argc, Jim_Obj *const *argv);
 
 /* targets */
 extern struct target_type arm7tdmi_target;
@@ -65,6 +66,7 @@ extern struct target_type cortexa8_target;
 extern struct target_type arm11_target;
 extern struct target_type mips_m4k_target;
 extern struct target_type avr_target;
+extern struct target_type dsp563xx_target;
 extern struct target_type testee_target;
 
 struct target_type *target_types[] =
@@ -84,6 +86,7 @@ struct target_type *target_types[] =
        &arm11_target,
        &mips_m4k_target,
        &avr_target,
+       &dsp563xx_target,
        &testee_target,
        NULL,
 };
@@ -92,7 +95,7 @@ struct target *all_targets = NULL;
 struct target_event_callback *target_event_callbacks = NULL;
 struct target_timer_callback *target_timer_callbacks = NULL;
 
-const Jim_Nvp nvp_assert[] = {
+static const Jim_Nvp nvp_assert[] = {
        { .name = "assert", NVP_ASSERT },
        { .name = "deassert", NVP_DEASSERT },
        { .name = "T", NVP_ASSERT },
@@ -102,7 +105,7 @@ const Jim_Nvp nvp_assert[] = {
        { .name = NULL, .value = -1 }
 };
 
-const Jim_Nvp nvp_error_target[] = {
+static const Jim_Nvp nvp_error_target[] = {
        { .value = ERROR_TARGET_INVALID, .name = "err-invalid" },
        { .value = ERROR_TARGET_INIT_FAILED, .name = "err-init-failed" },
        { .value = ERROR_TARGET_TIMEOUT, .name = "err-timeout" },
@@ -180,7 +183,7 @@ static const Jim_Nvp nvp_target_event[] = {
        { .name = NULL, .value = -1 }
 };
 
-const Jim_Nvp nvp_target_state[] = {
+static const Jim_Nvp nvp_target_state[] = {
        { .name = "unknown", .value = TARGET_UNKNOWN },
        { .name = "running", .value = TARGET_RUNNING },
        { .name = "halted",  .value = TARGET_HALTED },
@@ -189,7 +192,7 @@ const Jim_Nvp nvp_target_state[] = {
        { .name = NULL, .value = -1 },
 };
 
-const Jim_Nvp nvp_target_debug_reason [] = {
+static const Jim_Nvp nvp_target_debug_reason [] = {
        { .name = "debug-request"            , .value = DBG_REASON_DBGRQ },
        { .name = "breakpoint"               , .value = DBG_REASON_BREAKPOINT },
        { .name = "watchpoint"               , .value = DBG_REASON_WATCHPOINT },
@@ -200,7 +203,7 @@ const Jim_Nvp nvp_target_debug_reason [] = {
        { .name = NULL, .value = -1 },
 };
 
-const Jim_Nvp nvp_target_endian[] = {
+static const Jim_Nvp nvp_target_endian[] = {
        { .name = "big",    .value = TARGET_BIG_ENDIAN },
        { .name = "little", .value = TARGET_LITTLE_ENDIAN },
        { .name = "be",     .value = TARGET_BIG_ENDIAN },
@@ -208,7 +211,7 @@ const Jim_Nvp nvp_target_endian[] = {
        { .name = NULL,     .value = -1 },
 };
 
-const Jim_Nvp nvp_reset_modes[] = {
+static const Jim_Nvp nvp_reset_modes[] = {
        { .name = "unknown", .value = RESET_UNKNOWN },
        { .name = "run"    , .value = RESET_RUN },
        { .name = "halt"   , .value = RESET_HALT },
@@ -216,6 +219,19 @@ const Jim_Nvp nvp_reset_modes[] = {
        { .name = NULL     , .value = -1 },
 };
 
+const char *debug_reason_name(struct target *t)
+{
+       const char *cp;
+
+       cp = Jim_Nvp_value2name_simple(nvp_target_debug_reason,
+                       t->debug_reason)->name;
+       if (!cp) {
+               LOG_ERROR("Invalid debug reason: %d", (int)(t->debug_reason));
+               cp = "(*BUG*unknown*BUG*)";
+       }
+       return cp;
+}
+
 const char *
 target_state_name( struct target *t )
 {
@@ -449,12 +465,12 @@ int target_process_reset(struct command_context *cmd_ctx, enum target_reset_mode
        jtag_poll_set_enabled(false);
 
        sprintf(buf, "ocd_process_reset %s", n->name);
-       retval = Jim_Eval(interp, buf);
+       retval = Jim_Eval(cmd_ctx->interp, buf);
 
        jtag_poll_set_enabled(save_poll);
 
        if (retval != JIM_OK) {
-               Jim_PrintErrorMessage(interp);
+               Jim_PrintErrorMessage(cmd_ctx->interp);
                return ERROR_FAIL;
        }
 
@@ -665,222 +681,145 @@ static void target_reset_examined(struct target *target)
        target->examined = false;
 }
 
-
-
-static int default_mrc(struct target *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
+static int
+err_read_phys_memory(struct target *target, uint32_t address,
+               uint32_t size, uint32_t count, uint8_t *buffer)
 {
        LOG_ERROR("Not implemented: %s", __func__);
        return ERROR_FAIL;
 }
 
-static int default_mcr(struct target *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
+static int
+err_write_phys_memory(struct target *target, uint32_t address,
+               uint32_t size, uint32_t count, uint8_t *buffer)
 {
        LOG_ERROR("Not implemented: %s", __func__);
        return ERROR_FAIL;
 }
 
-static int arm_cp_check(struct target *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm)
+static int handle_target(void *priv);
+
+static int target_init_one(struct command_context *cmd_ctx,
+               struct target *target)
 {
-       /* basic check */
-       if (!target_was_examined(target))
-       {
-               LOG_ERROR("Target not examined yet");
-               return ERROR_FAIL;
-       }
+       target_reset_examined(target);
 
-       if ((cpnum <0) || (cpnum > 15))
-       {
-               LOG_ERROR("Illegal co-processor %d", cpnum);
-               return ERROR_FAIL;
-       }
+       struct target_type *type = target->type;
+       if (type->examine == NULL)
+               type->examine = default_examine;
 
-       if (op1 > 7)
+       int retval = type->init_target(cmd_ctx, target);
+       if (ERROR_OK != retval)
        {
-               LOG_ERROR("Illegal op1");
-               return ERROR_FAIL;
+               LOG_ERROR("target '%s' init failed", target_name(target));
+               return retval;
        }
 
-       if (op2 > 7)
-       {
-               LOG_ERROR("Illegal op2");
-               return ERROR_FAIL;
-       }
+       /**
+        * @todo get rid of those *memory_imp() methods, now that all
+        * callers are using target_*_memory() accessors ... and make
+        * sure the "physical" paths handle the same issues.
+        */
+       /* a non-invasive way(in terms of patches) to add some code that
+        * runs before the type->write/read_memory implementation
+        */
+       type->write_memory_imp = target->type->write_memory;
+       type->write_memory = target_write_memory_imp;
 
-       if (CRn > 15)
-       {
-               LOG_ERROR("Illegal CRn");
-               return ERROR_FAIL;
-       }
+       type->read_memory_imp = target->type->read_memory;
+       type->read_memory = target_read_memory_imp;
+
+       type->soft_reset_halt_imp = target->type->soft_reset_halt;
+       type->soft_reset_halt = target_soft_reset_halt_imp;
 
-       if (CRm > 15)
+       type->run_algorithm_imp = target->type->run_algorithm;
+       type->run_algorithm = target_run_algorithm_imp;
+
+       /* Sanity-check MMU support ... stub in what we must, to help
+        * implement it in stages, but warn if we need to do so.
+        */
+       if (type->mmu)
        {
-               LOG_ERROR("Illegal CRm");
-               return ERROR_FAIL;
+               if (type->write_phys_memory == NULL)
+               {
+                       LOG_ERROR("type '%s' is missing write_phys_memory",
+                                       type->name);
+                       type->write_phys_memory = err_write_phys_memory;
+               }
+               if (type->read_phys_memory == NULL)
+               {
+                       LOG_ERROR("type '%s' is missing read_phys_memory",
+                                       type->name);
+                       type->read_phys_memory = err_read_phys_memory;
+               }
+               if (type->virt2phys == NULL)
+               {
+                       LOG_ERROR("type '%s' is missing virt2phys", type->name);
+                       type->virt2phys = identity_virt2phys;
+               }
        }
+       else
+       {
+               /* Make sure no-MMU targets all behave the same:  make no
+                * distinction between physical and virtual addresses, and
+                * ensure that virt2phys() is always an identity mapping.
+                */
+               if (type->write_phys_memory || type->read_phys_memory
+                               || type->virt2phys)
+               {
+                       LOG_WARNING("type '%s' has bad MMU hooks", type->name);
+               }
 
+               type->mmu = no_mmu;
+               type->write_phys_memory = type->write_memory;
+               type->read_phys_memory = type->read_memory;
+               type->virt2phys = identity_virt2phys;
+       }
        return ERROR_OK;
 }
 
-int target_mrc(struct target *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t *value)
-{
-       int retval;
-
-       retval = arm_cp_check(target, cpnum, op1, op2, CRn, CRm);
-       if (retval != ERROR_OK)
-               return retval;
-
-       return target->type->mrc(target, cpnum, op1, op2, CRn, CRm, value);
-}
-
-int target_mcr(struct target *target, int cpnum, uint32_t op1, uint32_t op2, uint32_t CRn, uint32_t CRm, uint32_t value)
-{
-       int retval;
-
-       retval = arm_cp_check(target, cpnum, op1, op2, CRn, CRm);
-       if (retval != ERROR_OK)
-               return retval;
-
-       return target->type->mcr(target, cpnum, op1, op2, CRn, CRm, value);
-}
-
-static int
-err_read_phys_memory(struct target *target, uint32_t address,
-               uint32_t size, uint32_t count, uint8_t *buffer)
-{
-       LOG_ERROR("Not implemented: %s", __func__);
-       return ERROR_FAIL;
-}
-
-static int
-err_write_phys_memory(struct target *target, uint32_t address,
-               uint32_t size, uint32_t count, uint8_t *buffer)
-{
-       LOG_ERROR("Not implemented: %s", __func__);
-       return ERROR_FAIL;
-}
-
 int target_init(struct command_context *cmd_ctx)
 {
        struct target *target;
        int retval;
 
-       for (target = all_targets; target; target = target->next) {
-               struct target_type *type = target->type;
-
-               target_reset_examined(target);
-               if (target->type->examine == NULL)
-               {
-                       target->type->examine = default_examine;
-               }
-
-               if ((retval = target->type->init_target(cmd_ctx, target)) != ERROR_OK)
-               {
-                       LOG_ERROR("target '%s' init failed", target_name(target));
+       for (target = all_targets; target; target = target->next)
+       {
+               retval = target_init_one(cmd_ctx, target);
+               if (ERROR_OK != retval)
                        return retval;
-               }
-
-               /**
-                * @todo MCR/MRC are ARM-specific; don't require them in
-                * all targets, or for ARMs without coprocessors.
-                */
-               if (target->type->mcr == NULL)
-               {
-                       target->type->mcr = default_mcr;
-               } else
-               {
-                       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
-               {
-                       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);
-               }
+       if (!all_targets)
+               return ERROR_OK;
 
+       retval = target_register_user_commands(cmd_ctx);
+       if (ERROR_OK != retval)
+               return retval;
 
-               /**
-                * @todo get rid of those *memory_imp() methods, now that all
-                * callers are using target_*_memory() accessors ... and make
-                * sure the "physical" paths handle the same issues.
-                */
+       retval = target_register_timer_callback(&handle_target,
+                       100, 1, cmd_ctx->interp);
+       if (ERROR_OK != retval)
+               return retval;
 
-               /* a non-invasive way(in terms of patches) to add some code that
-                * runs before the type->write/read_memory implementation
-                */
-               target->type->write_memory_imp = target->type->write_memory;
-               target->type->write_memory = target_write_memory_imp;
-               target->type->read_memory_imp = target->type->read_memory;
-               target->type->read_memory = target_read_memory_imp;
-               target->type->soft_reset_halt_imp = target->type->soft_reset_halt;
-               target->type->soft_reset_halt = target_soft_reset_halt_imp;
-               target->type->run_algorithm_imp = target->type->run_algorithm;
-               target->type->run_algorithm = target_run_algorithm_imp;
-
-               /* Sanity-check MMU support ... stub in what we must, to help
-                * implement it in stages, but warn if we need to do so.
-                */
-               if (type->mmu) {
-                       if (type->write_phys_memory == NULL) {
-                               LOG_ERROR("type '%s' is missing %s",
-                                               type->name,
-                                               "write_phys_memory");
-                               type->write_phys_memory = err_write_phys_memory;
-                       }
-                       if (type->read_phys_memory == NULL) {
-                               LOG_ERROR("type '%s' is missing %s",
-                                               type->name,
-                                               "read_phys_memory");
-                               type->read_phys_memory = err_read_phys_memory;
-                       }
-                       if (type->virt2phys == NULL) {
-                               LOG_ERROR("type '%s' is missing %s",
-                                               type->name,
-                                               "virt2phys");
-                               type->virt2phys = identity_virt2phys;
-                       }
+       return ERROR_OK;
+}
 
-               /* Make sure no-MMU targets all behave the same:  make no
-                * distinction between physical and virtual addresses, and
-                * ensure that virt2phys() is always an identity mapping.
-                */
-               } else {
-                       if (type->write_phys_memory
-                                       || type->read_phys_memory
-                                       || type->virt2phys)
-                               LOG_WARNING("type '%s' has broken MMU hooks",
-                                               type->name);
-
-                       type->mmu = no_mmu;
-                       type->write_phys_memory = type->write_memory;
-                       type->read_phys_memory = type->read_memory;
-                       type->virt2phys = identity_virt2phys;
-               }
-       }
+COMMAND_HANDLER(handle_target_init_command)
+{
+       if (CMD_ARGC != 0)
+               return ERROR_COMMAND_SYNTAX_ERROR;
 
-       if (all_targets)
+       static bool target_initialized = false;
+       if (target_initialized)
        {
-               if ((retval = target_register_user_commands(cmd_ctx)) != ERROR_OK)
-                       return retval;
-               if ((retval = target_register_timer_callback(handle_target, 100, 1, NULL)) != ERROR_OK)
-                       return retval;
+               LOG_INFO("'target init' has already been called");
+               return ERROR_OK;
        }
+       target_initialized = true;
 
-       return ERROR_OK;
+       LOG_DEBUG("Initializing targets...");
+       return target_init(CMD_CTX);
 }
 
 int target_register_event_callback(int (*callback)(struct target *target, enum target_event event, void *priv), void *priv)
@@ -1796,8 +1735,9 @@ static void target_call_event_callbacks_all(enum target_event e) {
 }
 
 /* process target state changes */
-int handle_target(void *priv)
+static int handle_target(void *priv)
 {
+       Jim_Interp *interp = (Jim_Interp *)priv;
        int retval = ERROR_OK;
 
        /* we do not want to recurse here... */
@@ -2219,8 +2159,9 @@ static void handle_md_output(struct command_context *cmd_ctx,
        case 2: value_fmt = "%4.2x "; break;
        case 1: value_fmt = "%2.2x "; break;
        default:
+               /* "can't happen", caller checked */
                LOG_ERROR("invalid memory read size: %u", size);
-               exit(-1);
+               return;
        }
 
        for (unsigned i = 0; i < count; i++)
@@ -2549,7 +2490,7 @@ COMMAND_HANDLER(handle_dump_image_command)
        if ((ERROR_OK == retval) && (duration_measure(&bench) == ERROR_OK))
        {
                command_print(CMD_CTX,
-                               "dumped %zu bytes in %fs (%0.3f kb/s)", fileio.size,
+                               "dumped %ld bytes in %fs (%0.3f kb/s)", (long)fileio.size,
                                duration_elapsed(&bench), duration_kbps(&bench, fileio.size));
        }
 
@@ -3021,7 +2962,8 @@ static void writeGmon(uint32_t *samples, uint32_t sampleNum, const char *filenam
        fclose(f);
 }
 
-/* profiling samples the CPU PC as quickly as OpenOCD is able, which will be used as a random sampling of PC */
+/* profiling samples the CPU PC as quickly as OpenOCD is able,
+ * which will be used as a random sampling of PC */
 COMMAND_HANDLER(handle_profile_command)
 {
        struct target *target = get_current_target(CMD_CTX);
@@ -3037,6 +2979,12 @@ COMMAND_HANDLER(handle_profile_command)
 
        timeval_add_time(&timeout, offset, 0);
 
+       /**
+        * @todo: Some cores let us sample the PC without the
+        * annoying halt/resume step; for example, ARMv7 PCSR.
+        * Provide a way to use that more efficient mechanism.
+        */
+
        command_print(CMD_CTX, "Starting profiling. Halting and resuming the target as often as we can...");
 
        static const int maxSample = 10000;
@@ -3348,7 +3296,9 @@ static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 
        return target_array2mem(interp,target, argc-1, argv + 1);
 }
-static int target_array2mem(Jim_Interp *interp, struct target *target, int argc, Jim_Obj *const *argv)
+
+static int target_array2mem(Jim_Interp *interp, struct target *target,
+               int argc, Jim_Obj *const *argv)
 {
        long l;
        uint32_t width;
@@ -3850,11 +3800,13 @@ static int target_configure(Jim_GetOptInfo *goi, struct target *target)
        return JIM_OK;
 }
 
-static int jim_target_configure(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+static int
+jim_target_configure(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 {
        Jim_GetOptInfo goi;
+
        Jim_GetOpt_Setup(&goi, interp, argc - 1, argv + 1);
-       goi.isconfigure = strcmp(Jim_GetString(argv[0], NULL), "configure") == 0;
+       goi.isconfigure = !strcmp(Jim_GetString(argv[0], NULL), "configure");
        int need_args = 1 + goi.isconfigure;
        if (goi.argc < need_args)
        {
@@ -4049,13 +4001,15 @@ static int jim_target_md(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        return JIM_OK;
 }
 
-static int jim_target_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+static int jim_target_mem2array(Jim_Interp *interp,
+               int argc, Jim_Obj *const *argv)
 {
        struct target *target = Jim_CmdPrivData(interp);
        return target_mem2array(interp, target, argc - 1, argv + 1);
 }
 
-static int jim_target_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
+static int jim_target_array2mem(Jim_Interp *interp,
+               int argc, Jim_Obj *const *argv)
 {
        struct target *target = Jim_CmdPrivData(interp);
        return target_array2mem(interp, target, argc - 1, argv + 1);
@@ -4140,6 +4094,11 @@ static int jim_target_reset(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
        struct target *target = Jim_CmdPrivData(goi.interp);
        if (!target->tap->enabled)
                return jim_target_tap_disabled(interp);
+       if (!(target_was_examined(target)))
+       {
+               LOG_ERROR("Target not examined yet");
+               return ERROR_TARGET_NOT_EXAMINED;
+       }
        if (!target->type->assert_reset || !target->type->deassert_reset)
        {
                Jim_SetResult_sprintf(interp,
@@ -4275,108 +4234,123 @@ static const struct command_registration target_instance_command_handlers[] = {
        {
                .name = "configure",
                .mode = COMMAND_CONFIG,
-               .jim_handler = &jim_target_configure,
-               .usage = "[<target_options> ...]",
+               .jim_handler = jim_target_configure,
                .help  = "configure a new target for use",
+               .usage = "[target_attribute ...]",
        },
        {
                .name = "cget",
                .mode = COMMAND_ANY,
-               .jim_handler = &jim_target_configure,
-               .usage = "<target_type> [<target_options> ...]",
-               .help  = "configure a new target for use",
+               .jim_handler = jim_target_configure,
+               .help  = "returns the specified target attribute",
+               .usage = "target_attribute",
        },
        {
                .name = "mww",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_mw,
-               .usage = "<address> <data> [<count>]",
+               .jim_handler = jim_target_mw,
                .help = "Write 32-bit word(s) to target memory",
+               .usage = "address data [count]",
        },
        {
                .name = "mwh",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_mw,
-               .usage = "<address> <data> [<count>]",
+               .jim_handler = jim_target_mw,
                .help = "Write 16-bit half-word(s) to target memory",
+               .usage = "address data [count]",
        },
        {
                .name = "mwb",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_mw,
-               .usage = "<address> <data> [<count>]",
+               .jim_handler = jim_target_mw,
                .help = "Write byte(s) to target memory",
+               .usage = "address data [count]",
        },
        {
                .name = "mdw",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_md,
-               .usage = "<address> [<count>]",
+               .jim_handler = jim_target_md,
                .help = "Display target memory as 32-bit words",
+               .usage = "address [count]",
        },
        {
                .name = "mdh",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_md,
-               .usage = "<address> [<count>]",
+               .jim_handler = jim_target_md,
                .help = "Display target memory as 16-bit half-words",
+               .usage = "address [count]",
        },
        {
                .name = "mdb",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_md,
-               .usage = "<address> [<count>]",
+               .jim_handler = jim_target_md,
                .help = "Display target memory as 8-bit bytes",
+               .usage = "address [count]",
        },
        {
                .name = "array2mem",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_array2mem,
+               .jim_handler = jim_target_array2mem,
+               .help = "Writes Tcl array of 8/16/32 bit numbers "
+                       "to target memory",
+               .usage = "arrayname bitwidth address count",
        },
        {
                .name = "mem2array",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_mem2array,
+               .jim_handler = jim_target_mem2array,
+               .help = "Loads Tcl array of 8/16/32 bit numbers "
+                       "from target memory",
+               .usage = "arrayname bitwidth address count",
        },
        {
                .name = "eventlist",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_event_list,
+               .jim_handler = jim_target_event_list,
+               .help = "displays a table of events defined for this target",
        },
        {
                .name = "curstate",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_current_state,
+               .jim_handler = jim_target_current_state,
+               .help = "displays the current state of this target",
        },
        {
                .name = "arp_examine",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_examine,
+               .jim_handler = jim_target_examine,
+               .help = "used internally for reset processing",
        },
        {
                .name = "arp_poll",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_poll,
+               .jim_handler = jim_target_poll,
+               .help = "used internally for reset processing",
        },
        {
                .name = "arp_reset",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_reset,
+               .jim_handler = jim_target_reset,
+               .help = "used internally for reset processing",
        },
        {
                .name = "arp_halt",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_halt,
+               .jim_handler = jim_target_halt,
+               .help = "used internally for reset processing",
        },
        {
                .name = "arp_waitstate",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_wait_state,
+               .jim_handler = jim_target_wait_state,
+               .help = "used internally for reset processing",
        },
        {
                .name = "invoke-event",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_target_invoke_event,
+               .jim_handler = jim_target_invoke_event,
+               .help = "invoke handler for specified event",
+               .usage = "event_name",
        },
        COMMAND_REGISTRATION_DONE
 };
@@ -4528,7 +4502,7 @@ static int target_create(Jim_GetOptInfo *goi)
                }
                *tpp = target;
        }
-       
+
        /* now - create the new target name command */
        const const struct command_registration target_subcommands[] = {
                {
@@ -4668,48 +4642,57 @@ static int jim_target_count(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
 }
 
 static const struct command_registration target_subcommand_handlers[] = {
+       {
+               .name = "init",
+               .mode = COMMAND_CONFIG,
+               .handler = handle_target_init_command,
+               .help = "initialize targets",
+       },
        {
                .name = "create",
+               /* REVISIT this should be COMMAND_CONFIG ... */
                .mode = COMMAND_ANY,
-               .jim_handler = &jim_target_create,
-               .usage = "<name> <type> ...",
-               .help = "Returns the currently selected target",
+               .jim_handler = jim_target_create,
+               .usage = "name type '-chain-position' name [options ...]",
+               .help = "Creates and selects a new target",
        },
        {
                .name = "current",
                .mode = COMMAND_ANY,
-               .jim_handler = &jim_target_current,
+               .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",
+               .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,
+               .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>",
+               .jim_handler = jim_target_number,
+               .usage = "number",
+               .help = "Returns the name of the numbered target "
+                       "(DEPRECATED)",
        },
        {
                .name = "count",
                .mode = COMMAND_ANY,
-               .jim_handler = &jim_target_count,
-               .help = "Returns the number of targets as an integer",
+               .jim_handler = jim_target_count,
+               .help = "Returns the number of targets as an integer "
+                       "(DEPRECATED)",
        },
        COMMAND_REGISTRATION_DONE
 };
 
-
 struct FastLoad
 {
        uint32_t address;
@@ -4880,100 +4863,14 @@ COMMAND_HANDLER(handle_fast_load_command)
        return retval;
 }
 
-static int jim_mcrmrc(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
-{
-       struct command_context *context;
-       struct target *target;
-       int retval;
-
-       context = Jim_GetAssocData(interp, "context");
-       if (context == NULL) {
-               LOG_ERROR("array2mem: no command context");
-               return JIM_ERR;
-       }
-       target = get_current_target(context);
-       if (target == NULL) {
-               LOG_ERROR("array2mem: no current target");
-               return JIM_ERR;
-       }
-
-       if ((argc < 6) || (argc > 7))
-       {
-               return JIM_ERR;
-       }
-
-       int cpnum;
-       uint32_t op1;
-       uint32_t op2;
-       uint32_t CRn;
-       uint32_t CRm;
-       uint32_t value;
-
-       int e;
-       long l;
-       e = Jim_GetLong(interp, argv[1], &l);
-       if (e != JIM_OK) {
-               return e;
-       }
-       cpnum = l;
-
-       e = Jim_GetLong(interp, argv[2], &l);
-       if (e != JIM_OK) {
-               return e;
-       }
-       op1 = l;
-
-       e = Jim_GetLong(interp, argv[3], &l);
-       if (e != JIM_OK) {
-               return e;
-       }
-       CRn = l;
-
-       e = Jim_GetLong(interp, argv[4], &l);
-       if (e != JIM_OK) {
-               return e;
-       }
-       CRm = l;
-
-       e = Jim_GetLong(interp, argv[5], &l);
-       if (e != JIM_OK) {
-               return e;
-       }
-       op2 = l;
-
-       value = 0;
-
-       if (argc == 7)
-       {
-               e = Jim_GetLong(interp, argv[6], &l);
-               if (e != JIM_OK) {
-                       return e;
-               }
-               value = l;
-
-               retval = target_mcr(target, cpnum, op1, op2, CRn, CRm, value);
-               if (retval != ERROR_OK)
-                       return JIM_ERR;
-       } else
-       {
-               retval = target_mrc(target, cpnum, op1, op2, CRn, CRm, &value);
-               if (retval != ERROR_OK)
-                       return JIM_ERR;
-
-               Jim_SetResult(interp, Jim_NewIntObj(interp, value));
-       }
-
-       return JIM_OK;
-}
-
 static const struct command_registration target_command_handlers[] = {
        {
                .name = "targets",
-               .handler = &handle_targets_command,
+               .handler = handle_targets_command,
                .mode = COMMAND_ANY,
-               .help = "change current command line target (one parameter) "
-                       "or list targets (no parameters)",
-               .usage = "[<new_current_target>]",
+               .help = "change current default target (one parameter) "
+                       "or prints table of all targets (no parameters)",
+               .usage = "[target]",
        },
        {
                .name = "target",
@@ -4993,69 +4890,75 @@ int target_register_commands(struct command_context *cmd_ctx)
 static const struct command_registration target_exec_command_handlers[] = {
        {
                .name = "fast_load_image",
-               .handler = &handle_fast_load_image_command,
+               .handler = handle_fast_load_image_command,
                .mode = COMMAND_ANY,
-               .help = "Load image into memory, mainly for profiling purposes",
-               .usage = "<file> <address> ['bin'|'ihex'|'elf'|'s19'] "
-                       "[min_address] [max_length]",
+               .help = "Load image into server memory for later use by "
+                       "fast_load; primarily for profiling",
+               .usage = "filename address ['bin'|'ihex'|'elf'|'s19'] "
+                       "[min_address [max_length]]",
        },
        {
                .name = "fast_load",
-               .handler = &handle_fast_load_command,
-               .mode = COMMAND_ANY,
+               .handler = handle_fast_load_command,
+               .mode = COMMAND_EXEC,
                .help = "loads active fast load image to current target "
                        "- mainly for profiling purposes",
        },
        {
                .name = "profile",
-               .handler = &handle_profile_command,
+               .handler = handle_profile_command,
                .mode = COMMAND_EXEC,
                .help = "profiling samples the CPU PC",
        },
        /** @todo don't register virt2phys() unless target supports it */
        {
                .name = "virt2phys",
-               .handler = &handle_virt2phys_command,
+               .handler = handle_virt2phys_command,
                .mode = COMMAND_ANY,
                .help = "translate a virtual address into a physical address",
+               .usage = "virtual_address",
        },
-
        {
                .name = "reg",
-               .handler = &handle_reg_command,
+               .handler = handle_reg_command,
                .mode = COMMAND_EXEC,
-               .help = "display or set a register",
+               .help = "display or set a register; with no arguments, "
+                       "displays all registers and their values",
+               .usage = "[(register_name|register_number) [value]]",
        },
-
        {
                .name = "poll",
-               .handler = &handle_poll_command,
+               .handler = handle_poll_command,
                .mode = COMMAND_EXEC,
-               .help = "poll target state",
+               .help = "poll target state; or reconfigure background polling",
+               .usage = "['on'|'off']",
        },
        {
                .name = "wait_halt",
-               .handler = &handle_wait_halt_command,
+               .handler = handle_wait_halt_command,
                .mode = COMMAND_EXEC,
-               .help = "wait for target halt",
-               .usage = "[time (s)]",
+               .help = "wait up to the specified number of milliseconds "
+                       "(default 5) for a previously requested halt",
+               .usage = "[milliseconds]",
        },
        {
                .name = "halt",
-               .handler = &handle_halt_command,
+               .handler = handle_halt_command,
                .mode = COMMAND_EXEC,
-               .help = "halt target",
+               .help = "request target to halt, then wait up to the specified"
+                       "number of milliseconds (default 5) for it to complete",
+               .usage = "[milliseconds]",
        },
        {
                .name = "resume",
-               .handler = &handle_resume_command,
+               .handler = handle_resume_command,
                .mode = COMMAND_EXEC,
-               .help = "resume target",
-               .usage = "[<address>]",
+               .help = "resume target execution from current PC or address",
+               .usage = "[address]",
        },
        {
                .name = "reset",
-               .handler = &handle_reset_command,
+               .handler = handle_reset_command,
                .mode = COMMAND_EXEC,
                .usage = "[run|halt|init]",
                .help = "Reset all targets into the specified mode."
@@ -5063,133 +4966,127 @@ static const struct command_registration target_exec_command_handlers[] = {
        },
        {
                .name = "soft_reset_halt",
-               .handler = &handle_soft_reset_halt_command,
+               .handler = handle_soft_reset_halt_command,
                .mode = COMMAND_EXEC,
                .help = "halt the target and do a soft reset",
        },
        {
-
                .name = "step",
-               .handler = &handle_step_command,
+               .handler = handle_step_command,
                .mode = COMMAND_EXEC,
-               .help = "step one instruction from current PC or [addr]",
-               .usage = "[<address>]",
+               .help = "step one instruction from current PC or address",
+               .usage = "[address]",
        },
        {
-
                .name = "mdw",
-               .handler = &handle_md_command,
+               .handler = handle_md_command,
                .mode = COMMAND_EXEC,
                .help = "display memory words",
-               .usage = "[phys] <addr> [count]",
+               .usage = "['phys'] address [count]",
        },
        {
                .name = "mdh",
-               .handler = &handle_md_command,
+               .handler = handle_md_command,
                .mode = COMMAND_EXEC,
                .help = "display memory half-words",
-               .usage = "[phys] <addr> [count]",
+               .usage = "['phys'] address [count]",
        },
        {
                .name = "mdb",
-               .handler = &handle_md_command,
+               .handler = handle_md_command,
                .mode = COMMAND_EXEC,
                .help = "display memory bytes",
-               .usage = "[phys] <addr> [count]",
+               .usage = "['phys'] address [count]",
        },
        {
-
                .name = "mww",
-               .handler = &handle_mw_command,
+               .handler = handle_mw_command,
                .mode = COMMAND_EXEC,
                .help = "write memory word",
-               .usage = "[phys]  <addr> <value> [count]",
+               .usage = "['phys'] address value [count]",
        },
        {
                .name = "mwh",
-               .handler = &handle_mw_command,
+               .handler = handle_mw_command,
                .mode = COMMAND_EXEC,
                .help = "write memory half-word",
-               .usage = "[phys] <addr> <value> [count]",
+               .usage = "['phys'] address value [count]",
        },
        {
                .name = "mwb",
-               .handler = &handle_mw_command,
+               .handler = handle_mw_command,
                .mode = COMMAND_EXEC,
                .help = "write memory byte",
-               .usage = "[phys] <addr> <value> [count]",
+               .usage = "['phys'] address value [count]",
        },
        {
-
                .name = "bp",
-               .handler = &handle_bp_command,
+               .handler = handle_bp_command,
                .mode = COMMAND_EXEC,
-               .help = "list or set breakpoint",
-               .usage = "[<address> <length> [hw]]",
+               .help = "list or set hardware or software breakpoint",
+               .usage = "[address length ['hw']]",
        },
        {
                .name = "rbp",
-               .handler = &handle_rbp_command,
+               .handler = handle_rbp_command,
                .mode = COMMAND_EXEC,
                .help = "remove breakpoint",
-               .usage = "<address>",
+               .usage = "address",
        },
        {
-
                .name = "wp",
-               .handler = &handle_wp_command,
+               .handler = handle_wp_command,
                .mode = COMMAND_EXEC,
-               .help = "list or set watchpoint",
-               .usage = "[<address> <length> <r/w/a> [value] [mask]]",
+               .help = "list (no params) or create watchpoints",
+               .usage = "[address length [('r'|'w'|'a') value [mask]]]",
        },
        {
                .name = "rwp",
-               .handler = &handle_rwp_command,
+               .handler = handle_rwp_command,
                .mode = COMMAND_EXEC,
                .help = "remove watchpoint",
-               .usage = "<address>",
-
+               .usage = "address",
        },
        {
                .name = "load_image",
-               .handler = &handle_load_image_command,
+               .handler = handle_load_image_command,
                .mode = COMMAND_EXEC,
-               .usage = "<file> <address> ['bin'|'ihex'|'elf'|'s19'] "
+               .usage = "filename address ['bin'|'ihex'|'elf'|'s19'] "
                        "[min_address] [max_length]",
        },
        {
                .name = "dump_image",
-               .handler = &handle_dump_image_command,
+               .handler = handle_dump_image_command,
                .mode = COMMAND_EXEC,
-               .usage = "<file> <address> <size>",
+               .usage = "filename address size",
        },
        {
                .name = "verify_image",
-               .handler = &handle_verify_image_command,
+               .handler = handle_verify_image_command,
                .mode = COMMAND_EXEC,
-               .usage = "<file> [offset] [type]",
+               .usage = "filename [offset [type]]",
        },
        {
                .name = "test_image",
-               .handler = &handle_test_image_command,
+               .handler = handle_test_image_command,
                .mode = COMMAND_EXEC,
-               .usage = "<file> [offset] [type]",
+               .usage = "filename [offset [type]]",
        },
        {
                .name = "ocd_mem2array",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_mem2array,
-               .help = "read memory and return as a TCL array "
+               .jim_handler = jim_mem2array,
+               .help = "read 8/16/32 bit memory and return as a TCL array "
                        "for script processing",
-               .usage = "<arrayname> <width=32|16|8> <address> <count>",
+               .usage = "arrayname bitwidth address count",
        },
        {
                .name = "ocd_array2mem",
                .mode = COMMAND_EXEC,
-               .jim_handler = &jim_array2mem,
+               .jim_handler = jim_array2mem,
                .help = "convert a TCL array to memory locations "
-                       "and write the values",
-               .usage = "<arrayname> <width=32|16|8> <address> <count>",
+                       "and write the 8/16/32 bit values",
+               .usage = "arrayname bitwidth address count",
        },
        COMMAND_REGISTRATION_DONE
 };