From: drath Date: Thu, 16 Aug 2007 13:12:48 +0000 (+0000) Subject: - update jtag_speed setting when changing it during runtime with a FT2232 based interface X-Git-Tag: v0.1.0~1082 X-Git-Url: https://review.openocd.org/gitweb?p=openocd.git;a=commitdiff_plain;h=cb6ebced3df72668091d5920fef3fbc46ddbc7ac - update jtag_speed setting when changing it during runtime with a FT2232 based interface - use 'etm trigger_percent' setting when programming ETB trigger count - fixed some small bugs in ETM trace analysis - fixed minor bug in flash writing (thanks to Pavel Chromy) git-svn-id: svn://svn.berlios.de/openocd/trunk@197 b42882b7-edfa-0310-969c-e2dbd0fdcd60 --- diff --git a/src/flash/flash.c b/src/flash/flash.c index 19d5c3c587..9ca5f157be 100644 --- a/src/flash/flash.c +++ b/src/flash/flash.c @@ -797,10 +797,13 @@ int flash_write(target_t *target, image_t *image, u32 *written, char **error_str while ((run_address + run_size < c->base + c->size) && (section_last + 1 < image->num_sections)) { - if (image->sections[section_last + 1].base_address > (run_address + run_size)) - break; if (image->sections[section_last + 1].base_address < (run_address + run_size)) + { WARNING("section %d out of order", section_last + 1); + break; + } + if (image->sections[section_last + 1].base_address != (run_address + run_size)) + break; run_size += image->sections[++section_last].size; } @@ -836,8 +839,8 @@ int flash_write(target_t *target, image_t *image, u32 *written, char **error_str if (retval != ERROR_OK) snprintf(*error_str, FLASH_MAX_ERROR_STR, "error reading from image: %s", image->error_str); else - snprintf(*error_str, FLASH_MAX_ERROR_STR, "error reading from image"); + return ERROR_IMAGE_TEMPORARILY_UNAVAILABLE; } diff --git a/src/jtag/ft2232.c b/src/jtag/ft2232.c index 339e77daee..b1acee58b2 100644 --- a/src/jtag/ft2232.c +++ b/src/jtag/ft2232.c @@ -256,6 +256,8 @@ int ft2232_speed(int speed) ERROR("couldn't set FT2232 TCK speed"); return retval; } + + jtag_speed = speed; return ERROR_OK; } diff --git a/src/openocd.c b/src/openocd.c index 7e85c82b6c..4965d52f31 100644 --- a/src/openocd.c +++ b/src/openocd.c @@ -18,7 +18,7 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#define OPENOCD_VERSION "Open On-Chip Debugger (2007-08-14 12:00 CEST)" +#define OPENOCD_VERSION "Open On-Chip Debugger (2007-08-16 15:00 CEST)" #ifdef HAVE_CONFIG_H #include "config.h" diff --git a/src/target/etb.c b/src/target/etb.c index 81e20af01c..f145f3021b 100644 --- a/src/target/etb.c +++ b/src/target/etb.c @@ -636,6 +636,7 @@ int etb_start_capture(etm_context_t *etm_ctx) { etb_t *etb = etm_ctx->capture_driver_priv; u32 etb_ctrl_value = 0x1; + u32 trigger_count; if ((etm_ctx->portmode & ETM_PORT_MODE_MASK) == ETM_PORT_DEMUXED) { @@ -650,7 +651,9 @@ int etb_start_capture(etm_context_t *etm_ctx) if ((etm_ctx->portmode & ETM_PORT_MODE_MASK) == ETM_PORT_MUXED) return ERROR_ETM_PORTMODE_NOT_SUPPORTED; - etb_write_reg(&etb->reg_cache->reg_list[ETB_TRIGGER_COUNTER], 0x600); + trigger_count = (etb->ram_depth * etm_ctx->trigger_percent) / 100; + + etb_write_reg(&etb->reg_cache->reg_list[ETB_TRIGGER_COUNTER], trigger_count); etb_write_reg(&etb->reg_cache->reg_list[ETB_RAM_WRITE_POINTER], 0x0); etb_write_reg(&etb->reg_cache->reg_list[ETB_CTRL], etb_ctrl_value); jtag_execute_queue(); diff --git a/src/target/etm.c b/src/target/etm.c index cbe3db5932..3f7bbbf13c 100644 --- a/src/target/etm.c +++ b/src/target/etm.c @@ -762,6 +762,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) u32 old_index = ctx->pipe_index; u32 last_instruction = ctx->last_instruction; u32 cycles = 0; + int current_pc_ok = ctx->pc_ok; if (ctx->trace_data[ctx->pipe_index].flags & ETMV1_TRIGGER_CYCLE) { @@ -836,6 +837,16 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) break; case 0x4: /* periodic synchronization point */ next_pc = ctx->last_branch; + /* if we had no valid PC prior to this synchronization point, + * we have to move on with the next trace cycle + */ + if (!current_pc_ok) + { + command_print(cmd_ctx, "--- periodic synchronization point at 0x%8.8x ---", next_pc); + ctx->current_pc = next_pc; + ctx->pipe_index++; + continue; + } break; default: /* reserved */ ERROR("BUG: branch reason code 0x%x is reserved", ctx->last_branch_reason); @@ -883,7 +894,9 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) } else if (retval == ERROR_TRACE_INSTRUCTION_UNAVAILABLE) { - /* TODO: handle incomplete images */ + /* TODO: handle incomplete images + * for now we just quit the analsysis*/ + return retval; } } @@ -910,7 +923,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) do { if ((retval = etmv1_next_packet(ctx, &packet, 0)) != 0) - return -1; + return ERROR_ETM_ANALYSIS_FAILED; ctx->last_ptr &= ~(0x7f << shift); ctx->last_ptr |= (packet & 0x7f) << shift; shift += 7; @@ -936,7 +949,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) { u32 data; if (etmv1_data(ctx, 4, &data) != 0) - return -1; + return ERROR_ETM_ANALYSIS_FAILED; command_print(cmd_ctx, "data: 0x%8.8x", data); } } @@ -945,7 +958,7 @@ int etmv1_analyze_trace(etm_context_t *ctx, struct command_context_s *cmd_ctx) { u32 data; if (etmv1_data(ctx, arm_access_size(&instruction), &data) != 0) - return -1; + return ERROR_ETM_ANALYSIS_FAILED; command_print(cmd_ctx, "data: 0x%8.8x", data); } } @@ -1771,6 +1784,7 @@ int handle_etm_analyze_command(struct command_context_s *cmd_ctx, char *cmd, cha armv4_5_common_t *armv4_5; arm7_9_common_t *arm7_9; etm_context_t *etm_ctx; + int retval; target = get_current_target(cmd_ctx); @@ -1786,7 +1800,23 @@ int handle_etm_analyze_command(struct command_context_s *cmd_ctx, char *cmd, cha return ERROR_OK; } - etmv1_analyze_trace(etm_ctx, cmd_ctx); + if ((retval = etmv1_analyze_trace(etm_ctx, cmd_ctx)) != ERROR_OK) + { + switch(retval) + { + case ERROR_ETM_ANALYSIS_FAILED: + command_print(cmd_ctx, "further analysis failed (corrupted trace data or just end of data"); + break; + case ERROR_TRACE_INSTRUCTION_UNAVAILABLE: + command_print(cmd_ctx, "no instruction for current address available, analysis aborted"); + break; + case ERROR_TRACE_IMAGE_UNAVAILABLE: + command_print(cmd_ctx, "no image available for trace analysis"); + break; + default: + command_print(cmd_ctx, "unknown error: %i", retval); + } + } return ERROR_OK; } diff --git a/src/target/etm.h b/src/target/etm.h index bcaf25132c..bfa1252b76 100644 --- a/src/target/etm.h +++ b/src/target/etm.h @@ -209,5 +209,6 @@ extern etm_context_t* etm_create_context(etm_portmode_t portmode, char *capture_ #define ERROR_ETM_INVALID_DRIVER (-1300) #define ERROR_ETM_PORTMODE_NOT_SUPPORTED (-1301) #define ERROR_ETM_CAPTURE_INIT_FAILED (-1302) +#define ERROR_ETM_ANALYSIS_FAILED (-1303) #endif /* ETM_H */