X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=blobdiff_plain;f=src%2Ftarget%2Ftarget.c;h=6f458bcebe63d378a3cda378a5c1957a84798a4a;hp=b868383d1bed017654b2dfcceb232060293c0fe4;hb=2eacb8fdfb4ea761acc3a3fbb51d048fefccd9b6;hpb=e22bad797f6c09c9ade8b8df63ff507fb9ba900d diff --git a/src/target/target.c b/src/target/target.c index b868383d1b..6f458bcebe 100644 --- a/src/target/target.c +++ b/src/target/target.c @@ -55,6 +55,7 @@ #include "trace.h" #include "image.h" #include "rtos/rtos.h" +#include "transport/transport.h" /* default halt wait timeout (ms) */ #define DEFAULT_HALT_TIMEOUT 5000 @@ -88,7 +89,7 @@ extern struct target_type feroceon_target; extern struct target_type dragonite_target; extern struct target_type xscale_target; extern struct target_type cortexm_target; -extern struct target_type cortexa8_target; +extern struct target_type cortexa_target; extern struct target_type cortexr4_target; extern struct target_type arm11_target; extern struct target_type mips_m4k_target; @@ -117,7 +118,7 @@ static struct target_type *target_types[] = { &dragonite_target, &xscale_target, &cortexm_target, - &cortexa8_target, + &cortexa_target, &cortexr4_target, &arm11_target, &mips_m4k_target, @@ -862,6 +863,8 @@ int target_run_flash_async_algorithm(struct target *target, int retval; int timeout = 0; + const uint8_t *buffer_orig = buffer; + /* Set up working area. First word is write pointer, second word is read pointer, * rest is fifo data area. */ uint32_t wp_addr = buffer_start; @@ -902,7 +905,8 @@ int target_run_flash_async_algorithm(struct target *target, break; } - LOG_DEBUG("count 0x%" PRIx32 " wp 0x%" PRIx32 " rp 0x%" PRIx32, count, wp, rp); + LOG_DEBUG("offs 0x%zx count 0x%" PRIx32 " wp 0x%" PRIx32 " rp 0x%" PRIx32, + (size_t) (buffer - buffer_orig), count, wp, rp); if (rp == 0) { LOG_ERROR("flash write algorithm aborted by target"); @@ -1274,6 +1278,10 @@ COMMAND_HANDLER(handle_target_init_command) if (ERROR_OK != retval) return retval; + retval = command_run_line(CMD_CTX, "init_target_events"); + if (ERROR_OK != retval) + return retval; + retval = command_run_line(CMD_CTX, "init_board"); if (ERROR_OK != retval) return retval; @@ -2414,8 +2422,18 @@ static int handle_target(void *priv) return retval; } /* Since we succeeded, we reset backoff count */ - if (target->backoff.times > 0) - LOG_USER("Polling target %s succeeded again", target_name(target)); + if (target->backoff.times > 0) { + LOG_USER("Polling target %s succeeded again, trying to reexamine", target_name(target)); + target_reset_examined(target); + retval = target_examine_one(target); + /* Target examination could have failed due to unstable connection, + * but we set the examined flag anyway to repoll it later */ + if (retval != ERROR_OK) { + target->examined = true; + return retval; + } + } + target->backoff.times = 0; } } @@ -3186,7 +3204,7 @@ static COMMAND_HELPER(handle_verify_image_command_internal, int verify) if (diffs == 0) LOG_ERROR("checksum mismatch - attempting binary compare"); - data = (uint8_t *)malloc(buf_cnt); + data = malloc(buf_cnt); /* Can we use 32bit word accesses? */ int size = 1; @@ -3618,7 +3636,7 @@ COMMAND_HANDLER(handle_profile_command) const uint32_t MAX_PROFILE_SAMPLE_NUM = 10000; uint32_t offset; - uint32_t num_of_sampels; + uint32_t num_of_samples; int retval = ERROR_OK; COMMAND_PARSE_NUMBER(u32, CMD_ARGV[0], offset); @@ -3635,13 +3653,13 @@ COMMAND_HANDLER(handle_profile_command) * Provide a way to use that more efficient mechanism. */ retval = target_profiling(target, samples, MAX_PROFILE_SAMPLE_NUM, - &num_of_sampels, offset); + &num_of_samples, offset); if (retval != ERROR_OK) { free(samples); return retval; } - assert(num_of_sampels <= MAX_PROFILE_SAMPLE_NUM); + assert(num_of_samples <= MAX_PROFILE_SAMPLE_NUM); retval = target_poll(target); if (retval != ERROR_OK) { @@ -3671,7 +3689,7 @@ COMMAND_HANDLER(handle_profile_command) COMMAND_PARSE_NUMBER(u32, CMD_ARGV[3], end_address); } - write_gmon(samples, num_of_sampels, CMD_ARGV[1], + write_gmon(samples, num_of_samples, CMD_ARGV[1], with_range, start_address, end_address); command_print(CMD_CTX, "Wrote %s", CMD_ARGV[1]); @@ -4103,7 +4121,6 @@ enum target_cfg_param { TCFG_WORK_AREA_SIZE, TCFG_WORK_AREA_BACKUP, TCFG_ENDIAN, - TCFG_VARIANT, TCFG_COREID, TCFG_CHAIN_POSITION, TCFG_DBGBASE, @@ -4118,7 +4135,6 @@ static Jim_Nvp nvp_config_opts[] = { { .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 = "-coreid", .value = TCFG_COREID }, { .name = "-chain-position", .value = TCFG_CHAIN_POSITION }, { .name = "-dbgbase", .value = TCFG_DBGBASE }, @@ -4131,7 +4147,6 @@ static int target_configure(Jim_GetOptInfo *goi, struct target *target) Jim_Nvp *n; Jim_Obj *o; jim_wide w; - char *cp; int e; /* parse config or cget options ... */ @@ -4340,27 +4355,6 @@ no_params: /* loop for more */ break; - case TCFG_VARIANT: - if (goi->isconfigure) { - if (goi->argc < 1) { - Jim_SetResultFormatted(goi->interp, - "%s ?STRING?", - n->name); - return JIM_ERR; - } - e = Jim_GetOpt_String(goi, &cp, NULL); - if (e != JIM_OK) - return e; - free(target->variant); - 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_COREID: if (goi->isconfigure) { e = Jim_GetOpt_Wide(goi, &w); @@ -5058,6 +5052,15 @@ static int target_create(Jim_GetOptInfo *goi) if (e != JIM_OK) return e; cp = cp2; + struct transport *tr = get_current_transport(); + if (tr->override_target) { + e = tr->override_target(&cp); + if (e != ERROR_OK) { + LOG_ERROR("The selected transport doesn't support this target"); + return JIM_ERR; + } + LOG_INFO("The selected transport took over low-level target control. The results might differ compared to plain JTAG/SWD"); + } /* now does target type exist */ for (x = 0 ; target_types[x] ; x++) { if (0 == strcmp(cp, target_types[x]->name)) { @@ -5096,9 +5099,10 @@ static int target_create(Jim_GetOptInfo *goi) target = calloc(1, sizeof(struct target)); /* set target number */ target->target_number = new_target_number(); + cmd_ctx->current_target = target->target_number; /* allocate memory for each unique target type */ - target->type = (struct target_type *)calloc(1, sizeof(struct target_type)); + target->type = calloc(1, sizeof(struct target_type)); memcpy(target->type, target_types[x], sizeof(struct target_type)); @@ -5163,10 +5167,6 @@ static int target_create(Jim_GetOptInfo *goi) target->endianness = TARGET_LITTLE_ENDIAN; } - /* incase variant is not set */ - if (!target->variant) - target->variant = strdup(""); - cp = Jim_GetString(new_cmd, NULL); target->cmd_name = strdup(cp); @@ -5484,7 +5484,7 @@ COMMAND_HANDLER(handle_fast_load_image_command) image_size = 0x0; retval = ERROR_OK; fastload_num = image.num_sections; - fastload = (struct FastLoad *)malloc(sizeof(struct FastLoad)*image.num_sections); + fastload = malloc(sizeof(struct FastLoad)*image.num_sections); if (fastload == NULL) { command_print(CMD_CTX, "out of memory"); image_close(&image); @@ -5708,7 +5708,7 @@ COMMAND_HANDLER(handle_test_mem_access_command) read_buf[i] = read_ref[i]; } command_print_sameline(CMD_CTX, - "Test read %d x %d @ %d to %saligned buffer: ", count, + "Test read %" PRIu32 " x %d @ %d to %saligned buffer: ", count, size, offset, host_offset ? "un" : ""); struct duration bench; @@ -5780,7 +5780,7 @@ out: for (size_t i = 0; i < host_bufsiz; i++) write_buf[i] = rand(); command_print_sameline(CMD_CTX, - "Test write %d x %d @ %d from %saligned buffer: ", count, + "Test write %" PRIu32 " x %d @ %d from %saligned buffer: ", count, size, offset, host_offset ? "un" : ""); retval = target_write_memory(target, wa->address, 1, num_bytes, test_pattern);