X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=5542b33543144281959f6acf708d0761e2adf4c4;hb=68c598e88d5e09728ea845a81ab279c615bbaf0f;hp=ee65147c6d3ef98c2a9d45718128653ce309e8d4;hpb=5ac8036b7fdaa32d44fb756f46f60d8de33e3a50;p=openocd.git diff --git a/src/target/target.c b/src/target/target.c index ee65147c6d..5542b33543 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -2,9 +2,15 @@ * Copyright (C) 2005 by Dominic Rath * * Dominic.Rath@gmx.de * * * - * Copyright (C) 2007,2008 Øyvind Harboe * + * Copyright (C) 2007,2008 Øyvind Harboe * * oyvind.harboe@zylin.com * * * + * Copyright (C) 2008, Duane Ellis * + * openocd@duaneeellis.com * + * * + * Copyright (C) 2008 by Spencer Oliver * + * spen@spen-soft.co.uk * + * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * @@ -50,6 +56,8 @@ #include #include +static int USE_OLD_RESET = 0; // temp + int cli_target_callback_event_handler(struct target_s *target, enum target_event event, void *priv); @@ -61,6 +69,7 @@ int handle_reg_command(struct command_context_s *cmd_ctx, char *cmd, char **args int handle_poll_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_wait_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); +int handle_NEWreset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_soft_reset_halt_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc); @@ -411,8 +420,28 @@ int target_resume(struct target_s *target, int current, u32 address, int handle_ return retval; } + +static int NEW_target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode) +{ + char buf[100]; + Jim_Nvp *n; + n = Jim_Nvp_value2name_simple( nvp_reset_modes, reset_mode ); + if( n->name == NULL ){ + LOG_ERROR("invalid reset mode"); + return ERROR_FAIL; + } + + sprintf( buf, "ocd_process_reset %s", n->name ); + Jim_Eval( interp, buf ); + + /* We want any events to be processed before the prompt */ + target_call_timer_callbacks_now(); + + return ERROR_OK; +} + // Next patch - this turns into TCL... -int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode) +static int OLD_target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode) { int retval = ERROR_OK; target_t *target; @@ -507,6 +536,16 @@ int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mo return retval; } +int target_process_reset(struct command_context_s *cmd_ctx, enum target_reset_mode reset_mode) +{ + if( USE_OLD_RESET ){ + return OLD_target_process_reset( cmd_ctx, reset_mode ); + } else { + return NEW_target_process_reset( cmd_ctx, reset_mode ); + } +} + + static int default_virt2phys(struct target_s *target, u32 virtual, u32 *physical) { *physical = virtual; @@ -826,7 +865,7 @@ int target_call_timer_callbacks(void) /* invoke periodic callbacks immediately */ int target_call_timer_callbacks_now(void) { - return target_call_timer_callbacks(); + return target_call_timer_callbacks_check_time(0); } int target_alloc_working_area(struct target_s *target, u32 size, working_area_t **area) @@ -1355,7 +1394,8 @@ int target_register_user_commands(struct command_context_s *cmd_ctx) register_command(cmd_ctx, NULL, "halt", handle_halt_command, COMMAND_EXEC, "halt target"); register_command(cmd_ctx, NULL, "resume", handle_resume_command, COMMAND_EXEC, "resume target [addr]"); register_command(cmd_ctx, NULL, "step", handle_step_command, COMMAND_EXEC, "step one instruction from current PC or [addr]"); - register_command(cmd_ctx, NULL, "reset", handle_reset_command, COMMAND_EXEC, "reset target [run|halt|init] - default is run"); + register_command(cmd_ctx, NULL, "NEWreset", handle_NEWreset_command, COMMAND_EXEC, "reset target [run|halt|init] - default is run"); + register_command(cmd_ctx, NULL, "reset", handle_reset_command, COMMAND_EXEC, "OLDreset target [run|halt|init] - default is run"); register_command(cmd_ctx, NULL, "soft_reset_halt", handle_soft_reset_halt_command, COMMAND_EXEC, "halt the target and do a soft reset"); register_command(cmd_ctx, NULL, "mdw", handle_md_command, COMMAND_EXEC, "display memory words [count]"); @@ -1749,6 +1789,25 @@ int handle_reset_command(struct command_context_s *cmd_ctx, char *cmd, char **ar return target_process_reset(cmd_ctx, reset_mode); } +int handle_NEWreset_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) +{ + int x; + char *cp; + + if (argc >= 1){ + x = strtol( args[0], &cp, 0 ); + if( *cp != 0 ){ + command_print( cmd_ctx, "Not numeric: %s\n", args[0] ); + return ERROR_COMMAND_SYNTAX_ERROR; + } + USE_OLD_RESET = !!x; + } + command_print( cmd_ctx, "reset method: %d (%s)\n", + USE_OLD_RESET, + USE_OLD_RESET ? "old-method" : "new-method" ); + return ERROR_OK; +} + int handle_resume_command(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc) { int retval; @@ -2999,7 +3058,6 @@ target_handle_event( target_t *target, enum target_event e ) enum target_cfg_param { TCFG_TYPE, TCFG_EVENT, - TCFG_RESET, TCFG_WORK_AREA_VIRT, TCFG_WORK_AREA_PHYS, TCFG_WORK_AREA_SIZE, @@ -3013,7 +3071,6 @@ enum target_cfg_param { 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 }, @@ -3038,7 +3095,7 @@ target_configure( Jim_GetOptInfo *goi, /* parse config or cget options ... */ - while( goi->argc ){ + while( goi->argc > 0 ){ Jim_SetEmptyResult( goi->interp ); //Jim_GetOpt_Debug( goi ); @@ -3283,8 +3340,8 @@ target_configure( Jim_GetOptInfo *goi, /* loop for more e*/ break; } - } - /* done - we return */ + } /* while( goi->argc ) */ + /* done - we return */ return JIM_OK; } @@ -3320,6 +3377,7 @@ tcl_target_func( Jim_Interp *interp, TS_CMD_WAITSTATE, TS_CMD_EVENTLIST, TS_CMD_CURSTATE, + TS_CMD_INVOKE_EVENT, }; static const Jim_Nvp target_options[] = { @@ -3341,6 +3399,7 @@ tcl_target_func( Jim_Interp *interp, { .name = "arp_reset", .value = TS_CMD_RESET }, { .name = "arp_halt", .value = TS_CMD_HALT }, { .name = "arp_waitstate", .value = TS_CMD_WAITSTATE }, + { .name = "invoke-event", .value = TS_CMD_INVOKE_EVENT }, { .name = NULL, .value = -1 }, }; @@ -3553,7 +3612,7 @@ tcl_target_func( Jim_Interp *interp, break; case TS_CMD_EXAMINE: if( goi.argc ){ - Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]"); + Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]"); return JIM_ERR; } e = target->type->examine( target ); @@ -3564,7 +3623,7 @@ tcl_target_func( Jim_Interp *interp, return JIM_OK; case TS_CMD_POLL: if( goi.argc ){ - Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]"); + Jim_WrongNumArgs( goi.interp, 2, argv, "[no parameters]"); return JIM_ERR; } if( !(target->type->examined) ){ @@ -3580,8 +3639,8 @@ tcl_target_func( Jim_Interp *interp, } break; case TS_CMD_RESET: - if( goi.argc != 1 ){ - Jim_WrongNumArgs( interp, 1, argv, "reset t|f|assert|deassert"); + if( goi.argc != 2 ){ + Jim_WrongNumArgs( interp, 2, argv, "t|f|assert|deassert BOOL"); return JIM_ERR; } e = Jim_GetOpt_Nvp( &goi, nvp_assert, &n ); @@ -3589,6 +3648,13 @@ tcl_target_func( Jim_Interp *interp, Jim_GetOpt_NvpUnknown( &goi, nvp_assert, 1 ); return e; } + // the halt or not param + e = Jim_GetOpt_Wide( &goi, &a); + if( e != JIM_OK ){ + return e; + } + // determine if we should halt or not. + target->reset_halt = !!a; // When this happens - all workareas are invalid. target_free_all_working_areas_restore(target, 0); @@ -3622,12 +3688,12 @@ tcl_target_func( Jim_Interp *interp, return e; } e = target_wait_state( target, n->value, a ); - if( e == ERROR_OK ){ + if( e != ERROR_OK ){ Jim_SetResult_sprintf( goi.interp, - "target: %s wait %s fails %d", + "target: %s wait %s fails (%d) %s", target->cmd_name, n->name, - target_strerror_safe(e) ); + e, target_strerror_safe(e) ); return JIM_ERR; } else { return JIM_OK; @@ -3662,6 +3728,18 @@ tcl_target_func( Jim_Interp *interp, Jim_SetResultString( goi.interp, Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name,-1); return JIM_OK; + case TS_CMD_INVOKE_EVENT: + if( goi.argc != 1 ){ + Jim_SetResult_sprintf( goi.interp, "%s ?EVENTNAME?",n->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; + } + target_handle_event( target, n->value ); + return JIM_OK; } return JIM_ERR; } @@ -4005,13 +4083,6 @@ jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv ) Jim_NewIntObj( goi.interp, max_target_number())); return JIM_OK; } -} - - -/* - * Local Variables: *** - * c-basic-offset: 4 *** - * tab-width: 4 *** - * End: *** - */ + return JIM_ERR; +}