Duane Ellis: "target as an [tcl] object" feature.
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 1 Sep 2008 07:20:21 +0000 (07:20 +0000)
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Mon, 1 Sep 2008 07:20:21 +0000 (07:20 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@975 b42882b7-edfa-0310-969c-e2dbd0fdcd60

42 files changed:
src/helper/command.c
src/helper/jim.c
src/helper/jim.h
src/helper/startup.tcl
src/server/gdb_server.c
src/server/tcl_server.c
src/target/arm11.c
src/target/arm11.h
src/target/arm720t.c
src/target/arm7tdmi.c
src/target/arm920t.c
src/target/arm926ejs.c
src/target/arm926ejs.h
src/target/arm966e.c
src/target/arm9tdmi.c
src/target/arm9tdmi.h
src/target/cortex_m3.c
src/target/cortex_m3.h
src/target/feroceon.c
src/target/mips32.c
src/target/mips32.h
src/target/mips_m4k.c
src/target/target.c
src/target/target.h
src/target/target/aduc702x.cfg
src/target/target/at91eb40a.cfg
src/target/target/at91r40008.cfg
src/target/target/at91sam9260.cfg
src/target/target/eir-sam7se512.cfg
src/target/target/hammer.cfg
src/target/target/lpc2148.cfg
src/target/target/omap5912.cfg
src/target/target/pxa255.cfg
src/target/target/sam7x256.cfg
src/target/target/str710.cfg
src/target/target/str730.cfg
src/target/target/str750.cfg
src/target/target/str912.cfg
src/target/target/wi-9c.cfg
src/target/target/xba_revA3.cfg
src/target/target/zy1000.cfg
src/target/xscale.c

index c4edcc7f113b8cf42f45d7b75e224c8695cabb64..9719d1860ce6b24b389eeae9f33148bcdec76829 100644 (file)
@@ -210,7 +210,7 @@ command_t* register_command(command_context_t *context, command_t *parent, char
        
        /* we now need to add an overrideable proc */
        const char *override_name=alloc_printf("proc %s%s%s {args} {if {[catch {eval \"ocd_%s%s%s $args\"}]==0} {return \"\"} else { return -code error }", t1, t2, t3, t1, t2, t3);
-       Jim_Eval(interp, override_name);        
+       Jim_Eval_Named(interp, override_name, __FILE__, __LINE__ );     
        free((void *)override_name);
        
        /* accumulate help text in Tcl helptext list.  */
@@ -430,7 +430,7 @@ int command_run_line(command_context_t *context, char *line)
                retcode = Jim_SetAssocData(interp, "retval", NULL, &retval);
                if (retcode == JIM_OK)
                {
-                       retcode = Jim_Eval(interp, line);
+                       retcode = Jim_Eval_Named(interp, line, __FILE__, __LINE__ );
                        
                        Jim_DeleteAssocData(interp, "retval");
                }       
@@ -658,7 +658,7 @@ command_context_t* command_init()
 #ifdef JIM_EMBEDDED
        Jim_EventLoopOnLoad(interp);
 #endif
-       if (Jim_Eval(interp, startup_tcl)==JIM_ERR)
+       if (Jim_Eval_Named(interp, startup_tcl, "embedded:startup.tcl",1)==JIM_ERR)
        {
                LOG_ERROR("Failed to run startup.tcl (embedded into OpenOCD compile time)");
                Jim_PrintErrorMessage(interp);
index a9838ab0d50b30ccb724976fa0f885791b9280d7..791dfc6f4535f03575c69c82bff70f56f62a7e5e 100644 (file)
@@ -111,6 +111,33 @@ static Jim_HashTableType JimVariablesHashTableType;
  * Utility functions
  * ---------------------------------------------------------------------------*/
 
+static char *
+jim_vasprintf( const char *fmt, va_list ap )
+{
+#ifndef HAVE_VASPRINTF
+       /* yucky way */
+static char buf[2048];
+       vsnprintf( buf, sizeof(buf), fmt, ap );
+       /* garentee termination */
+       buf[sizeof(buf)-1] = 0;
+#else
+       char *buf;
+       vasprintf( &buf, fmt, ap );
+#endif
+       return buf;
+}
+
+static void
+jim_vasprintf_done( void *buf )
+{
+#ifndef HAVE_VASPRINTF
+       (void)(buf);
+#else
+       free(buf);
+#endif
+}
+       
+
 /*
  * Convert a string to a jim_wide INTEGER.
  * This function originates from BSD.
@@ -2019,6 +2046,22 @@ void Jim_AppendString(Jim_Interp *interp, Jim_Obj *objPtr, const char *str,
     StringAppendString(objPtr, str, len);
 }
 
+void Jim_AppendString_sprintf( Jim_Interp *interp, Jim_Obj *objPtr, const char *fmt, ... )
+{
+       char *buf;
+       va_list ap;
+
+       va_start( ap, fmt );
+       buf = jim_vasprintf( fmt, ap );
+       va_end(ap);
+
+       if( buf ){
+               Jim_AppendString( interp, objPtr, buf, -1 );
+               jim_vasprintf_done(buf);
+       }
+}
+
+
 void Jim_AppendObj(Jim_Interp *interp, Jim_Obj *objPtr,
         Jim_Obj *appendObjPtr)
 {
@@ -8726,17 +8769,31 @@ int JimCallProcedure(Jim_Interp *interp, Jim_Cmd *cmd, int argc,
     return retcode;
 }
 
-int Jim_Eval(Jim_Interp *interp, const char *script)
+int Jim_Eval_Named(Jim_Interp *interp, const char *script, const char *filename, int lineno)
 {
-    Jim_Obj *scriptObjPtr = Jim_NewStringObj(interp, script, -1);
     int retval;
+    Jim_Obj *scriptObjPtr;
 
+       scriptObjPtr = Jim_NewStringObj(interp, script, -1);
     Jim_IncrRefCount(scriptObjPtr);
+
+
+       if( filename ){
+               JimSetSourceInfo( interp, scriptObjPtr, filename, lineno );
+       }
+
     retval = Jim_EvalObj(interp, scriptObjPtr);
     Jim_DecrRefCount(interp, scriptObjPtr);
     return retval;
 }
 
+int Jim_Eval(Jim_Interp *interp, const char *script)
+{
+       return Jim_Eval_Named( interp, script, NULL, 0 );
+}
+
+
+
 /* Execute script in the scope of the global level */
 int Jim_EvalGlobal(Jim_Interp *interp, const char *script)
 {
@@ -9076,6 +9133,7 @@ void JimRegisterCoreApi(Jim_Interp *interp)
   JIM_REGISTER_API(Alloc);
   JIM_REGISTER_API(Free);
   JIM_REGISTER_API(Eval);
+  JIM_REGISTER_API(Eval_Named);
   JIM_REGISTER_API(EvalGlobal);
   JIM_REGISTER_API(EvalFile);
   JIM_REGISTER_API(EvalObj);
@@ -9102,6 +9160,7 @@ void JimRegisterCoreApi(Jim_Interp *interp)
   JIM_REGISTER_API(NewStringObj);
   JIM_REGISTER_API(NewStringObjNoAlloc);
   JIM_REGISTER_API(AppendString);
+  JIM_REGISTER_API(AppendString_sprintf);
   JIM_REGISTER_API(AppendObj);
   JIM_REGISTER_API(AppendStrings);
   JIM_REGISTER_API(StringEqObj);
@@ -12536,27 +12595,15 @@ int
 Jim_SetResult_sprintf( Jim_Interp *interp, const char *fmt,... )
 {
        va_list ap;
-#ifndef HAVE_VASPRINTF
-       /* yucky way */
-       char buf[2048];
-
-       va_start(ap,fmt);
-       vsnprintf( buf, sizeof(buf), fmt, ap );
-       va_end(ap);
-       /* garentee termination */
-       buf[2047] = 0;
-       Jim_SetResultString( interp, buf, -1 );
-
-#else
        char *buf;
+       
        va_start(ap,fmt);
-       vasprintf( &buf, fmt, ap );
+       buf = jim_vasprintf( fmt, ap );
        va_end(ap);
        if( buf ){
                Jim_SetResultString( interp, buf, -1 );
-               free(buf);
+               jim_vasprintf_done(buf);
        }
-#endif
        return JIM_OK;
 }
        
index a89500fb15af35a7326bdc3315efad4776b72e16..617cf002d0686049a2120fe77977d5751ba349a9 100644 (file)
@@ -675,6 +675,9 @@ JIM_STATIC char * JIM_API(Jim_StrDup) (const char *s);
 
 /* evaluation */
 JIM_STATIC int JIM_API(Jim_Eval)(Jim_Interp *interp, const char *script);
+/* in C code, you can do this and get better error messages */
+/*   Jim_Eval_Named( interp, "some tcl commands", __FILE__, __LINE__ ); */
+JIM_STATIC int JIM_API(Jim_Eval_Named)(Jim_Interp *interp, const char *script,const char *filename, int lineno);
 JIM_STATIC int JIM_API(Jim_EvalGlobal)(Jim_Interp *interp, const char *script);
 JIM_STATIC int JIM_API(Jim_EvalFile)(Jim_Interp *interp, const char *filename);
 JIM_STATIC int JIM_API(Jim_EvalObj) (Jim_Interp *interp, Jim_Obj *scriptObjPtr);
@@ -733,6 +736,8 @@ JIM_STATIC Jim_Obj * JIM_API(Jim_NewStringObjNoAlloc) (Jim_Interp *interp,
         char *s, int len);
 JIM_STATIC void JIM_API(Jim_AppendString) (Jim_Interp *interp, Jim_Obj *objPtr,
         const char *str, int len);
+JIM_STATIC void JIM_API(Jim_AppendString_sprintf) (Jim_Interp *interp, Jim_Obj *objPtr,
+                                                                                                  const char *fmt, ... );
 JIM_STATIC void JIM_API(Jim_AppendObj) (Jim_Interp *interp, Jim_Obj *objPtr,
         Jim_Obj *appendObjPtr);
 JIM_STATIC void JIM_API(Jim_AppendStrings) (Jim_Interp *interp,
@@ -1169,6 +1174,7 @@ static void Jim_InitExtension(Jim_Interp *interp)
   JIM_GET_API(Alloc);
   JIM_GET_API(Free);
   JIM_GET_API(Eval);
+  JIM_GET_API(Eval_Named);
   JIM_GET_API(EvalGlobal);
   JIM_GET_API(EvalFile);
   JIM_GET_API(EvalObj);
@@ -1195,6 +1201,7 @@ static void Jim_InitExtension(Jim_Interp *interp)
   JIM_GET_API(NewStringObj);
   JIM_GET_API(NewStringObjNoAlloc);
   JIM_GET_API(AppendString);
+  JIM_GET_API(AppendString_sprintf);
   JIM_GET_API(AppendObj);
   JIM_GET_API(AppendStrings);
   JIM_GET_API(StringEqObj);
index 1b5c06e25b5904166c5cb1d6ac78148eb79663a2..63956a9ef46f237471deb2ed6f2d2d8ba8d09dfc 100644 (file)
@@ -109,18 +109,40 @@ proc unknown {args} {
        return -code error "Unknown command: $args"
 }
 
+proc new_target_name { } {
+    return [target number [expr [target count] - 1 ]]
+}
+
 
 proc target_script {target_num eventname scriptname} {
-       if {[string compare $eventname reset]==0} {
-               set eventname post_reset
-       }
 
-       # This is the script we invoke
-       proc "target_[set target_num]_[set eventname]" {} "script $scriptname" 
-       
+    set tname [target number $target_num]
+    
+    if { 0 == [string compare $eventname "reset"] } {
+       $tname configure -event old-post_reset "script $scriptname"
+       return
+    }
+
+    if { 0 == [string compare $eventname "post_reset"] } {
+       $tname configure -event old-post_reset "script $scriptname"
+       return
+    }
+
+    if { 0 == [string compare $eventname "pre_reset"] } {
+       $tname configure -event old-pre_reset "script $scriptname"
+       return
+    }
+
+    if { 0 == [string compare $eventname "gdb_program_config"] } {
+       $tname configure -event old-gdb_program_config "script $scriptname"
+       return
+    }
+
+    return -code error "Unknown target (old) event: $eventname (try $tname configure -event NAME)"
+
 }
 
-add_help_text target_script "<target#> <event=reset/pre_reset/post_halt/pre_resume/gdb_program_config> <script_file>"
+add_help_text target_script "DEPRECATED please see the new TARGETNAME configure -event interface"
 
 
 # Try flipping / and \ to find file if the filename does not
@@ -170,4 +192,4 @@ proc jtag_rclk {fallback_speed_khz} {
        }
 }
 
-add_help_text jtag_rclk "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed"
\ No newline at end of file
+add_help_text jtag_rclk "fallback_speed_khz - set JTAG speed to RCLK or use fallback speed"
index 95fa840666e562808e13faae29de42ff3b22eb7a..ca8d94489f20b000a48bbc7d950035b8a8fe6e02 100644 (file)
@@ -614,15 +614,6 @@ int gdb_output(struct command_context_s *context, const char* line)
        return ERROR_OK;
 }
 
-int gdb_program_handler(struct target_s *target, enum target_event event, void *priv)
-{
-       struct command_context_s *cmd_ctx = priv;
-
-       target_invoke_script(cmd_ctx, target, "gdb_program");
-       jtag_execute_queue();
-
-       return ERROR_OK;
-}
 
 static void gdb_frontend_halted(struct target_s *target, connection_t *connection)
 {
@@ -664,13 +655,15 @@ int gdb_target_callback_event_handler(struct target_s *target, enum target_event
 {
        connection_t *connection = priv;
 
+       target_handle_event( target, event );
        switch (event)
        {
                case TARGET_EVENT_HALTED:
                        gdb_frontend_halted(target, connection);
                        break;
                case TARGET_EVENT_GDB_FLASH_ERASE_START:
-                       gdb_program_handler(target, event, connection->cmd_ctx);
+                       target_handle_event( target, TARGET_EVENT_OLD_gdb_program_config );
+                       jtag_execute_queue();
                        break;
                default:
                        break;
@@ -748,7 +741,7 @@ int gdb_new_connection(connection_t *connection)
         */
        if (initial_ack != '+')
                gdb_putback_char(connection, initial_ack);
-
+       target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_ATTACH );
        return ERROR_OK;
 }
 
@@ -781,6 +774,7 @@ int gdb_connection_closed(connection_t *connection)
        target_unregister_event_callback(gdb_target_callback_event_handler, connection);
        log_remove_callback(gdb_log_callback, connection);
 
+       target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_DETACH );
        return ERROR_OK;
 }
 
@@ -1279,7 +1273,7 @@ int gdb_step_continue_packet(connection_t *connection, target_t *target, char *p
        if (packet[0] == 'c')
        {
                LOG_DEBUG("continue");
-               target_invoke_script(connection->cmd_ctx, target, "pre_resume");
+               target_handle_event( target, TARGET_EVENT_OLD_pre_resume );
                retval=target_resume(target, current, address, 0, 0); /* resume at current address, don't handle breakpoints, not debugging */
        }
        else if (packet[0] == 's')
@@ -1790,9 +1784,11 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
 
                /* perform any target specific operations before the erase */
                target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_ERASE_START);
+               result = flash_erase_address_range(gdb_service->target, addr, length );
+               target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_ERASE_END);
 
                /* perform erase */
-               if ((result = flash_erase_address_range(gdb_service->target, addr, length)) != ERROR_OK)
+               if (result != ERROR_OK)
                {
                        /* GDB doesn't evaluate the actual error number returned,
                         * treat a failed erase as an I/O error
@@ -1846,7 +1842,10 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
 
                /* process the flashing buffer. No need to erase as GDB
                 * always issues a vFlashErase first. */
-               if ((result = flash_write(gdb_service->target, gdb_connection->vflash_image, &written, 0)) != ERROR_OK)
+               target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_WRITE_START);
+               result = flash_write(gdb_service->target, gdb_connection->vflash_image, &written, 0);
+               target_call_event_callbacks(gdb_service->target, TARGET_EVENT_GDB_FLASH_WRITE_END);
+               if ( result != ERROR_OK)
                {
                        if (result == ERROR_FLASH_DST_OUT_OF_BANK)
                                gdb_put_packet(connection, "E.memtype", 9);
@@ -1872,10 +1871,11 @@ int gdb_v_packet(connection_t *connection, target_t *target, char *packet, int p
 
 int gdb_detach(connection_t *connection, target_t *target)
 {
+
        switch( detach_mode )
        {
                case GDB_DETACH_RESUME:
-                       target_invoke_script(connection->cmd_ctx, target, "pre_resume");
+                       target_handle_event( target, TARGET_EVENT_OLD_pre_resume );
                        target_resume(target, 1, 0, 1, 0);
                        break;
 
@@ -1893,7 +1893,6 @@ int gdb_detach(connection_t *connection, target_t *target)
        }
 
        gdb_put_packet(connection, "OK", 2);
-
        return ERROR_OK;
 }
 
@@ -2279,3 +2278,12 @@ int gdb_register_commands(command_context_t *command_context)
                        "is not sufficient");
        return ERROR_OK;
 }
+
+
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index 2f4c1899ec37bf81b844a8f21f8d18c5c14b51f4..8d2a0f71d79aeb7f22e9d866a73dd1faa84d7376 100644 (file)
@@ -143,7 +143,7 @@ static int tcl_input(connection_t *connection)
                }
                else {
                        tclc->tc_line[tclc->tc_lineoffset-1] = '\0';
-                       retval = Jim_Eval(interp, tclc->tc_line);
+                       retval = Jim_Eval_Named(interp, tclc->tc_line, "remote:connection",1);
                        result = Jim_GetString(Jim_GetResult(interp), &reslen);
                        retval = tcl_output(connection, result, reslen);
                        if (retval != ERROR_OK)
index 56a397d3e3463efef84734b2cf3ea9b4cb744b7b..108194e5dc256b73b992369a2d97b39a03106d32 100644 (file)
@@ -92,7 +92,7 @@ target_type_t arm11_target =
     ARM11_HANDLER(run_algorithm),
        
     ARM11_HANDLER(register_commands),
-    ARM11_HANDLER(target_command),
+    ARM11_HANDLER(target_create),
     ARM11_HANDLER(init_target),
     ARM11_HANDLER(examine),
     ARM11_HANDLER(quit),
@@ -1351,28 +1351,21 @@ int arm11_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t
     return ERROR_OK;
 }
 
-int arm11_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int arm11_target_create(struct target_s *target, Jim_Interp *interp)
 {
     FNC_INFO;
 
-    if (argc < 4)
-    {
-       return ERROR_COMMAND_SYNTAX_ERROR;
-    }
-
-    int chain_pos = strtoul(args[3], NULL, 0);
-
     NEW(arm11_common_t, arm11, 1);
 
     arm11->target = target;
 
     /* prepare JTAG information for the new target */
-    arm11->jtag_info.chain_pos = chain_pos;
+    arm11->jtag_info.chain_pos = target->chain_position;
     arm11->jtag_info.scann_size        = 5;
 
     arm_jtag_setup_connection(&arm11->jtag_info);
 
-    jtag_device_t *device = jtag_get_device(chain_pos);
+    jtag_device_t *device = jtag_get_device(target->chain_position);
 
     if (device->ir_length != 5)
     {
@@ -1810,3 +1803,11 @@ int arm11_register_commands(struct command_context_s *cmd_ctx)
 
     return ERROR_OK;
 }
+
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index ccc9c09fc2222423eccd41b386707f7b2a229366..dfc8c8d46141dfa3535892e1b5ffbffbb21054c2 100644 (file)
@@ -222,7 +222,7 @@ int arm11_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
 int arm11_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
 
 int arm11_register_commands(struct command_context_s *cmd_ctx);
-int arm11_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int arm11_target_create(struct target_s *target, Jim_Interp *interp);
 int arm11_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int arm11_quit(void);
 
index fab553cfe6cfe5c72005333fcf54bae3fec635f1..e910af3e3a9ec8179335f75e07e698ca7dc2eca0 100644 (file)
@@ -42,7 +42,7 @@ int arm720t_handle_md_phys_command(struct command_context_s *cmd_ctx, char *cmd,
 int arm720t_handle_mw_phys_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 /* forward declarations */
-int arm720t_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int arm720t_target_create(struct target_s *target,Jim_Interp *interp);
 int arm720t_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int arm720t_quit(void);
 int arm720t_arch_state(struct target_s *target);
@@ -81,7 +81,7 @@ target_type_t arm720t_target =
        .remove_watchpoint = arm7_9_remove_watchpoint,
 
        .register_commands = arm720t_register_commands,
-       .target_command = arm720t_target_command,
+       .target_create = arm720t_target_create,
        .init_target = arm720t_init_target,
        .examine = arm7tdmi_examine,
        .quit = arm720t_quit
@@ -436,7 +436,7 @@ int arm720t_quit(void)
        return ERROR_OK;
 }
 
-int arm720t_init_arch_info(target_t *target, arm720t_common_t *arm720t, int chain_pos, char *variant)
+int arm720t_init_arch_info(target_t *target, arm720t_common_t *arm720t, int chain_pos, const char *variant)
 {
        arm7tdmi_common_t *arm7tdmi = &arm720t->arm7tdmi_common;
        arm7_9_common_t *arm7_9 = &arm7tdmi->arm7_9_common;
@@ -461,27 +461,11 @@ int arm720t_init_arch_info(target_t *target, arm720t_common_t *arm720t, int chai
        return ERROR_OK;
 }
 
-int arm720t_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int arm720t_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
-       arm720t_common_t *arm720t = malloc(sizeof(arm720t_common_t));
-       memset(arm720t, 0, sizeof(*arm720t));
+       arm720t_common_t *arm720t = calloc(1,sizeof(arm720t_common_t));
        
-       if (argc < 4)
-       {
-               LOG_ERROR("'target arm720t' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
-       
-       if (argc >= 5)
-               variant = args[4];
-       
-       LOG_DEBUG("chain_pos: %i, variant: %s", chain_pos, variant);
-       
-       arm720t_init_arch_info(target, arm720t, chain_pos, variant);
+       arm720t_init_arch_info(target, arm720t, target->chain_position, target->variant);
 
        return ERROR_OK;
 }
@@ -644,3 +628,10 @@ int arm720t_handle_mw_phys_command(command_context_t *cmd_ctx, char *cmd, char *
        return armv4_5_mmu_handle_mw_phys_command(cmd_ctx, cmd, args, argc, target, &arm720t->armv4_5_mmu);
 }
 
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index f3e9fd5f9e4a119d39009550e733972171278ee5..56198d1cb7883d78869b8bcc07773dc7cf522cea 100644 (file)
@@ -44,8 +44,8 @@
 int arm7tdmi_register_commands(struct command_context_s *cmd_ctx);
 
 /* forward declarations */
-int arm7tdmi_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
-int arm7tdmi_target_create(Jim_Interp *interp, struct target_s *target);
+
+int arm7tdmi_target_create(struct target_s *target,Jim_Interp *interp);
 int arm7tdmi_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int arm7tdmi_quit(void);
 
@@ -85,9 +85,8 @@ target_type_t arm7tdmi_target =
        .add_watchpoint = arm7_9_add_watchpoint,
        .remove_watchpoint = arm7_9_remove_watchpoint,
 
-       .register_commands = arm7tdmi_register_commands,
-       .target_command = arm7tdmi_target_command,
-       // .target_create    = arm7tdmi_target_create,
+       .register_commands  = arm7tdmi_register_commands,
+       .target_create  = arm7tdmi_target_create,
        .init_target = arm7tdmi_init_target,
        .examine = arm7tdmi_examine,
        .quit = arm7tdmi_quit
@@ -829,32 +828,9 @@ int arm7tdmi_init_arch_info(target_t *target, arm7tdmi_common_t *arm7tdmi, int c
        return ERROR_OK;
 }
 
-/* target arm7tdmi <endianess> <startup_mode> <chain_pos> <variant> */
-int arm7tdmi_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
-{
-       int chain_pos;
-       char *variant = NULL;
-       arm7tdmi_common_t *arm7tdmi = malloc(sizeof(arm7tdmi_common_t));
-       memset(arm7tdmi, 0, sizeof(*arm7tdmi));
 
-       if (argc < 4)
-       {
-               LOG_ERROR("'target arm7tdmi' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
-       
-       if (argc >= 5)
-               variant = args[4];
-       
-       arm7tdmi_init_arch_info(target, arm7tdmi, chain_pos, variant);
-       
-       return ERROR_OK;
-}
 
-int arm7tdmi_target_create(Jim_Interp *interp,
-                                                  struct target_s *target)
+int arm7tdmi_target_create( struct target_s *target, Jim_Interp *interp )
 {
        arm7tdmi_common_t *arm7tdmi;
        
@@ -866,7 +842,6 @@ int arm7tdmi_target_create(Jim_Interp *interp,
 }
 
 
-
 int arm7tdmi_register_commands(struct command_context_s *cmd_ctx)
 {
        int retval;
@@ -878,6 +853,8 @@ int arm7tdmi_register_commands(struct command_context_s *cmd_ctx)
 }
 
 
+
+
 /*
  * Local Variables: ***
  * c-basic-offset: 4 ***
index 29228d8c825770800edead93007720374ac1471c..67ffb3877a6b3429875f1598408bfd2940dc6902 100644 (file)
@@ -47,7 +47,7 @@ int arm920t_handle_read_cache_command(struct command_context_s *cmd_ctx, char *c
 int arm920t_handle_read_mmu_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 /* forward declarations */
-int arm920t_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int arm920t_target_create(struct target_s *target, Jim_Interp *interp);
 int arm920t_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int arm920t_quit(void);
 int arm920t_arch_state(struct target_s *target);
@@ -90,7 +90,7 @@ target_type_t arm920t_target =
        .remove_watchpoint = arm7_9_remove_watchpoint,
 
        .register_commands = arm920t_register_commands,
-       .target_command = arm920t_target_command,
+       .target_create = arm920t_target_create,
        .init_target = arm920t_init_target,
        .examine = arm9tdmi_examine,
        .quit = arm920t_quit
@@ -699,7 +699,7 @@ int arm920t_quit(void)
        return ERROR_OK;
 }
 
-int arm920t_init_arch_info(target_t *target, arm920t_common_t *arm920t, int chain_pos, char *variant)
+int arm920t_init_arch_info(target_t *target, arm920t_common_t *arm920t, int chain_pos, const char *variant)
 {
        arm9tdmi_common_t *arm9tdmi = &arm920t->arm9tdmi_common;
        arm7_9_common_t *arm7_9 = &arm9tdmi->arm7_9_common;
@@ -735,27 +735,11 @@ int arm920t_init_arch_info(target_t *target, arm920t_common_t *arm920t, int chai
        return ERROR_OK;
 }
 
-int arm920t_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int arm920t_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
-       arm920t_common_t *arm920t = malloc(sizeof(arm920t_common_t));
-       memset(arm920t, 0, sizeof(*arm920t));
+       arm920t_common_t *arm920t = calloc(1,sizeof(arm920t_common_t));
        
-       if (argc < 4)
-       {
-               LOG_ERROR("'target arm920t' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
-       
-       if (argc >= 5)
-               variant = args[4];
-       
-       LOG_DEBUG("chain_pos: %i, variant: %s", chain_pos, variant);
-       
-       arm920t_init_arch_info(target, arm920t, chain_pos, variant);
+       arm920t_init_arch_info(target, arm920t, target->chain_position, target->variant);
 
        return ERROR_OK;
 }
@@ -1516,3 +1500,12 @@ int arm920t_handle_mw_phys_command(command_context_t *cmd_ctx, char *cmd, char *
        
        return armv4_5_mmu_handle_mw_phys_command(cmd_ctx, cmd, args, argc, target, &arm920t->armv4_5_mmu);
 }
+
+
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index 51a666533c6b870547a13906843bca3feb77de7d..c25a677de2dfec3175c796ab375b9c9292ac22ce 100644 (file)
@@ -47,7 +47,7 @@ int arm926ejs_handle_read_cache_command(struct command_context_s *cmd_ctx, char
 int arm926ejs_handle_read_mmu_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 /* forward declarations */
-int arm926ejs_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int arm926ejs_target_create(struct target_s *target, Jim_Interp *interp);
 int arm926ejs_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int arm926ejs_quit(void);
 int arm926ejs_arch_state(struct target_s *target);
@@ -90,7 +90,7 @@ target_type_t arm926ejs_target =
        .remove_watchpoint = arm7_9_remove_watchpoint,
 
        .register_commands = arm926ejs_register_commands,
-       .target_command = arm926ejs_target_command,
+       .target_create = arm926ejs_target_create,
        .init_target = arm926ejs_init_target,
        .examine = arm9tdmi_examine,
        .quit = arm926ejs_quit,
@@ -680,7 +680,7 @@ int arm926ejs_quit(void)
        return ERROR_OK;
 }
 
-int arm926ejs_init_arch_info(target_t *target, arm926ejs_common_t *arm926ejs, int chain_pos, char *variant)
+int arm926ejs_init_arch_info(target_t *target, arm926ejs_common_t *arm926ejs, int chain_pos, const char *variant)
 {
        arm9tdmi_common_t *arm9tdmi = &arm926ejs->arm9tdmi_common;
        arm7_9_common_t *arm7_9 = &arm9tdmi->arm7_9_common;
@@ -717,27 +717,11 @@ int arm926ejs_init_arch_info(target_t *target, arm926ejs_common_t *arm926ejs, in
        return ERROR_OK;
 }
 
-int arm926ejs_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int arm926ejs_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
-       arm926ejs_common_t *arm926ejs = malloc(sizeof(arm926ejs_common_t));
-       memset(arm926ejs, 0, sizeof(*arm926ejs));
+       arm926ejs_common_t *arm926ejs = calloc(1,sizeof(arm926ejs_common_t));
        
-       if (argc < 4)
-       {
-               LOG_ERROR("'target arm926ejs' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
-       
-       if (argc >= 5)
-               variant = args[4];
-       
-       LOG_DEBUG("chain_pos: %i, variant: %s", chain_pos, variant);
-       
-       arm926ejs_init_arch_info(target, arm926ejs, chain_pos, variant);
+       arm926ejs_init_arch_info(target, arm926ejs, target->chain_position, target->variant);
 
        return ERROR_OK;
 }
@@ -963,3 +947,10 @@ static int arm926ejs_mmu(struct target_s *target, int *enabled)
        *enabled = arm926ejs->armv4_5_mmu.mmu_enabled;
        return ERROR_OK;
 }
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index 178fc2298e9d18c7c6ce815dec970006967cd43b..f40120c065a684dac061650cc8c9f2e748406616 100644 (file)
@@ -43,7 +43,7 @@ typedef struct arm926ejs_common_s
        u32 d_far;
 } arm926ejs_common_t;
 
-extern int arm926ejs_init_arch_info(target_t *target, arm926ejs_common_t *arm926ejs, int chain_pos, char *variant);
+extern int arm926ejs_init_arch_info(target_t *target, arm926ejs_common_t *arm926ejs, int chain_pos, const char *variant);
 extern int arm926ejs_register_commands(struct command_context_s *cmd_ctx); 
 extern int arm926ejs_arch_state(struct target_s *target); 
 extern int arm926ejs_write_memory(struct target_s *target, u32 address, u32 size, u32 count, u8 *buffer); 
index f6e3fde5c58adee65558af520d121712f71645b1..60682af834532bd4cdad4ab211fd844e763ca3db 100644 (file)
@@ -43,7 +43,7 @@
 int arm966e_register_commands(struct command_context_s *cmd_ctx);
 
 /* forward declarations */
-int arm966e_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int arm966e_target_create(struct target_s *target, Jim_Interp *interp);
 int arm966e_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int arm966e_quit(void);
 
@@ -80,7 +80,7 @@ target_type_t arm966e_target =
        .remove_watchpoint = arm7_9_remove_watchpoint,
 
        .register_commands = arm966e_register_commands,
-       .target_command = arm966e_target_command,
+       .target_create = arm966e_target_create,
        .init_target = arm966e_init_target,
        .examine = arm9tdmi_examine,
        .quit = arm966e_quit,
@@ -99,7 +99,7 @@ int arm966e_quit(void)
        return ERROR_OK;
 }
 
-int arm966e_init_arch_info(target_t *target, arm966e_common_t *arm966e, int chain_pos, char *variant)
+int arm966e_init_arch_info(target_t *target, arm966e_common_t *arm966e, int chain_pos, const char *variant)
 {
        arm9tdmi_common_t *arm9tdmi = &arm966e->arm9tdmi_common;
        arm7_9_common_t *arm7_9 = &arm9tdmi->arm7_9_common;
@@ -118,27 +118,11 @@ int arm966e_init_arch_info(target_t *target, arm966e_common_t *arm966e, int chai
        return ERROR_OK;
 }
 
-int arm966e_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int arm966e_target_create( struct target_s *target, Jim_Interp *interp )
 {
-       int chain_pos;
-       char *variant = NULL;
-       arm966e_common_t *arm966e = malloc(sizeof(arm966e_common_t));
-       memset(arm966e, 0, sizeof(*arm966e));
+       arm966e_common_t *arm966e = calloc(1,sizeof(arm966e_common_t));
        
-       if (argc < 4)
-       {
-               LOG_ERROR("'target arm966e' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
-       
-       if (argc >= 5)
-               variant = args[4];
-       
-       LOG_DEBUG("chain_pos: %i, variant: %s", chain_pos, variant);
-       
-       arm966e_init_arch_info(target, arm966e, chain_pos, variant);
+       arm966e_init_arch_info(target, arm966e, target->chain_position, target->variant);
 
        return ERROR_OK;
 }
@@ -361,3 +345,10 @@ int arm966e_register_commands(struct command_context_s *cmd_ctx)
        
        return ERROR_OK;
 }
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index 0c242fad7f6ec93209ff842b571df530eaecabe3..dcb35dabb88d93a3acc12e41f88ed9e73309eb4d 100644 (file)
@@ -46,7 +46,8 @@ int arm9tdmi_register_commands(struct command_context_s *cmd_ctx);
 int handle_arm9tdmi_catch_vectors_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 /* forward declarations */
-int arm9tdmi_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int arm9tdmi_target_create( struct target_s *target, Jim_Interp *interp );
+
 int arm9tdmi_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int arm9tdmi_quit(void);
                
@@ -83,7 +84,7 @@ target_type_t arm9tdmi_target =
        .remove_watchpoint = arm7_9_remove_watchpoint,
 
        .register_commands = arm9tdmi_register_commands,
-       .target_command = arm9tdmi_target_command,
+       .target_create = arm9tdmi_target_create,
        .init_target = arm9tdmi_init_target,
        .examine = arm9tdmi_examine,
        .quit = arm9tdmi_quit
@@ -902,7 +903,7 @@ int arm9tdmi_quit(void)
        return ERROR_OK;
 }
 
-int arm9tdmi_init_arch_info(target_t *target, arm9tdmi_common_t *arm9tdmi, int chain_pos, char *variant)
+int arm9tdmi_init_arch_info(target_t *target, arm9tdmi_common_t *arm9tdmi, int chain_pos, const char *variant)
 {
        armv4_5_common_t *armv4_5;
        arm7_9_common_t *arm7_9;
@@ -1007,26 +1008,12 @@ int arm9tdmi_get_arch_pointers(target_t *target, armv4_5_common_t **armv4_5_p, a
 }
 
 
-/* target arm9tdmi <endianess> <startup_mode> <chain_pos> <variant>*/
-int arm9tdmi_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+
+int arm9tdmi_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
-       arm9tdmi_common_t *arm9tdmi = malloc(sizeof(arm9tdmi_common_t));
-       memset(arm9tdmi, 0, sizeof(*arm9tdmi));
+       arm9tdmi_common_t *arm9tdmi = calloc(1,sizeof(arm9tdmi_common_t));
 
-       if (argc < 4)
-       {
-               LOG_ERROR("'target arm9tdmi' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
-       
-       if (argc >= 5)
-               variant = args[4];
-       
-       arm9tdmi_init_arch_info(target, arm9tdmi, chain_pos, variant);
+       arm9tdmi_init_arch_info(target, arm9tdmi, target->chain_position, target->variant);
        
        return ERROR_OK;
 }
@@ -1129,3 +1116,12 @@ int handle_arm9tdmi_catch_vectors_command(struct command_context_s *cmd_ctx, cha
 
        return ERROR_OK;
 }
+
+
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index 249a9287425f5e474f7ac1c9f6f0e15cc6815fb3..18297b62d8c33537f3c5134fc6ad9bdc2c267a8d 100644 (file)
@@ -57,7 +57,7 @@ enum arm9tdmi_vector
 
 extern int arm9tdmi_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int arm9tdmi_examine(struct target_s *target);
-extern int arm9tdmi_init_arch_info(target_t *target, arm9tdmi_common_t *arm9tdmi, int chain_pos, char *variant);
+extern int arm9tdmi_init_arch_info(target_t *target, arm9tdmi_common_t *arm9tdmi, int chain_pos, const char *variant);
 extern int arm9tdmi_register_commands(struct command_context_s *cmd_ctx);
 
 extern int arm9tdmi_clock_out(arm_jtag_t *jtag_info, u32 instr, u32 out, u32 *in, int sysspeed);
index dd9c6992536f4fb0d2b30c55464acd9aad3e28e1..e034189a07978a6addbc1845f1e99c2da9fb66a1 100644 (file)
@@ -45,7 +45,7 @@ int cortex_m3_register_commands(struct command_context_s *cmd_ctx);
 /* forward declarations */
 void cortex_m3_enable_breakpoints(struct target_s *target);
 void cortex_m3_enable_watchpoints(struct target_s *target);
-int cortex_m3_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int cortex_m3_target_create(struct target_s *target, Jim_Interp *interp);
 int cortex_m3_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int cortex_m3_quit(void);
 int cortex_m3_load_core_reg_u32(target_t *target, enum armv7m_regtype type, u32 num, u32 *value);
@@ -91,7 +91,7 @@ target_type_t cortexm3_target =
        .remove_watchpoint = cortex_m3_remove_watchpoint,
 
        .register_commands = cortex_m3_register_commands,
-       .target_command = cortex_m3_target_command,
+       .target_create = cortex_m3_target_create,
        .init_target = cortex_m3_init_target,
        .examine = cortex_m3_examine,
        .quit = cortex_m3_quit
@@ -1463,7 +1463,7 @@ int cortex_m3_handle_target_request(void *priv)
        return ERROR_OK;
 }
 
-int cortex_m3_init_arch_info(target_t *target, cortex_m3_common_t *cortex_m3, int chain_pos, char *variant)
+int cortex_m3_init_arch_info(target_t *target, cortex_m3_common_t *cortex_m3, int chain_pos, const char *variant)
 {
        armv7m_common_t *armv7m;
        armv7m = &cortex_m3->armv7m;
@@ -1510,26 +1510,11 @@ int cortex_m3_init_arch_info(target_t *target, cortex_m3_common_t *cortex_m3, in
        return ERROR_OK;
 }
 
-/* target cortex_m3 <endianess> <startup_mode> <chain_pos> <variant>*/
-int cortex_m3_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int cortex_m3_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
-       cortex_m3_common_t *cortex_m3 = malloc(sizeof(cortex_m3_common_t));
-       memset(cortex_m3, 0, sizeof(*cortex_m3));
-
-       if (argc < 4)
-       {
-               LOG_ERROR("'target cortex_m3' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
+       cortex_m3_common_t *cortex_m3 = calloc(1,sizeof(cortex_m3_common_t));
        
-       if (argc >= 5)
-               variant = args[4];
-       
-       cortex_m3_init_arch_info(target, cortex_m3, chain_pos, variant);
+       cortex_m3_init_arch_info(target, cortex_m3, target->chain_position, target->variant);
        
        return ERROR_OK;
 }
@@ -1542,3 +1527,11 @@ int cortex_m3_register_commands(struct command_context_s *cmd_ctx)
        
        return retval;
 }
+
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index 0d4678e83d2434f1549b233fd18c6d6baf35b1ba..fec0a9edbc4d294a6857c21b210ba41bfea81945 100644 (file)
@@ -186,6 +186,6 @@ int cortex_m3_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
 int cortex_m3_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
 
 extern int cortex_m3_register_commands(struct command_context_s *cmd_ctx);
-extern int cortex_m3_init_arch_info(target_t *target, cortex_m3_common_t *cortex_m3, int chain_pos, char *variant);
+extern int cortex_m3_init_arch_info(target_t *target, cortex_m3_common_t *cortex_m3, int chain_pos, const char *variant);
 
 #endif /* CORTEX_M3_H */
index e4874620a764c6383bafc815214222a04debb51c..a5bdc2e17861fbedefda82cf17ff1f80c7ad47fc 100644 (file)
@@ -55,7 +55,7 @@
 #include <string.h>
 
 int feroceon_examine(struct target_s *target);
-int feroceon_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int feroceon_target_create(struct target_s *target, Jim_Interp *interp);
 int feroceon_bulk_write_memory(target_t *target, u32 address, u32 count, u8 *buffer);
 int feroceon_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int feroceon_quit(void);
@@ -106,7 +106,7 @@ target_type_t feroceon_target =
        .remove_watchpoint = arm7_9_remove_watchpoint,
 
        .register_commands = arm926ejs_register_commands,
-       .target_command = feroceon_target_command,
+       .target_create = feroceon_target_create,
        .init_target = feroceon_init_target,
        .examine = feroceon_examine,
        .quit = feroceon_quit
@@ -646,29 +646,13 @@ int feroceon_quit(void)
        return ERROR_OK;
 }
 
-int feroceon_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int feroceon_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
        armv4_5_common_t *armv4_5;
        arm7_9_common_t *arm7_9;
-       arm926ejs_common_t *arm926ejs = malloc(sizeof(arm926ejs_common_t));
-       memset(arm926ejs, 0, sizeof(*arm926ejs));
-       
-       if (argc < 4)
-       {
-               LOG_ERROR("'target arm926ejs' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
-       
-       if (argc >= 5)
-               variant = args[4];
-       
-       LOG_DEBUG("chain_pos: %i, variant: %s", chain_pos, variant);
-       
-       arm926ejs_init_arch_info(target, arm926ejs, chain_pos, variant);
+       arm926ejs_common_t *arm926ejs = calloc(1,sizeof(arm926ejs_common_t));
+  
+       arm926ejs_init_arch_info(target, arm926ejs, target->chain_position, target->variant);
 
        armv4_5 = target->arch_info;
        arm7_9 = armv4_5->arch_info;
@@ -741,3 +725,10 @@ int feroceon_examine(struct target_s *target)
        
        return ERROR_OK;
 }
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index 5870ae692bfa3f4f4f394ff6decd2f0c1dc02128..96e509c3b895ad42b3a47bd18b6ece9ee17b804f 100644 (file)
@@ -314,7 +314,7 @@ reg_cache_t *mips32_build_reg_cache(target_t *target)
        return cache;
 }
 
-int mips32_init_arch_info(target_t *target, mips32_common_t *mips32, int chain_pos, char *variant)
+int mips32_init_arch_info(target_t *target, mips32_common_t *mips32, int chain_pos, const char *variant)
 {
        target->arch_info = mips32;
        mips32->common_magic = MIPS32_COMMON_MAGIC;
index aeed1a605e47e2386a810d6e848b8a2d0179c6a1..a7a98b5c839821ea199a23f7146f4b206034d047 100644 (file)
@@ -99,7 +99,7 @@ typedef struct mips32_core_reg_s
 #define MIPS32_DRET                                    0x4200001F
 
 extern int mips32_arch_state(struct target_s *target);
-extern int mips32_init_arch_info(target_t *target, mips32_common_t *mips32, int chain_pos, char *variant);
+extern int mips32_init_arch_info(target_t *target, mips32_common_t *mips32, int chain_pos, const char *variant);
 extern int mips32_restore_context(target_t *target);
 extern int mips32_save_context(target_t *target);
 extern reg_cache_t *mips32_build_reg_cache(target_t *target);
index 599b2159548fa3b9e079bf2cb513fb7f5d036772..6f8c1e93a823df1bcb4e2809ffe37895562118f1 100644 (file)
@@ -44,7 +44,7 @@ int mips_m4k_write_memory(struct target_s *target, u32 address, u32 size, u32 co
 int mips_m4k_register_commands(struct command_context_s *cmd_ctx);
 int mips_m4k_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int mips_m4k_quit(void);
-int mips_m4k_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int mips_m4k_target_create(struct target_s *target, Jim_Interp *interp);
 
 int mips_m4k_examine(struct target_s *target);
 int mips_m4k_assert_reset(target_t *target);
@@ -83,7 +83,7 @@ target_type_t mips_m4k_target =
        .remove_watchpoint = mips_m4k_remove_watchpoint,
 
        .register_commands = mips_m4k_register_commands,
-       .target_command = mips_m4k_target_command,
+       .target_create = mips_m4k_target_create,
        .init_target = mips_m4k_init_target,
        .examine = mips_m4k_examine,
        .quit = mips_m4k_quit
@@ -578,7 +578,7 @@ int mips_m4k_quit(void)
        return ERROR_OK;
 }
 
-int mips_m4k_init_arch_info(target_t *target, mips_m4k_common_t *mips_m4k, int chain_pos, char *variant)
+int mips_m4k_init_arch_info(target_t *target, mips_m4k_common_t *mips_m4k, int chain_pos, const char *variant)
 {
        mips32_common_t *mips32 = &mips_m4k->mips32_common;
        
@@ -600,24 +600,11 @@ int mips_m4k_init_arch_info(target_t *target, mips_m4k_common_t *mips_m4k, int c
        return ERROR_OK;
 }
 
-int mips_m4k_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int mips_m4k_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
-       mips_m4k_common_t *mips_m4k = malloc(sizeof(mips_m4k_common_t));
+       mips_m4k_common_t *mips_m4k = calloc(1,sizeof(mips_m4k_common_t));
        
-       if (argc < 4)
-       {
-               LOG_ERROR("'target mips4k' requires at least one additional argument");
-               exit(-1);
-       }
-       
-       chain_pos = strtoul(args[3], NULL, 0);
-       
-       if (argc >= 5)
-               variant = args[4];
-       
-       mips_m4k_init_arch_info(target, mips_m4k, chain_pos, variant);
+       mips_m4k_init_arch_info(target, mips_m4k, target->chain_position, target->variant);
        
        return ERROR_OK;
 }
@@ -652,3 +639,11 @@ int mips_m4k_bulk_write_memory(target_t *target, u32 address, u32 count, u8 *buf
 {
        return mips_m4k_write_memory(target, address, 4, count, buffer);
 }
+
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */
index f79156ad645d0cdafd3d1afafe19913e0e0a6147..08a0505f2331b003aa4423e76cd2debb53740750 100644 (file)
@@ -52,7 +52,7 @@
 
 int cli_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv);
 
-int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
+
 int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 
 int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
@@ -78,7 +78,7 @@ int handle_virt2phys_command(command_context_t *cmd_ctx, char *cmd, char **args,
 int handle_profile_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc);
 static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
 static int jim_mem2array(Jim_Interp *interp, int argc, Jim_Obj *const *argv);
-
+static int jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv);
 
 static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv);
 static int target_mem2array(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv);
@@ -128,31 +128,78 @@ const Jim_Nvp nvp_assert[] = {
        { .name = NULL, .value = -1 }
 };
 
+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" },
+       { .value = ERROR_TARGET_NOT_HALTED, .name = "err-not-halted" },
+       { .value = ERROR_TARGET_FAILURE, .name = "err-failure" },
+       { .value = ERROR_TARGET_UNALIGNED_ACCESS   , .name = "err-unaligned-access" },
+       { .value = ERROR_TARGET_DATA_ABORT , .name = "err-data-abort" },
+       { .value = ERROR_TARGET_RESOURCE_NOT_AVAILABLE , .name = "err-resource-not-available" },
+       { .value = ERROR_TARGET_TRANSLATION_FAULT  , .name = "err-translation-fault" },
+       { .value = ERROR_TARGET_NOT_RUNNING, .name = "err-not-running" },
+       { .value = ERROR_TARGET_NOT_EXAMINED, .name = "err-not-examined" },
+       { .value = -1, .name = NULL }
+};
+
+const char *target_strerror_safe( int err )
+{
+       const Jim_Nvp *n;
+
+       n = Jim_Nvp_value2name_simple( nvp_error_target, err );
+       if( n->name == NULL ){
+               return "unknown";
+       } else {
+               return n->name;
+       }
+}
+
 const Jim_Nvp nvp_target_event[] = {
+       { .value = TARGET_EVENT_OLD_pre_reset          , .name = "old-pre_reset" },
+       { .value = TARGET_EVENT_OLD_gdb_program_config , .name = "old-gdb_program_config" },
+       { .value = TARGET_EVENT_OLD_post_reset         , .name = "old-post_reset" },
+       { .value = TARGET_EVENT_OLD_pre_resume         , .name = "old-pre_resume" },
+       
+
        { .value = TARGET_EVENT_HALTED, .name = "halted" },
        { .value = TARGET_EVENT_RESUMED, .name = "resumed" },
        { .value = TARGET_EVENT_RESUME_START, .name = "resume-start" },
        { .value = TARGET_EVENT_RESUME_END, .name = "resume-end" },
 
        /* historical name */
-       { .value = TARGET_EVENT_RESET_START  , .name = "pre_reset" },
+
        { .value = TARGET_EVENT_RESET_START, .name = "reset-start" },
-       /* historical name */
-       { .value = TARGET_EVENT_RESET      , .name = "reset" },
+
+       { .value = TARGET_EVENT_RESET_ASSERT_PRE,    .name = "reset-assert-pre" },
+       { .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_PRE,      .name = "reset-halt-pre" },
+       { .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_EXAMINE_START, .name = "examine-start" },
+       { .value = TARGET_EVENT_EXAMINE_START, .name = "examine-end" },
+       
+
        { .value = TARGET_EVENT_DEBUG_HALTED, .name = "debug-halted" },
        { .value = TARGET_EVENT_DEBUG_RESUMED, .name = "debug-resumed" },
 
        { .value = TARGET_EVENT_GDB_ATTACH, .name = "gdb-attach" },
        { .value = TARGET_EVENT_GDB_DETACH, .name = "gdb-detach" },
 
+
        { .value = TARGET_EVENT_GDB_FLASH_WRITE_START, .name = "gdb-flash-write-start" },
        { .value = TARGET_EVENT_GDB_FLASH_WRITE_END  , .name = "gdb-flash-write-end"   },
 
-       { .value = TARGET_EVENT_GDB_FLASH_ERASE_START , .name = "gdb_program_config" },
-
        { .value = TARGET_EVENT_GDB_FLASH_ERASE_START, .name = "gdb-flash-erase-start" },
        { .value = TARGET_EVENT_GDB_FLASH_ERASE_END  , .name = "gdb-flash-erase-end" },
 
@@ -193,6 +240,30 @@ const Jim_Nvp nvp_target_endian[] = {
        { .name = NULL,     .value = -1 },
 };
 
+const Jim_Nvp nvp_reset_modes[] = {
+       { .name = "unknown", .value = RESET_UNKNOWN },
+       { .name = "run"    , .value = RESET_RUN },
+       { .name = "halt"   , .value = RESET_HALT },
+       { .name = "init"   , .value = RESET_INIT },
+       { .name = NULL     , .value = -1 },
+};
+
+static int
+max_target_number( void )
+{
+       target_t *t;
+       int x;
+
+       x = -1;
+       t = all_targets;
+       while( t ){
+               if( x < t->target_number ){
+                       x = (t->target_number)+1;
+               }
+               t = t->next;
+       }
+       return x;
+}
 
 /* determine the number of the new target */
 static int
@@ -340,17 +411,15 @@ int target_resume(struct target_s *target, int current, u32 address, int handle_
        return retval;
 }
 
+// Next patch - this turns into TCL...
 int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode)
 {
        int retval = ERROR_OK;
        target_t *target;
 
        target = all_targets;
-       while (target)
-       {
-               target_invoke_script(cmd_ctx, target, "pre_reset");
-               target = target->next;
-       }
+
+       target_all_handle_event( TARGET_EVENT_OLD_pre_reset );
 
        if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
                return retval;
@@ -423,8 +492,9 @@ int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mo
                        /* Wait for reset to complete, maximum 5 seconds. */
                        if (((retval=target_wait_state(target, TARGET_HALTED, 5000)))==ERROR_OK)
                        {
-                         if (reset_mode == RESET_INIT)
-                                       target_invoke_script(cmd_ctx, target, "post_reset");
+                               if (reset_mode == RESET_INIT){
+                                       target_handle_event( target, TARGET_EVENT_OLD_post_reset );
+                               }
 
                        }
                        target = target->next;
@@ -688,8 +758,11 @@ int target_call_event_callbacks(target_t *target, enum target_event event)
        target_event_callback_t *callback = target_event_callbacks;
        target_event_callback_t *next_callback;
 
-       LOG_DEBUG("target event %i", event);
+       LOG_DEBUG("target event %i (%s)", 
+                         event, 
+                         Jim_Nvp_value2name_simple( nvp_target_event, event )->name );
 
+       target_handle_event( target, event );
 
        while (callback)
        {
@@ -903,12 +976,13 @@ int target_free_all_working_areas(struct target_s *target)
 
 int target_register_commands(struct command_context_s *cmd_ctx)
 {
-       register_command(cmd_ctx, NULL, "target", handle_target_command, COMMAND_CONFIG, "target <cpu> [reset_init default - DEPRECATED] <chainpos> <endianness> <variant> [cpu type specifc args]");
+
        register_command(cmd_ctx, NULL, "targets", handle_targets_command, COMMAND_EXEC, NULL);
        register_command(cmd_ctx, NULL, "working_area", handle_working_area_command, COMMAND_ANY, "working_area <target#> <address> <size> <'backup'|'nobackup'> [virtual address]");
        register_command(cmd_ctx, NULL, "virt2phys", handle_virt2phys_command, COMMAND_ANY, "virt2phys <virtual address>");
        register_command(cmd_ctx, NULL, "profile", handle_profile_command, COMMAND_EXEC, "PRELIMINARY! - profile <seconds> <gmon.out>");
 
+       register_jim(cmd_ctx, "target", jim_target, "configure target" );
 
 
        /* script procedures */
@@ -1343,16 +1417,17 @@ int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **
        }
  DumpTargets:
 
-       command_print(cmd_ctx, "    CmdName    Type       Endian     State     ");
-       command_print(cmd_ctx, "--  ---------- ---------- ---------- ----------");
+       command_print(cmd_ctx, "    CmdName    Type       Endian     ChainPos State     ");
+       command_print(cmd_ctx, "--  ---------- ---------- ---------- -------- ----------");
        while (target)
        {
                /* XX: abcdefghij abcdefghij abcdefghij abcdefghij */
-               command_print(cmd_ctx, "%2d: %-10s %-10s %-10s %s", 
+               command_print(cmd_ctx, "%2d: %-10s %-10s %-10s %8d %s", 
                                          target->target_number,
-                                         "", // future: target->cmd_name
+                                         target->cmd_name,
                                          target->type->name, 
                                          Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness )->name, 
+                                         target->chain_position,
                                          Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name );
                target = target->next;
        }
@@ -1360,143 +1435,7 @@ int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **
        return ERROR_OK;
 }
 
-int handle_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
-{
-       int i;
-       int found = 0;
-
-       if (argc < 3)
-       {
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-
-       /* search for the specified target */
-       if (args[0] && (args[0][0] != 0))
-       {
-               for (i = 0; target_types[i]; i++)
-               {
-                       if (strcmp(args[0], target_types[i]->name) == 0)
-                       {
-                               target_t **last_target_p = &all_targets;
 
-                               /* register target specific commands */
-                               if (target_types[i]->register_commands(cmd_ctx) != ERROR_OK)
-                               {
-                                       LOG_ERROR("couldn't register '%s' commands", args[0]);
-                                       exit(-1);
-                               }
-
-                               if (*last_target_p)
-                               {
-                                       while ((*last_target_p)->next)
-                                               last_target_p = &((*last_target_p)->next);
-                                       last_target_p = &((*last_target_p)->next);
-                               }
-
-                               // get target number *before* adding new target to the list */
-                               int n = new_target_number();
-                               // calloc will init the memory to zero for us
-                               *last_target_p = calloc(1,sizeof(target_t));
-                               // save target number.
-                               (*last_target_p)->cmd_name = NULL;
-                               (*last_target_p)->target_number = n;
-
-                               /* allocate memory for each unique target type */
-                               (*last_target_p)->type = (target_type_t*)malloc(sizeof(target_type_t));
-                               *((*last_target_p)->type) = *target_types[i];
-
-                               if (strcmp(args[1], "big") == 0)
-                                       (*last_target_p)->endianness = TARGET_BIG_ENDIAN;
-                               else if (strcmp(args[1], "little") == 0)
-                                       (*last_target_p)->endianness = TARGET_LITTLE_ENDIAN;
-                               else
-                               {
-                                       LOG_ERROR("endianness must be either 'little' or 'big', not '%s'", args[1]);
-                                       return ERROR_COMMAND_SYNTAX_ERROR;
-                               }
-
-                               if (strcmp(args[2], "reset_halt") == 0)
-                               {
-                                       LOG_WARNING("reset_mode argument is obsolete.");
-                                       return ERROR_COMMAND_SYNTAX_ERROR;
-                               }
-                               else if (strcmp(args[2], "reset_run") == 0)
-                               {
-                                       LOG_WARNING("reset_mode argument is obsolete.");
-                                       return ERROR_COMMAND_SYNTAX_ERROR;
-                               }
-                               else if (strcmp(args[2], "reset_init") == 0)
-                               {
-                                       LOG_WARNING("reset_mode argument is obsolete.");
-                                       return ERROR_COMMAND_SYNTAX_ERROR;
-                               }
-                               else if (strcmp(args[2], "run_and_halt") == 0)
-                               {
-                                       LOG_WARNING("reset_mode argument is obsolete.");
-                                       return ERROR_COMMAND_SYNTAX_ERROR;
-                               }
-                               else if (strcmp(args[2], "run_and_init") == 0)
-                               {
-                                       LOG_WARNING("reset_mode argument is obsolete.");
-                                       return ERROR_COMMAND_SYNTAX_ERROR;
-                               }
-                               else
-                               {
-                                       /* Kludge! we want to make this reset arg optional while remaining compatible! */
-                                       args--;
-                                       argc++;
-                               }
-
-                               (*last_target_p)->working_area = 0x0;
-                               (*last_target_p)->working_area_size = 0x0;
-                               (*last_target_p)->working_areas = NULL;
-                               (*last_target_p)->backup_working_area = 0;
-
-                               (*last_target_p)->state = TARGET_UNKNOWN;
-                               (*last_target_p)->debug_reason = DBG_REASON_UNDEFINED;
-                               (*last_target_p)->reg_cache = NULL;
-                               (*last_target_p)->breakpoints = NULL;
-                               (*last_target_p)->watchpoints = NULL;
-                               (*last_target_p)->next = NULL;
-                               (*last_target_p)->arch_info = NULL;
-
-                               /* initialize trace information */
-                               (*last_target_p)->trace_info = malloc(sizeof(trace_t));
-                               (*last_target_p)->trace_info->num_trace_points = 0;
-                               (*last_target_p)->trace_info->trace_points_size = 0;
-                               (*last_target_p)->trace_info->trace_points = NULL;
-                               (*last_target_p)->trace_info->trace_history_size = 0;
-                               (*last_target_p)->trace_info->trace_history = NULL;
-                               (*last_target_p)->trace_info->trace_history_pos = 0;
-                               (*last_target_p)->trace_info->trace_history_overflowed = 0;
-
-                               (*last_target_p)->dbgmsg = NULL;
-                               (*last_target_p)->dbg_msg_enabled = 0;
-
-                               (*last_target_p)->type->target_command(cmd_ctx, cmd, args, argc, *last_target_p);
-
-                               found = 1;
-                               break;
-                       }
-               }
-       }
-
-       /* no matching target found */
-       if (!found)
-       {
-               LOG_ERROR("target '%s' not found", args[0]);
-               return ERROR_COMMAND_SYNTAX_ERROR;
-       }
-
-       return ERROR_OK;
-}
-
-int target_invoke_script(struct command_context_s *cmd_ctx, target_t *target, char *name)
-{
-       return command_run_linef(cmd_ctx, " if {[catch {info body target_%d_%s} t]==0} {target_%d_%s}",
-                       get_num_by_target(target), name,
-                       get_num_by_target(target), name);
-}
 
 int handle_working_area_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
@@ -1794,20 +1733,16 @@ int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd,
 
 int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc)
 {
+       const Jim_Nvp *n;
        enum target_reset_mode reset_mode = RESET_RUN;
 
        if (argc >= 1)
        {
-               if (strcmp("run", args[0]) == 0)
-                       reset_mode = RESET_RUN;
-               else if (strcmp("halt", args[0]) == 0)
-                       reset_mode = RESET_HALT;
-               else if (strcmp("init", args[0]) == 0)
-                       reset_mode = RESET_INIT;
-               else
-               {
+               n = Jim_Nvp_name2value_simple( nvp_reset_modes, args[0] );
+               if( (n->name == NULL) || (n->value == RESET_UNKNOWN) ){
                        return ERROR_COMMAND_SYNTAX_ERROR;
                }
+               reset_mode = n->value;
        }
 
        /* reset *all* targets */
@@ -1819,7 +1754,7 @@ int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **a
        int retval;
        target_t *target = get_current_target(cmd_ctx);
 
-       target_invoke_script(cmd_ctx, target, "pre_resume");
+       target_handle_event( target, TARGET_EVENT_OLD_pre_resume );
 
        if (argc == 0)
                retval = target_resume(target, 1, 0, 1, 0); /* current pc, addr = 0, handle breakpoints, not debugging */
@@ -1827,7 +1762,7 @@ int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **a
                retval = target_resume(target, 0, strtoul(args[0], NULL, 0), 1, 0); /* addr = args[0], handle breakpoints, not debugging */
        else
        {
-               return ERROR_COMMAND_SYNTAX_ERROR;
+               retval = ERROR_COMMAND_SYNTAX_ERROR;
        }
 
        return retval;
@@ -3014,6 +2949,1091 @@ static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_
        return JIM_OK;
 }
 
+void
+target_all_handle_event( enum target_event e )
+{
+       target_t *target;
+
+
+       LOG_DEBUG( "**all*targets: event: %d, %s", 
+                  e,
+                  Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
+
+       target = all_targets;
+       while (target){
+               target_handle_event( target, e );
+               target = target->next;
+       }
+}
+
+void
+target_handle_event( target_t *target, enum target_event e )
+{
+       target_event_action_t *teap;
+       int done;
+
+       teap = target->event_action;
+
+       done = 0;
+       while( teap ){
+               if( teap->event == e ){
+                       done = 1;
+                       LOG_DEBUG( "target: (%d) %s (%s) event: %d (%s) action: %s\n",
+                                          target->target_number,
+                                          target->cmd_name,
+                                          target->type->name,
+                                          e,
+                                          Jim_Nvp_value2name_simple( nvp_target_event, e )->name,
+                                          Jim_GetString( teap->body, NULL ) );
+                       Jim_EvalObj( interp, teap->body );
+               }
+               teap = teap->next;
+       }
+       if( !done ){
+               LOG_DEBUG( "event: %d %s - no action", 
+                                  e,
+                                  Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
+       }
+}
+
+enum target_cfg_param {
+       TCFG_TYPE,
+       TCFG_EVENT, 
+       TCFG_RESET,
+       TCFG_WORK_AREA_VIRT,
+       TCFG_WORK_AREA_PHYS,
+       TCFG_WORK_AREA_SIZE,
+       TCFG_WORK_AREA_BACKUP,
+       TCFG_ENDIAN,
+       TCFG_VARIANT,
+       TCFG_CHAIN_POSITION,
+};
+
+
+static Jim_Nvp nvp_config_opts[] = {
+       { .name = "-type",             .value = TCFG_TYPE },
+       { .name = "-event",            .value = TCFG_EVENT },
+       { .name = "-reset",            .value = TCFG_RESET },
+       { .name = "-work-area-virt",   .value = TCFG_WORK_AREA_VIRT },
+       { .name = "-work-area-phys",   .value = TCFG_WORK_AREA_PHYS },
+       { .name = "-work-area-size",   .value = TCFG_WORK_AREA_SIZE },
+       { .name = "-work-area-backup", .value = TCFG_WORK_AREA_BACKUP },
+       { .name = "-endian" ,          .value = TCFG_ENDIAN },
+       { .name = "-variant",          .value = TCFG_VARIANT },
+       { .name = "-chain-position",   .value = TCFG_CHAIN_POSITION },
+       
+       { .name = NULL, .value = -1 }
+};
+         
+
+static int
+target_configure( Jim_GetOptInfo *goi,
+                                 target_t *target )
+{
+       Jim_Nvp *n;
+       Jim_Obj *o;
+       jim_wide w;
+       char *cp;
+       int e;
+
+
+       /* parse config or cget options ... */
+       while( goi->argc ){
+               Jim_SetEmptyResult( goi->interp );
+               //Jim_GetOpt_Debug( goi );
+
+               if( target->type->target_jim_configure ){
+                       /* target defines a configure function */
+                       /* target gets first dibs on parameters */
+                       e = (*(target->type->target_jim_configure))( target, goi );
+                       if( e == JIM_OK ){
+                               /* more? */
+                               continue;
+                       }
+                       if( e == JIM_ERR ){
+                               /* An error */
+                               return e;
+                       }
+                       /* otherwise we 'continue' below */
+               }
+               e = Jim_GetOpt_Nvp( goi, nvp_config_opts, &n );
+               if( e != JIM_OK ){
+                       Jim_GetOpt_NvpUnknown( goi, nvp_config_opts, 0 );
+                       return e;
+               }
+               switch( n->value ){
+               case TCFG_TYPE:
+                       /* not setable */
+                       if( goi->isconfigure ){
+                               Jim_SetResult_sprintf( goi->interp, "not setable: %s", n->name );
+                               return JIM_ERR;
+                       } else {
+                       no_params:
+                               if( goi->argc != 0 ){
+                                       Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "NO PARAMS");
+                                       return JIM_ERR;
+                               }
+                       }
+                       Jim_SetResultString( goi->interp, target->type->name, -1 );
+                       /* loop for more */
+                       break;
+               case TCFG_EVENT:
+                       if( goi->argc == 0 ){
+                               Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ...");
+                               return JIM_ERR;
+                       }
+
+                       e = Jim_GetOpt_Nvp( goi, nvp_target_event, &n );
+                       if( e != JIM_OK ){
+                               Jim_GetOpt_NvpUnknown( goi, nvp_target_event, 1 );
+                               return e;
+                       }
+
+                       if( goi->isconfigure ){
+                               if( goi->argc == 0 ){
+                                       Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
+                                       return JIM_ERR;
+                               }  
+                       } else {
+                               if( goi->argc != 0 ){
+                                       Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
+                                       return JIM_ERR;
+                               }
+                       }
+
+       
+                       { 
+                               target_event_action_t *teap;
+                               
+                               teap = target->event_action;
+                               /* replace existing? */
+                               while( teap ){
+                                       if( teap->event == n->value ){
+                                               break;
+                                       }
+                                       teap = teap->next;
+                               }
+                               
+                               if( goi->isconfigure ){
+                                       if( teap == NULL ){
+                                               /* create new */
+                                               teap = calloc( 1, sizeof(*teap) );
+                                       }
+                                       teap->event = n->value;
+                                       Jim_GetOpt_Obj( goi, &o );
+                                       if( teap->body ){
+                                               Jim_DecrRefCount( interp, teap->body );
+                                       }
+                                       teap->body  = Jim_DuplicateObj( goi->interp, o );
+                                       /*
+                                        * FIXME: 
+                                        *     Tcl/TK - "tk events" have a nice feature.
+                                        *     See the "BIND" command.
+                                        *    We should support that here.
+                                        *     You can specify %X and %Y in the event code.
+                                        *     The idea is: %T - target name.
+                                        *     The idea is: %N - target number
+                                        *     The idea is: %E - event name.
+                                        */
+                                       Jim_IncrRefCount( teap->body );
+
+                                       /* add to head of event list */
+                                       teap->next = target->event_action;
+                                       target->event_action = teap;
+                                       Jim_SetEmptyResult(goi->interp);
+                               } else {
+                                       /* get */
+                                       if( teap == NULL ){
+                                               Jim_SetEmptyResult( goi->interp );
+                                       } else {
+                                               Jim_SetResult( goi->interp, Jim_DuplicateObj( goi->interp, teap->body ) );
+                                       }
+                               }
+                       }
+                       /* loop for more */
+                       break;
+
+               case TCFG_RESET:
+                       if( goi->isconfigure ){
+                               e = Jim_GetOpt_Nvp( goi, nvp_reset_modes, &n );
+                               if( e != JIM_OK ){
+                                       Jim_GetOpt_NvpUnknown( goi, nvp_reset_modes, 1 );
+                                       return e;
+                               }
+                               if( n->value == RESET_UNKNOWN ){
+                                       Jim_SetResultString( interp, "'unknown' is not a valid selection",-1);
+                                       return JIM_ERR;
+                               }
+                               target->reset_mode = n->value;
+                       } else {
+                               if( goi->argc != 0 ){
+                                       goto no_params;
+                               }
+                       }
+                       n = Jim_Nvp_value2name_simple( nvp_reset_modes, target->reset_mode );
+                       if( n->name == NULL ){
+                               target->reset_mode = RESET_HALT;
+                               n = Jim_Nvp_value2name_simple( nvp_reset_modes, target->reset_mode );
+                       }
+                       Jim_SetResultString( goi->interp, n->name, -1 );
+                       /* loop for more */
+                       break;
+                       
+               case TCFG_WORK_AREA_VIRT:
+                       if( goi->isconfigure ){
+                               target_free_all_working_areas(target);
+                               e = Jim_GetOpt_Wide( goi, &w );
+                               if( e != JIM_OK ){
+                                       return e;
+                               }
+                               target->working_area_virt = w;
+                       } else {
+                               if( goi->argc != 0 ){
+                                       goto no_params;
+                               }
+                       } 
+                       Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_virt ) );
+                       /* loop for more */
+                       break;
+                               
+               case TCFG_WORK_AREA_PHYS:
+                       if( goi->isconfigure ){
+                               target_free_all_working_areas(target);
+                               e = Jim_GetOpt_Wide( goi, &w );
+                               if( e != JIM_OK ){
+                                       return e;
+                               }
+                               target->working_area_phys = w;
+                       } else {
+                               if( goi->argc != 0 ){
+                                       goto no_params;
+                               }
+                       } 
+                       Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_phys ) );
+                       /* loop for more */
+                       break;
+
+               case TCFG_WORK_AREA_SIZE:
+                       if( goi->isconfigure ){
+                               target_free_all_working_areas(target);
+                               e = Jim_GetOpt_Wide( goi, &w );
+                               if( e != JIM_OK ){
+                                       return e;
+                               }
+                               target->working_area_size = w;
+                       } else {
+                               if( goi->argc != 0 ){
+                                       goto no_params;
+                               }
+                       } 
+                       Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
+                       /* loop for more */
+                       break;
+
+               case TCFG_WORK_AREA_BACKUP:
+                       if( goi->isconfigure ){
+                               target_free_all_working_areas(target);
+                               e = Jim_GetOpt_Wide( goi, &w );
+                               if( e != JIM_OK ){
+                                       return e;
+                               }
+                               /* make this exactly 1 or 0 */
+                               target->backup_working_area = (!!w);
+                       } else {
+                               if( goi->argc != 0 ){
+                                       goto no_params;
+                               }
+                       } 
+                       Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
+                       /* loop for more e*/
+                       break;
+
+               case TCFG_ENDIAN:
+                       if( goi->isconfigure ){
+                               e = Jim_GetOpt_Nvp( goi, nvp_target_endian, &n );
+                               if( e != JIM_OK ){
+                                       Jim_GetOpt_NvpUnknown( goi, nvp_target_endian, 1 );
+                                       return e;
+                               }
+                               target->endianness = n->value;
+                       } else {
+                               if( goi->argc != 0 ){
+                                       goto no_params;
+                               }
+                       }
+                       n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
+                       if( n->name == NULL ){
+                               target->endianness = TARGET_LITTLE_ENDIAN;
+                               n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
+                       } 
+                       Jim_SetResultString( goi->interp, n->name, -1 );
+                       /* loop for more */
+                       break;
+
+               case TCFG_VARIANT:
+                       if( goi->isconfigure ){
+                               if( goi->argc < 1 ){
+                                       Jim_SetResult_sprintf( goi->interp,
+                                                                                  "%s ?STRING?",
+                                                                                  n->name );
+                                       return JIM_ERR;
+                               }
+                               if( target->variant ){
+                                       free((void *)(target->variant));
+                               }
+                               e = Jim_GetOpt_String( goi, &cp, NULL );
+                               target->variant = strdup(cp);
+                       } else {
+                               if( goi->argc != 0 ){
+                                       goto no_params;
+                               }
+                       } 
+                       Jim_SetResultString( goi->interp, target->variant,-1 );
+                       /* loop for more */
+                       break;
+               case TCFG_CHAIN_POSITION:
+                       if( goi->isconfigure ){
+                               target_free_all_working_areas(target);
+                               e = Jim_GetOpt_Wide( goi, &w );
+                               if( e != JIM_OK ){
+                                       return e;
+                               }
+                               /* make this exactly 1 or 0 */
+                               target->chain_position = w;
+                       } else {
+                               if( goi->argc != 0 ){
+                                       goto no_params;
+                               }
+                       } 
+                       Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->chain_position ) );
+                       /* loop for more e*/
+                       break;
+               }
+       }
+       /* done - we return */
+       return JIM_OK;
+}
+
+
+/** this is the 'tcl' handler for the target specific command */
+static int
+tcl_target_func( Jim_Interp *interp,
+                                int argc, 
+                                Jim_Obj *const *argv )
+{
+       Jim_GetOptInfo goi;
+       jim_wide a,b,c;
+       int x,y,z;
+       u8  target_buf[32];
+       Jim_Nvp *n;
+       target_t *target;
+       struct command_context_s *cmd_ctx;
+       int e;
+
+
+       enum {
+               TS_CMD_CONFIGURE,
+               TS_CMD_CGET,
+               
+               TS_CMD_MWW, TS_CMD_MWH, TS_CMD_MWB,
+               TS_CMD_MDW, TS_CMD_MDH, TS_CMD_MDB,
+               TS_CMD_MRW, TS_CMD_MRH, TS_CMD_MRB,
+               TS_CMD_MEM2ARRAY, TS_CMD_ARRAY2MEM,
+               TS_CMD_EXAMINE, 
+               TS_CMD_POLL,
+               TS_CMD_RESET,
+               TS_CMD_HALT,
+               TS_CMD_WAITSTATE,
+               TS_CMD_EVENTLIST,
+               TS_CMD_CURSTATE,
+       };
+       
+       static const Jim_Nvp target_options[] = {
+               { .name = "configure", .value = TS_CMD_CONFIGURE },
+               { .name = "cget", .value = TS_CMD_CGET },
+               { .name = "mww", .value = TS_CMD_MWW },
+               { .name = "mwh", .value = TS_CMD_MWH },
+               { .name = "mwb", .value = TS_CMD_MWB },
+               { .name = "mdw", .value = TS_CMD_MDW },
+               { .name = "mdh", .value = TS_CMD_MDH },
+               { .name = "mdb", .value = TS_CMD_MDB },
+               { .name = "mem2array", .value = TS_CMD_MEM2ARRAY },
+               { .name = "array2mem", .value = TS_CMD_ARRAY2MEM },
+               { .name = "eventlist", .value = TS_CMD_EVENTLIST },
+               { .name = "curstate",  .value = TS_CMD_CURSTATE },
+
+               { .name = "arp_examine", .value = TS_CMD_EXAMINE },
+               { .name = "arp_poll", .value = TS_CMD_POLL },
+               { .name = "arp_reset", .value = TS_CMD_RESET },
+               { .name = "arp_halt", .value = TS_CMD_HALT },
+               { .name = "arp_waitstate", .value = TS_CMD_WAITSTATE },
+
+               { .name = NULL, .value = -1 },
+       };
+
+
+       /* go past the "command" */
+       Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
+
+       target = Jim_CmdPrivData( goi.interp );
+       cmd_ctx = Jim_GetAssocData(goi.interp, "context");
+
+       /* commands here are in an NVP table */
+       e = Jim_GetOpt_Nvp( &goi, target_options, &n );
+       if( e != JIM_OK ){
+               Jim_GetOpt_NvpUnknown( &goi, target_options, 0 );
+               return e;
+       }
+       // Assume blank result
+       Jim_SetEmptyResult( goi.interp );
+
+       switch( n->value ){
+       case TS_CMD_CONFIGURE:
+               if( goi.argc < 2 ){
+                       Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "missing: -option VALUE ...");
+                       return JIM_ERR;
+               }
+               goi.isconfigure = 1;
+               return target_configure( &goi, target );
+       case TS_CMD_CGET:
+               // some things take params
+               if( goi.argc < 1 ){
+                       Jim_WrongNumArgs( goi.interp, 0, goi.argv, "missing: ?-option?");
+                       return JIM_ERR;
+               }
+               goi.isconfigure = 0;
+               return target_configure( &goi, target );
+               break;
+       case TS_CMD_MWW:
+       case TS_CMD_MWH:
+       case TS_CMD_MWB:
+               /* argv[0] = cmd
+                * argv[1] = address
+                * argv[2] = data
+                * argv[3] = optional count.
+                */
+                 
+               if( (goi.argc == 3) || (goi.argc == 4) ){
+                       /* all is well */
+               } else {
+               mwx_error:
+                       Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR DATA [COUNT]", n->name );
+                       return JIM_ERR;
+               }
+               
+               e = Jim_GetOpt_Wide( &goi, &a );
+               if( e != JIM_OK ){
+                       goto mwx_error;
+               }
+
+               e = Jim_GetOpt_Wide( &goi, &b );
+               if( e != JIM_OK ){
+                       goto mwx_error;
+               }
+               if( goi.argc ){
+                       e = Jim_GetOpt_Wide( &goi, &c );
+                       if( e != JIM_OK ){
+                               goto mwx_error;
+                       }
+               } else {
+                       c = 1;
+               }
+                       
+               switch( n->value ){
+               case TS_CMD_MWW:
+                       target_buffer_set_u32( target, target_buf, b );
+                       b = 4;
+                       break;
+               case TS_CMD_MWH:
+                       target_buffer_set_u16( target, target_buf, b );
+                       b = 2;
+                       break;
+               case TS_CMD_MWB:
+                       target_buffer_set_u8( target, target_buf, b );
+                       b = 1;
+                       break;
+               }
+               for( x = 0 ; x < c ; x++ ){
+                       e = target->type->write_memory( target, a, b, 1, target_buf );
+                       if( e != ERROR_OK ){
+                               Jim_SetResult_sprintf( interp, "Error writing @ 0x%08x: %d\n", (int)(a), e );
+                               return JIM_ERR;
+                       }
+                       /* b = width */
+                       a = a + b;
+               }
+               return JIM_OK;
+               break;
+
+               /* display */
+       case TS_CMD_MDW:
+       case TS_CMD_MDH:
+       case TS_CMD_MDB:
+               /* argv[0] = command
+                * argv[1] = address
+                * argv[2] = optional count
+                */
+               if( (goi.argc == 2) || (goi.argc == 3) ){
+                       Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR [COUNT]", n->name );
+                       return JIM_ERR;
+               }
+               e = Jim_GetOpt_Wide( &goi, &a );
+               if( e != JIM_OK ){
+                       return JIM_ERR;
+               }
+               if( goi.argc ){
+                       e = Jim_GetOpt_Wide( &goi, &c );
+                       if( e != JIM_OK ){
+                               return JIM_ERR;
+                       }
+               } else {
+                       c = 1;
+               }
+               b = 1; /* shut up gcc */
+               switch( n->value ){
+               case TS_CMD_MDW:
+                       b =  4;
+                       break;
+               case TS_CMD_MDH:
+                       b = 2;
+                       break;
+               case TS_CMD_MDB:
+                       b = 1;
+                       break;
+               }
+
+               /* convert to "bytes" */
+               c = c * b;
+               /* count is now in 'BYTES' */
+               while( c > 0 ){
+                       y = c;
+                       if( y > 16 ){
+                               y = 16;
+                       }
+                       e = target->type->read_memory( target, a, b, y / b, target_buf );
+                       if( e != ERROR_OK ){
+                               Jim_SetResult_sprintf( interp, "error reading target @ 0x%08lx", (int)(a) );
+                               return JIM_ERR;
+                       }
+                       
+                       Jim_fprintf( interp, interp->cookie_stdout, "0x%08x ", (int)(a) );
+                       switch( b ){
+                       case 4:
+                               for( x = 0 ; (x < 16) && (x < y) ; x += 4 ){
+                                       z = target_buffer_get_u32( target, &(target_buf[ x * 4 ]) );
+                                       Jim_fprintf( interp, interp->cookie_stdout, "%08x ", (int)(z) );
+                               }
+                               for( ; (x < 16) ; x += 4 ){
+                                       Jim_fprintf( interp, interp->cookie_stdout, "         " );
+                               }
+                               break;
+                       case 2:
+                               for( x = 0 ; (x < 16) && (x < y) ; x += 2 ){
+                                       z = target_buffer_get_u16( target, &(target_buf[ x * 2 ]) );
+                                       Jim_fprintf( interp, interp->cookie_stdout, "%04x ", (int)(z) );
+                               }
+                               for( ; (x < 16) ; x += 2 ){
+                                       Jim_fprintf( interp, interp->cookie_stdout, "     " );
+                               }
+                               break;
+                       case 1:
+                       default:
+                               for( x = 0 ; (x < 16) && (x < y) ; x += 1 ){
+                                       z = target_buffer_get_u8( target, &(target_buf[ x * 4 ]) );
+                                       Jim_fprintf( interp, interp->cookie_stdout, "%02x ", (int)(z) );
+                               }
+                               for( ; (x < 16) ; x += 1 ){
+                                       Jim_fprintf( interp, interp->cookie_stdout, "   " );
+                               }
+                               break;
+                       }
+                       /* ascii-ify the bytes */
+                       for( x = 0 ; x < y ; x++ ){
+                               if( (target_buf[x] >= 0x20) && 
+                                       (target_buf[x] <= 0x7e) ){
+                                       /* good */
+                               } else {
+                                       /* smack it */
+                                       target_buf[x] = '.';
+                               }
+                       }
+                       /* space pad  */
+                       while( x < 16 ){
+                               target_buf[x] = ' ';
+                               x++;
+                       }
+                       /* terminate */
+                       target_buf[16] = 0;
+                       /* print - with a newline */
+                       Jim_fprintf( interp, interp->cookie_stdout, "%s\n", target_buf );
+                       /* NEXT... */
+                       c -= 16;
+                       a += 16;
+               }
+               return JIM_OK;
+       case TS_CMD_MEM2ARRAY:
+               return target_mem2array( goi.interp, target, goi.argc, goi.argv );
+               break;
+       case TS_CMD_ARRAY2MEM:
+               return target_array2mem( goi.interp, target, goi.argc, goi.argv );
+               break;
+       case TS_CMD_EXAMINE:
+               if( goi.argc ){
+                       Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
+                       return JIM_ERR;
+               }
+               e = target->type->examine( target );
+               if( e != ERROR_OK ){
+                       Jim_SetResult_sprintf( interp, "examine-fails: %d", e );
+                       return JIM_ERR;
+               }
+               return JIM_OK;
+       case TS_CMD_POLL:
+               if( goi.argc ){
+                       Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
+                       return JIM_ERR;
+               }
+               if( !(target->type->examined) ){
+                       e = ERROR_TARGET_NOT_EXAMINED;
+               } else {
+                       e = target->type->poll( target );
+               }
+               if( e != ERROR_OK ){
+                       Jim_SetResult_sprintf( interp, "poll-fails: %d", e );
+                       return JIM_ERR;
+               } else {
+                       return JIM_OK;
+               }
+               break;
+       case TS_CMD_RESET:
+               if( goi.argc != 1 ){
+                       Jim_WrongNumArgs( interp, 1, argv, "reset t|f|assert|deassert");
+                       return JIM_ERR;
+               }
+               e = Jim_GetOpt_Nvp( &goi, nvp_assert, &n );
+               if( e != JIM_OK ){
+                       Jim_GetOpt_NvpUnknown( &goi, nvp_assert, 1 );
+                       return e;
+               }
+               // When this happens - all workareas are invalid.
+               target_free_all_working_areas_restore(target, 0);
+
+               // do the assert
+               if( n->value == NVP_ASSERT ){
+                       target->type->assert_reset( target );
+               } else {
+                       target->type->deassert_reset( target );
+               }
+               return JIM_OK;
+       case TS_CMD_HALT:
+               if( goi.argc ){
+                       Jim_WrongNumArgs( goi.interp, 0, argv, "halt [no parameters]");
+                       return JIM_ERR;
+               }
+               target->type->halt( target );
+               return JIM_OK;
+       case TS_CMD_WAITSTATE:
+               // params:  <name>  statename timeoutmsecs 
+               if( goi.argc != 2 ){
+                       Jim_SetResult_sprintf( goi.interp, "%s STATENAME TIMEOUTMSECS", n->name );
+                       return JIM_ERR;
+               }
+               e = Jim_GetOpt_Nvp( &goi, nvp_target_state, &n );
+               if( e != JIM_OK ){
+                       Jim_GetOpt_NvpUnknown( &goi, nvp_target_state,1 );
+                       return e;
+               }
+               e = Jim_GetOpt_Wide( &goi, &a );
+               if( e != JIM_OK ){
+                       return e;
+               }
+               e = target_wait_state( target, n->value, a );
+               if( e == ERROR_OK ){
+                       Jim_SetResult_sprintf( goi.interp,
+                                                                  "target: %s wait %s fails %d", 
+                                                                  target->cmd_name,
+                                                                  n->name,
+                                                                  target_strerror_safe(e) );
+                       return JIM_ERR;
+               } else {
+                       return JIM_OK;
+               }
+       case TS_CMD_EVENTLIST:
+               /* List for human, Events defined for this target.
+                * scripts/programs should use 'name cget -event NAME'
+                */
+               {
+                       target_event_action_t *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, "%-25s | Body", "Event");
+                       command_print( cmd_ctx, "------------------------- | ----------------------------------------");
+                       while( teap ){
+                               command_print( cmd_ctx, 
+                                                          "%-25s | %s",
+                                                          Jim_Nvp_value2name_simple( nvp_target_event, teap->event )->name,
+                                                          Jim_GetString( teap->body, NULL ) );
+                               teap = teap->next;
+                       }
+                       command_print( cmd_ctx, "***END***");
+                       return JIM_OK;
+               }
+       case TS_CMD_CURSTATE:
+               if( goi.argc != 0 ){
+                       Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
+                       return JIM_ERR;
+               }
+               Jim_SetResultString( goi.interp, 
+                                                        Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name,-1);
+               return JIM_OK;
+       }
+       return JIM_ERR;
+}
+
+
+static int
+target_create( Jim_GetOptInfo *goi )
+{      
+       
+       Jim_Obj *new_cmd;
+       Jim_Cmd *cmd;
+       const char *cp;
+       char *cp2;
+       int e;
+       int x;
+       target_t *target;
+       struct command_context_s *cmd_ctx;
+
+       cmd_ctx = Jim_GetAssocData(goi->interp, "context");
+       if( goi->argc < 3 ){
+               Jim_WrongNumArgs( goi->interp, 1, goi->argv, "?name? ?type? ..options...");
+               return JIM_ERR;
+       }
+
+       /* COMMAND */
+       Jim_GetOpt_Obj( goi, &new_cmd );
+       /* does this command exist? */
+       cmd = Jim_GetCommand( goi->interp, new_cmd, JIM_ERRMSG );
+       if( cmd ){
+               cp = Jim_GetString( new_cmd, NULL );
+               Jim_SetResult_sprintf(goi->interp, "Command/target: %s Exists", cp);
+               return JIM_ERR;
+       }
+       
+       /* TYPE */
+       e = Jim_GetOpt_String( goi, &cp2, NULL );
+       cp = cp2;
+       /* now does target type exist */
+       for( x = 0 ; target_types[x] ; x++ ){
+               if( 0 == strcmp( cp, target_types[x]->name ) ){
+                       /* found */
+                       break;
+               }
+       }
+       if( target_types[x] == NULL ){
+               Jim_SetResult_sprintf( goi->interp, "Unknown target type %s, try one of ", cp );
+               for( x = 0 ; target_types[x] ; x++ ){
+                       if( target_types[x+1] ){
+                               Jim_AppendStrings( goi->interp, 
+                                                                  Jim_GetResult(goi->interp),
+                                                                  target_types[x]->name,
+                                                                  ", ", NULL);
+                       } else {
+                               Jim_AppendStrings( goi->interp, 
+                                                                  Jim_GetResult(goi->interp),
+                                                                  " or ",
+                                                                  target_types[x]->name,NULL );
+                       }
+               }
+               return JIM_ERR;
+       }
+
+               
+       /* Create it */
+       target = calloc(1,sizeof(target_t));
+       /* set target number */
+       target->target_number = new_target_number();
+
+       /* allocate memory for each unique target type */
+       target->type = (target_type_t*)calloc(1,sizeof(target_type_t));
+
+       memcpy( target->type, target_types[x], sizeof(target_type_t));
+       
+       /* will be set by "-endian" */
+       target->endianness = TARGET_ENDIAN_UNKNOWN;
+
+       target->working_area        = 0x0;
+       target->working_area_size   = 0x0;
+       target->working_areas       = NULL;
+       target->backup_working_area = 0;
+       
+       target->state               = TARGET_UNKNOWN;
+       target->debug_reason        = DBG_REASON_UNDEFINED;
+       target->reg_cache           = NULL;
+       target->breakpoints         = NULL;
+       target->watchpoints         = NULL;
+       target->next                = NULL;
+       target->arch_info           = NULL;
+       
+       /* initialize trace information */
+       target->trace_info = malloc(sizeof(trace_t));
+       target->trace_info->num_trace_points         = 0;
+       target->trace_info->trace_points_size        = 0;
+       target->trace_info->trace_points             = NULL;
+       target->trace_info->trace_history_size       = 0;
+       target->trace_info->trace_history            = NULL;
+       target->trace_info->trace_history_pos        = 0;
+       target->trace_info->trace_history_overflowed = 0;
+       
+       target->dbgmsg          = NULL;
+       target->dbg_msg_enabled = 0;
+
+       target->endianness = TARGET_ENDIAN_UNKNOWN;
+
+       /* Do the rest as "configure" options */
+       goi->isconfigure = 1;
+       e = target_configure( goi, target);
+       if( e != JIM_OK ){
+               free( target->type );
+               free( target );
+               return e;
+       }
+
+       if( target->endianness == TARGET_ENDIAN_UNKNOWN ){
+               /* default endian to little if not specified */
+               target->endianness = TARGET_LITTLE_ENDIAN;
+       }
+
+       /* create the target specific commands */
+       if( target->type->register_commands ){
+               (*(target->type->register_commands))( cmd_ctx );
+       }
+       if( target->type->target_create ){
+               (*(target->type->target_create))( target, goi->interp );
+       }
+
+       /* append to end of list */
+       {
+               target_t **tpp;
+               tpp = &(all_targets);
+               while( *tpp ){
+                       tpp = &( (*tpp)->next );
+               }
+               *tpp = target;
+       }
+
+       cp = Jim_GetString( new_cmd, NULL );
+       target->cmd_name = strdup(cp);
+
+       /* 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 */
+
+       (*(target->type->target_create))( target, goi->interp );
+       return e;
+}
+
+static int
+jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
+{
+       int x,r,e;
+       jim_wide w;
+       struct command_context_s *cmd_ctx;
+       const char *cp;
+       target_t *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(Jim_Debug_ArgvString( interp, argc, argv) );
+
+       cmd_ctx = Jim_GetAssocData( interp, "context" );
+
+       Jim_GetOpt_Setup( &goi, interp, argc-1, argv+1 );
+
+       if( goi.argc == 0 ){
+               Jim_WrongNumArgs(interp, 1, argv, "missing: command ...");
+               return JIM_ERR;
+       }
+
+       /* is this old syntax? */
+       /* To determine: We have to peek at argv[0]*/
+       cp = Jim_GetString( goi.argv[0], NULL );
+       for( x = 0 ; target_types[x] ; x++ ){
+               if( 0 == strcmp(cp,target_types[x]->name) ){
+                       break;
+               }
+       }
+       if( target_types[x] ){
+               /* YES IT IS OLD SYNTAX */
+               Jim_Obj *new_argv[10];
+               int      new_argc;
+               
+               /* target_old_syntax 
+                * 
+                * argv[0] typename (above)
+                * argv[1] endian
+                * argv[2] reset method, deprecated/ignored
+                * argv[3] = old param
+                * argv[4] = old param
+                *
+                * We will combine all "old params" into a single param.
+                * Then later, split them again.
+                */
+               if( argc < 4 ){
+                       Jim_WrongNumArgs( interp, 1, argv, "[OLDSYNTAX] ?TYPE? ?ENDIAN? ?RESET? ?old-params?");
+                       return JIM_ERR;
+               }
+               /* the command */
+               new_argv[0] = argv[0];
+               new_argv[1] = Jim_NewStringObj( interp, "create", -1 );
+               {
+                       char buf[ 30 ];
+                       sprintf( buf, "target%d", new_target_number() );
+                       new_argv[2] = Jim_NewStringObj( interp, buf , -1 );
+               }
+               new_argv[3] = goi.argv[0]; /* typename */
+               new_argv[4] = Jim_NewStringObj( interp, "-endian", -1 );
+               new_argv[5] = goi.argv[1];
+               new_argv[6] = Jim_NewStringObj( interp, "-chain-position", -1 );
+               new_argv[7] = goi.argv[2];
+               new_argv[8] = Jim_NewStringObj( interp, "-variant", -1 );
+               new_argv[9] = goi.argv[3];
+               new_argc = 10;
+               /*
+                * new arg syntax:
+                *   argv[0] = command
+                *   argv[1] = create
+                *   argv[2] = cmdname
+                *   argv[3] = typename
+                *   argv[4] = **FIRST** "configure" option.
+                *
+                * Here, we make them:
+                *
+                *   argv[4] = -endian
+                *   argv[5] = little
+                *   argv[6] = -position
+                *   argv[7] = NUMBER
+                *   argv[8] = -variant
+                *   argv[9] = "somestring"
+                */
+               
+               /* don't let these be released */
+               for( x = 0 ; x < new_argc ; x++ ){
+                       Jim_IncrRefCount( new_argv[x]);
+               }
+               /* call our self */
+               LOG_DEBUG("Target OLD SYNTAX - converted to new syntax");
+               
+               r = jim_target( goi.interp, new_argc, new_argv );
+
+               /* release? these items */
+               for( x = 0 ; x < new_argc ; x++ ){
+                       Jim_DecrRefCount( interp, new_argv[x] );
+               }
+               return r;
+       }
+
+       //Jim_GetOpt_Debug( &goi );
+       r = Jim_GetOpt_Enum( &goi, target_cmds, &x   );
+       if( r != JIM_OK ){
+               return r;
+       }
+
+       switch(x){
+       default:
+               Jim_Panic(goi.interp,"Why am I here?");
+               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:
+               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;
+               }
+               {
+                       target_t *t;
+                       t = get_target_by_num(w);
+                       if( t == NULL ){
+                               Jim_SetResult_sprintf( goi.interp,"Target: number %d does not exist", (int)(w));
+                               return JIM_ERR;
+                       }
+                       Jim_SetResultString( goi.interp, t->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;
+               }
+               Jim_SetResult( goi.interp, 
+                                          Jim_NewIntObj( goi.interp, max_target_number()));
+               return JIM_OK;
+       }
+}
+
+
 
 /*
  * Local Variables: ***
index 968d7ab8afaeffd21c6a9eeb9b92ddac206960f0..c6f6beddc12f8bdced3842f14bbbbd7033e70014 100644 (file)
@@ -199,10 +199,11 @@ typedef struct target_type_s
        /* target algorithm support */
        int (*run_algorithm_imp)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
        int (*run_algorithm)(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_params, reg_param_t *reg_param, u32 entry_point, u32 exit_point, int timeout_ms, void *arch_info);
-       
-       int (*register_commands)(struct command_context_s *cmd_ctx);
+
+       int (*register_commands)(struct command_context_s *cmd_ctx);    
+
        /* called when target is created */
-       int (*target_jim_create)( struct target_s *target, Jim_Interp *interp );
+       int (*target_create)( struct target_s *target, Jim_Interp *interp );
 
        /* called for various config parameters */
        /* returns JIM_CONTINUE - if option not understood */
@@ -213,8 +214,6 @@ typedef struct target_type_s
        /* returns JIM_OK, or JIM_ERR, or JIM_CONTINUE - if option not understood */
        int (*target_jim_commands)( struct target_s *target, Jim_GetOptInfo *goi );
 
-       /* old init function */
-       int (*target_command)(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
        /* invoked after JTAG chain has been examined & validated. During
         * this stage the target is examined and any additional setup is
         * performed.
@@ -271,19 +270,40 @@ typedef struct target_s
 
 enum target_event
 {
+       // OLD historical names
+       //  - Prior to the great TCL change
+       //  - June/July/Aug 2008
+       //  - Duane Ellis
+       TARGET_EVENT_OLD_gdb_program_config,
+       TARGET_EVENT_OLD_pre_reset,
+       TARGET_EVENT_OLD_post_reset,
+       TARGET_EVENT_OLD_pre_resume,
+
        TARGET_EVENT_HALTED,            /* target entered debug state from normal execution or reset */
        TARGET_EVENT_RESUMED,           /* target resumed to normal execution */
        TARGET_EVENT_RESUME_START,
        TARGET_EVENT_RESUME_END,
 
        TARGET_EVENT_RESET_START,
-       TARGET_EVENT_RESET,                     /* target entered reset */
+       TARGET_EVENT_RESET_ASSERT_PRE,
+       TARGET_EVENT_RESET_ASSERT_POST,
+       TARGET_EVENT_RESET_DEASSERT_PRE,
+       TARGET_EVENT_RESET_DEASSERT_POST,
+       TARGET_EVENT_RESET_HALT_PRE,
+       TARGET_EVENT_RESET_HALT_POST,
+       TARGET_EVENT_RESET_WAIT_PRE,
+       TARGET_EVENT_RESET_WAIT_POST,
        TARGET_EVENT_RESET_INIT,
        TARGET_EVENT_RESET_END,
 
+
        TARGET_EVENT_DEBUG_HALTED,      /* target entered debug state, but was executing on behalf of the debugger */
        TARGET_EVENT_DEBUG_RESUMED, /* target resumed to execute on behalf of the debugger */
 
+       TARGET_EVENT_EXAMINE_START,
+       TARGET_EVENT_EXAMINE_END,
+       
+
        TARGET_EVENT_GDB_ATTACH,
        TARGET_EVENT_GDB_DETACH,
 
@@ -298,6 +318,7 @@ extern const Jim_Nvp nvp_target_event[];
 struct target_event_action_s {
        enum target_event event;
        Jim_Obj *body;
+       int      has_percent;
        target_event_action_t *next;
  };
 
@@ -392,7 +413,8 @@ int target_write_u8(struct target_s *target, u32 address, u8 value);
 /* Issues USER() statements with target state information */
 int target_arch_state(struct target_s *target);
 
-int target_invoke_script(struct command_context_s *cmd_ctx, target_t *target, char *name);
+void target_handle_event( target_t *t, enum target_event e);
+void target_all_handle_event( enum target_event e );
 
 
 #define ERROR_TARGET_INVALID   (-300)
@@ -407,6 +429,9 @@ int target_invoke_script(struct command_context_s *cmd_ctx, target_t *target, ch
 #define ERROR_TARGET_NOT_RUNNING (-310)
 #define ERROR_TARGET_NOT_EXAMINED (-311)
 
+extern const Jim_Nvp nvp_error_target[];
+extern const char *target_strerror_safe( int err );
+
 #endif /* TARGET_H */
 
 
index fdffbfea6d9185f1fd544b629474409748593013..3bc474f223b3b53564b29356ef6953d95ddeda3d 100644 (file)
@@ -34,5 +34,5 @@ proc watchdog_service {} {
     set watchdog_hdl [after 500 watchdog_service]
 }
 
-proc target_0_post_halt {} { watchdog_service }
-proc arget_0_pre_resume {} { global watchdog_hdl; after cancel $watchdog_hdl }
+[new_target_name] configure -event old-post_halt {  watchdog_service }
+[new_target_name] configure -event old-pre_resume { global watchdog_hdl; after cancel $watchdog_hdl }
index f3fa08fed1427cac4255ba3417124a19c0722352..b49150a78571aed533f09e1491c3b0b70da21b19 100644 (file)
@@ -32,7 +32,7 @@ working_area 0 0x00000000 0x20000 nobackup
 global reset_count
 set reset_count 0
 
-proc target_0_post_reset {} {
+[new_target_name] configure -event old-post_reset {
        puts "Running reset init script for AT91EB40A"
        global reset_count
        # Reset script for AT91EB40a
@@ -46,10 +46,9 @@ proc target_0_post_reset {} {
        set reset_count [expr $reset_count+1]
        echo "Testing reset $reset_count !"
        
-       asdfs
 }
 
-proc target_0_pre_reset {} {
+[new_target_name] configure -event old-pre_reset {
        global reset_count
        set reset_count [expr $reset_count+1]
        echo "Testing pre_reset $reset_count !"
index e62a744ceb9f1656968bc499885af60a613ba2d2..7c4be18ebfe630eb2c5be34ced5ce51089559c0a 100644 (file)
@@ -13,7 +13,7 @@ jtag_device 4 0x1 0xf 0xe
 target arm7tdmi little 0 arm7tdmi
 
 
-target_script 0 reset event/at91r40008_reset.script
+[new_target_name] configure -event old-gdb_program_config { script event/at91r40008_reset.script }
 
 working_area 0 0x3C000 0x4000 nobackup 
 flash bank cfi 0x10000000 0x400000 2 2 0
index 21f92d79524f3522b0e4c598189357f0f40dbbd5..f0f7929ecbe36fea98a024bc325680485d03c9a4 100644 (file)
@@ -17,7 +17,7 @@ jtag_ntrst_delay 0
 #target <type> <endianess> <reset mode> <JTAG pos> <variant>
 target arm926ejs little 0 arm926ejs
 
-target_script 0 reset event/at91sam9260_reset.script
+[new_target_name] configure -event old-post_reset { script event/at91sam9260_reset.script }
 
 
 #working area <target#> <address> <size> <backup|nobackup>
index c33b42984d3e71752b8c4566c239c0170cbe48f8..15f96858974c6a262b02d78a7e9664d220f4ea31 100644 (file)
@@ -8,7 +8,7 @@ jtag_device 4 0x1 0xf 0xe
 target arm7tdmi little 0 arm7tdmi
 
 
-target_script 0 reset event/eir-sam7se512_reset.script
+[new_target_name] configure -event old-post_reset { script event/eir-sam7se512_reset.script }
 
 working_area 0 0x00200000 0x4000 nobackup
 
index 9daef590cdcb1707623ac914ebc2d79b2cf0e5ba..6a4319f392c6929de72d2658777c0ef22a3dd2a1 100644 (file)
@@ -10,12 +10,12 @@ jtag_device 4 0x1 0xf 0xe
 
 
 target arm920t little 0 arm920t
+[new_target_name] configure -event old-post_reset { script event/hammer_reset.script }
 
 # speed up memory downloads
 arm7 fast_memory_access enable
 arm7_9 dcc_downloads enable
 
-target_script 0 reset event/hammer_reset.script
 
 working_area 0 0x30800000 0x20000 nobackup
 
index e76aa02437973bbecbc696bd6099d60ff94c270c..79ec9ecb1a983458cc6250821e3d090bb9f32fd8 100644 (file)
@@ -14,8 +14,7 @@ reset_config trst_and_srst srst_pulls_trst
 jtag_device 4 0x1 0xf 0xe
 
 target arm7tdmi little 0 arm7tdmi-s_r4
-
-proc target_0_post_reset {} {
+[new_target_name] configure -event old-post_reset {} {
        # Force target into ARM state
        soft_reset_halt
        #do not remap 0x0000-0x0020 to anything but the flash
index 3a8f4154b4a2e36458a625ac1717c48091447e2b..a00e9bf1f4b293ae6fda1acca1eb5725af2b4d93 100644 (file)
@@ -11,8 +11,7 @@ jtag_device 4  0x1 0x0 0xe
 jtag_device 8  0x0 0x0 0x0
 
 target arm926ejs little 1 arm926ejs
-target_script 0 reset event/omap5912_reset.script
-
+[new_target_name] configure -event old-post_reset { script event/omap5912_reset.script }
 
 # omap5912 lcd frame buffer as working area
 working_area 0 0x20000000 0x3e800 nobackup
index b712cf37131bb475f7d996e94183897fc7f98da3..daa493459a65c6259b494c4034e36e173a2bc56f 100644 (file)
@@ -1,11 +1,13 @@
 jtag_device 5 0x1 0x1f 0x1e
 jtag_nsrst_delay 200
 jtag_ntrst_delay 200
+
 target xscale little 0 pxa255
+[new_target_name] configure -event old-post_reset { script event/pxa255_reset.script }
+
 reset_config trst_and_srst
 
 
-target_script 0 reset event/pxa255_reset.script
 
 #xscale debug_handler 0  0xFFFF0800      # debug handler base address
 
index 663ac110c34f587b384640134beee25a7972a7b3..34556f87c0aad6606e519f9199226763dfbe82d3 100644 (file)
@@ -8,9 +8,7 @@ jtag_device 4 0x1 0xf 0xe
 #target <type> <startup mode>
 #target arm7tdmi <reset mode> <chainpos> <endianness> <variant>
 target arm7tdmi little 0 arm7tdmi
-
-
-target_script 0 reset event/sam7x256_reset.script
+[new_target_name] configure -event old-post_reset { script event/sam7x256_reset.script }
 
 working_area 0 0x00200000 0x4000 nobackup
 
index 45ea70550f148b08166c5c62649afe0809277466..59e7e1795dedf259a951a7bf8424265961f4be24 100644 (file)
@@ -1,11 +1,6 @@
 #start slow, speed up after reset
 jtag_khz 10
-proc target_0_pre_reset {} {
-       jtag_khz 10
-}
-proc target_0_post_reset {} {
-       jtag_khz 6000
-}
+
 
 #use combined on interfaces or targets that can't set TRST/SRST separately
 reset_config trst_and_srst srst_pulls_trst
@@ -17,9 +12,9 @@ jtag_device 4 0x1 0xf 0xe
 #target <type> <startup mode>
 #target arm7tdmi <reset mode> <chainpos> <endianness> <variant>
 target arm7tdmi little 0 arm7tdmi
-
-
-target_script 0 gdb_program_config event/str710_program.script
+[new_target_name] configure -event old-pre_reset { jtag_khz 10 }
+[new_target_name] configure -event old-post_reset { jtag_khz 6000 }
+[new_target_name] configure -event old-gdb_program_config { script event/str710_program.script }
 
 
 working_area 0 0x2000C000 0x4000 nobackup
index 837dbcf40fa82ea052d8727331a09cf1e6b1ca8b..a65f75a05b5ae8563dfd50408f06953dc8b25e3f 100644 (file)
@@ -2,12 +2,6 @@
 
 
 jtag_khz 3000
-proc target_0_pre_reset {} {
-       jtag_khz 10
-}
-proc target_0_post_reset {} {
-       jtag_khz 3000
-}
 
 
 #use combined on interfaces or targets that can\92t set TRST/SRST separately
@@ -23,10 +17,9 @@ jtag_nsrst_delay 500
 jtag_ntrst_delay 500
 
 target arm7tdmi little 0 arm7tdmi
-
-
-
-target_script 0 gdb_program_config event/str730_program.script
+[new_target_name] configure -event old-pre_reset { jtag_khz 10 }
+[new_target_name] configure -event old-post_reset { jtag_khz 3000 }
+[new_target_name] configure -event old-gdb_program_config { script event/str730_program.script }
 
 working_area 0 0x40000000 0x4000 nobackup
 
index 8572e1bd71080f30921012cfafa119af7932b7ff..7a8fde4149c9d11c542165edcaec81867879b07c 100644 (file)
@@ -2,12 +2,7 @@
 
 # jtag speed
 jtag_khz 10
-proc target_0_pre_reset {} {
-       jtag_khz 10
-}
-proc target_0_post_reset {} {
-       jtag_khz 3000
-}
+
 
 #use combined on interfaces or targets that can\92t set TRST/SRST separately
 #reset_config trst_and_srst srst_pulls_trst
@@ -25,9 +20,9 @@ jtag_ntrst_delay 500
 #target arm7tdmi <reset mode> <chainpos> <endianness> <variant>
 target arm7tdmi little 0 arm7tdmi
 
-
-
-target_script 0 gdb_program_config event/str750_program.script
+[new_target_name] configure -event old-pre_reset  { jtag_khz 10 }
+[new_target_name] configure -event old-post_reset { jtag_khz 3000 }
+[new_target_name] configure -event old-gdb_program_config { script event/str750_program.script }
 
 working_area 0 0x40000000 0x4000 nobackup
 
index ca2fb8ca4038528e60c2e76a92a1d70bc5b0df45..2e0056a63a1b2855dbc4474190367ecb411b0bda 100644 (file)
@@ -3,23 +3,6 @@
 # jtag speed. We need to stick to 16kHz until we've finished reset.
 
 jtag_rclk 16
-proc target_0_pre_reset {} {
-       jtag_rclk 16
-}
-
-proc target_0_post_reset {} {
-       # We can increase speed now that we know the target is halted.
-       jtag_rclk 3000
-       
-       # -- Enable 96K RAM
-       # PFQBC enabled / DTCM & AHB wait-states disabled
-       mww 0x5C002034 0x0191 
-
-       str9x flash_config 0 4 2 0 0x80000
-       flash protect 0 0 7 off
-       
-       
-}
 
 
 jtag_nsrst_delay 100
@@ -38,6 +21,20 @@ jtag_device 5 0x1 0x1 0x1e
 #target arm7tdmi <reset mode> <chainpos> <endianness> <variant>
 target arm966e little 1 arm966e
 
+[new_target_name] configure -event old-pre_reset { jtag_rclk 16 }
+
+[new_target_name] configure -event old-post_reset {
+       # We can increase speed now that we know the target is halted.
+       jtag_rclk 3000
+       
+       # -- Enable 96K RAM
+       # PFQBC enabled / DTCM & AHB wait-states disabled
+       mww 0x5C002034 0x0191 
+
+       str9x flash_config 0 4 2 0 0x80000
+       flash protect 0 0 7 off
+}
+
 
 
 working_area 0 0x50000000 16384 nobackup
index eccb8fa456665698098109337c426a058baa940d..08f326e60650f5b2e9643c04140117bd4bda2b6b 100644 (file)
@@ -17,7 +17,7 @@ jtag_ntrst_delay 0
 #target <type> <endianess> <reset mode> <JTAG pos> <variant>
 target arm926ejs big 0 arm926ejs
 
-target_script 0 reset event/wi-9c_reset.script
+[new_target_name] configure -event old-post_reset { script event/wi-9c_reset.script }
 
 
 #working area <target#> <address> <size> <backup|nobackup>
index c65f7350df426d7049531d0d2e693dc45c6f30c9..dcac9dd219478db8a5dbe4879fa78e843db8673b 100644 (file)
@@ -10,7 +10,7 @@ jtag_ntrst_delay 100
 jtag_device 7 0x1 0x7f 0x7e
 
 target  xscale big           0          ixp42x
-target_script 0 reset event/xba_revA3.script
+[new_target_name] configure -event old-post_reset { script event/xba_revA3.script }
 
 
 flash bank cfi 0x50000000 0x400000 2 2 0
index 9e8cdb9c9a9d54119d3abfd68e445b3e55a418c5..7a1b8b98ac3c3ffa10ccbbe396c77998ab7e6256 100644 (file)
@@ -21,7 +21,7 @@ arm7_9 fast_memory_access enable
 arm7_9 dcc_downloads enable
 
 flash bank ecosflash 0x01000000 0x200000 2 2 0 ecos/at91eb40a.elf
-target_script 0 reset event/zy1000_reset.script
+[new_target_name] configure -event old-post_reset { script event/zy1000_reset.script }
 
 # required for usable performance. Used for lots of
 # other things than flash programming.
index 87fb6acd190f4d3b86d75fe136b23bee4ffd1f8e..6b033cbd3e80f3c4bb9778154c25c79d5ec1f80c 100644 (file)
@@ -53,7 +53,7 @@
 int xscale_register_commands(struct command_context_s *cmd_ctx);
 
 /* forward declarations */
-int xscale_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+int xscale_target_create(struct target_s *target, Jim_Interp *interp);
 int xscale_init_target(struct command_context_s *cmd_ctx, struct target_s *target);
 int xscale_quit(void);
 
@@ -124,7 +124,7 @@ target_type_t xscale_target =
        .remove_watchpoint = xscale_remove_watchpoint,
 
        .register_commands = xscale_register_commands,
-       .target_command = xscale_target_command,
+       .target_create = xscale_target_create,
        .init_target = xscale_init_target,
        .quit = xscale_quit,
        
@@ -3001,7 +3001,7 @@ int xscale_quit(void)
        return ERROR_OK;
 }
 
-int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, int chain_pos, char *variant)
+int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, int chain_pos, const char *variant)
 {
        armv4_5_common_t *armv4_5;
        u32 high_reset_branch, low_reset_branch;
@@ -3112,24 +3112,11 @@ int xscale_init_arch_info(target_t *target, xscale_common_t *xscale, int chain_p
 }
 
 /* target xscale <endianess> <startup_mode> <chain_pos> <variant> */
-int xscale_target_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target)
+int xscale_target_create(struct target_s *target, Jim_Interp *interp)
 {
-       int chain_pos;
-       char *variant = NULL;
-       xscale_common_t *xscale = malloc(sizeof(xscale_common_t));
-       memset(xscale, 0, sizeof(*xscale));
+       xscale_common_t *xscale = calloc(1,sizeof(xscale_common_t));
 
-       if (argc < 5)
-       {
-               LOG_ERROR("'target xscale' requires four arguments: <endianess> <startup_mode> <chain_pos> <variant>");
-               return ERROR_OK;
-       }
-
-       chain_pos = strtoul(args[3], NULL, 0);
-
-       variant = args[4];
-
-       xscale_init_arch_info(target, xscale, chain_pos, variant);
+       xscale_init_arch_info(target, xscale, target->chain_position, target->variant);
        xscale_build_reg_cache(target);
 
        return ERROR_OK;
@@ -3735,3 +3722,11 @@ int xscale_register_commands(struct command_context_s *cmd_ctx)
 
        return ERROR_OK;
 }
+
+
+/*
+ * Local Variables: ***
+ * c-basic-offset: 4 ***
+ * tab-width: 4 ***
+ * End: ***
+ */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)