return target;
}
+static void execute_script(struct command_context_s *cmd_ctx, char *reset_script)
+{
+ if (reset_script==NULL)
+ return;
+ FILE *script;
+ script = open_file_from_path(reset_script, "r");
+ if (!script)
+ {
+ LOG_ERROR("couldn't open script file %s", reset_script);
+ return;
+ }
+
+ LOG_INFO("executing script '%s'", reset_script);
+ command_run_file(cmd_ctx, script, COMMAND_EXEC);
+ fclose(script);
+}
+
/* Process target initialization, when target entered debug out of reset
* the handler is unregistered at the end of this function, so it's only called once
*/
int target_init_handler(struct target_s *target, enum target_event event, void *priv)
{
- FILE *script;
struct command_context_s *cmd_ctx = priv;
- if ((event == TARGET_EVENT_HALTED) && (target->reset_script))
+ if (event == TARGET_EVENT_HALTED)
{
target_unregister_event_callback(target_init_handler, priv);
- script = open_file_from_path(target->reset_script, "r");
- if (!script)
- {
- LOG_ERROR("couldn't open script file %s", target->reset_script);
- return ERROR_OK;
- }
-
- LOG_INFO("executing reset script '%s'", target->reset_script);
- command_run_file(cmd_ctx, script, COMMAND_EXEC);
- fclose(script);
+ execute_script(cmd_ctx, target->reset_script);
jtag_execute_queue();
}
jtag->speed(jtag_speed);
+ target = targets;
+ while (target)
+ {
+ execute_script(cmd_ctx, target->pre_reset_script);
+ target = target->next;
+ }
+
if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
return retval;
target = target->next;
}
+ if ((retval = jtag_execute_queue()) != ERROR_OK)
+ {
+ LOG_WARNING("JTAG communication failed while deasserting reset.");
+ retval = ERROR_OK;
+ }
+
if (jtag_reset_config & RESET_SRST_PULLS_TRST)
{
/* If TRST was asserted we need to set up registers again */
if ((retval = target_examine(cmd_ctx)) != ERROR_OK)
return retval;
- }
+ }
- if ((retval = jtag_execute_queue()) != ERROR_OK)
- {
- LOG_WARNING("JTAG communication failed while deasserting reset.");
- retval = ERROR_OK;
- }
LOG_DEBUG("Waiting for halted stated as approperiate");
return retval;
}
+int target_blank_check_memory(struct target_s *target, u32 address, u32 size, u32* blank)
+{
+ int retval;
+ if (!target->type->examined)
+ {
+ LOG_ERROR("Target not examined yet");
+ return ERROR_FAIL;
+ }
+
+ if (target->type->blank_check_memory == 0)
+ return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
+
+ retval = target->type->blank_check_memory(target, address, size, blank);
+
+ return retval;
+}
+
int target_read_u32(struct target_s *target, u32 address, u32 *value)
{
u8 value_buf[4];
*last_target_p = malloc(sizeof(target_t));
- (*last_target_p)->type = target_types[i];
+ /* 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;
(*last_target_p)->run_and_halt_time = 1000; /* default 1s */
(*last_target_p)->reset_script = NULL;
+ (*last_target_p)->pre_reset_script = NULL;
(*last_target_p)->post_halt_script = NULL;
(*last_target_p)->pre_resume_script = NULL;
(*last_target_p)->gdb_program_script = NULL;
return ERROR_COMMAND_SYNTAX_ERROR;
}
- if (strcmp(args[1], "reset") == 0)
+ if ((strcmp(args[1], "reset") == 0)||(strcmp(args[1], "post_reset") == 0))
{
if (target->reset_script)
free(target->reset_script);
target->reset_script = strdup(args[2]);
}
+ else if (strcmp(args[1], "pre_reset") == 0)
+ {
+ if (target->pre_reset_script)
+ free(target->pre_reset_script);
+ target->pre_reset_script = strdup(args[2]);
+ }
else if (strcmp(args[1], "post_halt") == 0)
{
if (target->post_halt_script)
while (watchpoint)
{
- command_print(cmd_ctx, "address: 0x%8.8x, mask: 0x%8.8x, r/w/a: %i, value: 0x%8.8x, mask: 0x%8.8x", watchpoint->address, watchpoint->length, watchpoint->rw, watchpoint->value, watchpoint->mask);
+ command_print(cmd_ctx, "address: 0x%8.8x, len: 0x%8.8x, r/w/a: %i, value: 0x%8.8x, mask: 0x%8.8x", watchpoint->address, watchpoint->length, watchpoint->rw, watchpoint->value, watchpoint->mask);
watchpoint = watchpoint->next;
}
}