- 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__archive__
parent
c35cc0b8b7
commit
cb6ebced3d
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -257,6 +257,8 @@ int ft2232_speed(int speed)
|
|||
return retval;
|
||||
}
|
||||
|
||||
jtag_speed = speed;
|
||||
|
||||
return ERROR_OK;
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue