- added support for the oocd-link (http://www.joernonline.de/dw/doku.php?id=en:projects:oocdlink)
- fixed breakpoint handling (this changes the target_t interface) git-svn-id: svn://svn.berlios.de/openocd/trunk@113 b42882b7-edfa-0310-969c-e2dbd0fdcd60__archive__
parent
83440065c0
commit
03e8f264f4
|
@ -108,6 +108,7 @@ ft2232_layout_t ft2232_layouts[] =
|
||||||
{"usbjtag", usbjtag_init, usbjtag_reset, NULL},
|
{"usbjtag", usbjtag_init, usbjtag_reset, NULL},
|
||||||
{"jtagkey", jtagkey_init, jtagkey_reset, NULL},
|
{"jtagkey", jtagkey_init, jtagkey_reset, NULL},
|
||||||
{"jtagkey_prototype_v1", jtagkey_init, jtagkey_reset, NULL},
|
{"jtagkey_prototype_v1", jtagkey_init, jtagkey_reset, NULL},
|
||||||
|
{"oocdlink", jtagkey_init, jtagkey_reset, NULL},
|
||||||
{"signalyzer", usbjtag_init, usbjtag_reset, NULL},
|
{"signalyzer", usbjtag_init, usbjtag_reset, NULL},
|
||||||
{"evb_lm3s811", usbjtag_init, usbjtag_reset, NULL},
|
{"evb_lm3s811", usbjtag_init, usbjtag_reset, NULL},
|
||||||
{"olimex-jtag", olimex_jtag_init, olimex_jtag_reset, olimex_jtag_blink},
|
{"olimex-jtag", olimex_jtag_init, olimex_jtag_reset, olimex_jtag_blink},
|
||||||
|
@ -1260,7 +1261,8 @@ int jtagkey_init(void)
|
||||||
nSRST = 0x02;
|
nSRST = 0x02;
|
||||||
nSRSTnOE = 0x08;
|
nSRSTnOE = 0x08;
|
||||||
}
|
}
|
||||||
else if (strcmp(layout->name, "jtagkey_prototype_v1") == 0)
|
else if ((strcmp(layout->name, "jtagkey_prototype_v1") == 0) ||
|
||||||
|
(strcmp(layout->name, "oocdlink") == 0))
|
||||||
{
|
{
|
||||||
nTRST = 0x02;
|
nTRST = 0x02;
|
||||||
nTRSTnOE = 0x1;
|
nTRSTnOE = 0x1;
|
||||||
|
|
|
@ -253,7 +253,7 @@ int arm7_9_unset_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int arm7_9_add_breakpoint(struct target_s *target, u32 address, u32 length, enum breakpoint_type type)
|
int arm7_9_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint)
|
||||||
{
|
{
|
||||||
armv4_5_common_t *armv4_5 = target->arch_info;
|
armv4_5_common_t *armv4_5 = target->arch_info;
|
||||||
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
|
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
|
||||||
|
@ -266,28 +266,29 @@ int arm7_9_add_breakpoint(struct target_s *target, u32 address, u32 length, enum
|
||||||
|
|
||||||
if (arm7_9->force_hw_bkpts)
|
if (arm7_9->force_hw_bkpts)
|
||||||
{
|
{
|
||||||
type = BKPT_HARD;
|
DEBUG("forcing use of hardware breakpoint at address 0x%8.8x", breakpoint->address);
|
||||||
|
breakpoint->type = BKPT_HARD;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((type == BKPT_SOFT) && (arm7_9->sw_bkpts_enabled == 0))
|
if ((breakpoint->type == BKPT_SOFT) && (arm7_9->sw_bkpts_enabled == 0))
|
||||||
{
|
{
|
||||||
INFO("sw breakpoint requested, but software breakpoints not enabled");
|
INFO("sw breakpoint requested, but software breakpoints not enabled");
|
||||||
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((type == BKPT_HARD) && (arm7_9->wp_available < 1))
|
if ((breakpoint->type == BKPT_HARD) && (arm7_9->wp_available < 1))
|
||||||
{
|
{
|
||||||
INFO("no watchpoint unit available for hardware breakpoint");
|
INFO("no watchpoint unit available for hardware breakpoint");
|
||||||
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((length != 2) && (length != 4))
|
if ((breakpoint->length != 2) && (breakpoint->length != 4))
|
||||||
{
|
{
|
||||||
INFO("only breakpoints of two (Thumb) or four (ARM) bytes length supported");
|
INFO("only breakpoints of two (Thumb) or four (ARM) bytes length supported");
|
||||||
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == BKPT_HARD)
|
if (breakpoint->type == BKPT_HARD)
|
||||||
arm7_9->wp_available--;
|
arm7_9->wp_available--;
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
|
@ -406,7 +407,7 @@ int arm7_9_unset_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int arm7_9_add_watchpoint(struct target_s *target, u32 address, u32 length, enum watchpoint_rw rw)
|
int arm7_9_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint)
|
||||||
{
|
{
|
||||||
armv4_5_common_t *armv4_5 = target->arch_info;
|
armv4_5_common_t *armv4_5 = target->arch_info;
|
||||||
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
|
arm7_9_common_t *arm7_9 = armv4_5->arch_info;
|
||||||
|
@ -422,7 +423,7 @@ int arm7_9_add_watchpoint(struct target_s *target, u32 address, u32 length, enum
|
||||||
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((length != 1) && (length != 2) && (length != 4))
|
if ((watchpoint->length != 1) && (watchpoint->length != 2) && (watchpoint->length != 4))
|
||||||
{
|
{
|
||||||
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,9 +114,9 @@ int arm7_9_bulk_write_memory(target_t *target, u32 address, u32 count, u8 *buffe
|
||||||
|
|
||||||
int arm7_9_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_prams, reg_param_t *reg_param, u32 entry_point, void *arch_info);
|
int arm7_9_run_algorithm(struct target_s *target, int num_mem_params, mem_param_t *mem_params, int num_reg_prams, reg_param_t *reg_param, u32 entry_point, void *arch_info);
|
||||||
|
|
||||||
int arm7_9_add_breakpoint(struct target_s *target, u32 address, u32 length, enum breakpoint_type type);
|
int arm7_9_add_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
|
||||||
int arm7_9_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
|
int arm7_9_remove_breakpoint(struct target_s *target, breakpoint_t *breakpoint);
|
||||||
int arm7_9_add_watchpoint(struct target_s *target, u32 address, u32 length, enum watchpoint_rw rw);
|
int arm7_9_add_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
|
||||||
int arm7_9_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
|
int arm7_9_remove_watchpoint(struct target_s *target, watchpoint_t *watchpoint);
|
||||||
|
|
||||||
void arm7_9_enable_eice_step(target_t *target);
|
void arm7_9_enable_eice_step(target_t *target);
|
||||||
|
|
|
@ -57,16 +57,28 @@ int breakpoint_add(target_t *target, u32 address, u32 length, enum breakpoint_ty
|
||||||
breakpoint = breakpoint->next;
|
breakpoint = breakpoint->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((retval = target->type->add_breakpoint(target, address, length, type)) != ERROR_OK)
|
(*breakpoint_p) = malloc(sizeof(breakpoint_t));
|
||||||
|
(*breakpoint_p)->address = address;
|
||||||
|
(*breakpoint_p)->length = length;
|
||||||
|
(*breakpoint_p)->type = type;
|
||||||
|
(*breakpoint_p)->set = 0;
|
||||||
|
(*breakpoint_p)->orig_instr = malloc(CEIL(length, 8));
|
||||||
|
(*breakpoint_p)->next = NULL;
|
||||||
|
|
||||||
|
if ((retval = target->type->add_breakpoint(target, *breakpoint_p)) != ERROR_OK)
|
||||||
{
|
{
|
||||||
switch (retval)
|
switch (retval)
|
||||||
{
|
{
|
||||||
case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
|
case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
|
||||||
INFO("can't add %s breakpoint, resource not available", breakpoint_type_strings[type]);
|
INFO("can't add %s breakpoint, resource not available", breakpoint_type_strings[(*breakpoint_p)->type]);
|
||||||
|
free (*breakpoint_p);
|
||||||
|
*breakpoint_p = NULL;
|
||||||
return retval;
|
return retval;
|
||||||
break;
|
break;
|
||||||
case ERROR_TARGET_NOT_HALTED:
|
case ERROR_TARGET_NOT_HALTED:
|
||||||
INFO("can't add breakpoint while target is running");
|
INFO("can't add breakpoint while target is running");
|
||||||
|
free (*breakpoint_p);
|
||||||
|
*breakpoint_p = NULL;
|
||||||
return retval;
|
return retval;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -76,15 +88,9 @@ int breakpoint_add(target_t *target, u32 address, u32 length, enum breakpoint_ty
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
(*breakpoint_p) = malloc(sizeof(breakpoint_t));
|
DEBUG("added %s breakpoint at 0x%8.8x of length 0x%8.8x",
|
||||||
(*breakpoint_p)->address = address;
|
breakpoint_type_strings[(*breakpoint_p)->type],
|
||||||
(*breakpoint_p)->length = length;
|
(*breakpoint_p)->address, (*breakpoint_p)->length);
|
||||||
(*breakpoint_p)->type = type;
|
|
||||||
(*breakpoint_p)->set = 0;
|
|
||||||
(*breakpoint_p)->orig_instr = malloc(CEIL(length, 8));
|
|
||||||
(*breakpoint_p)->next = NULL;
|
|
||||||
|
|
||||||
DEBUG("added %s breakpoint at 0x%8.8x of length 0x%8.8x", breakpoint_type_strings[type], address, length);
|
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
@ -159,25 +165,6 @@ int watchpoint_add(target_t *target, u32 address, u32 length, enum watchpoint_rw
|
||||||
watchpoint = watchpoint->next;
|
watchpoint = watchpoint->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((retval = target->type->add_watchpoint(target, address, length, rw)) != ERROR_OK)
|
|
||||||
{
|
|
||||||
switch (retval)
|
|
||||||
{
|
|
||||||
case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
|
|
||||||
INFO("can't add %s watchpoint, resource not available", watchpoint_rw_strings[rw]);
|
|
||||||
return retval;
|
|
||||||
break;
|
|
||||||
case ERROR_TARGET_NOT_HALTED:
|
|
||||||
INFO("can't add watchpoint while target is running");
|
|
||||||
return retval;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERROR("unknown error");
|
|
||||||
exit(-1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
(*watchpoint_p) = malloc(sizeof(watchpoint_t));
|
(*watchpoint_p) = malloc(sizeof(watchpoint_t));
|
||||||
(*watchpoint_p)->address = address;
|
(*watchpoint_p)->address = address;
|
||||||
(*watchpoint_p)->length = length;
|
(*watchpoint_p)->length = length;
|
||||||
|
@ -187,7 +174,32 @@ int watchpoint_add(target_t *target, u32 address, u32 length, enum watchpoint_rw
|
||||||
(*watchpoint_p)->set = 0;
|
(*watchpoint_p)->set = 0;
|
||||||
(*watchpoint_p)->next = NULL;
|
(*watchpoint_p)->next = NULL;
|
||||||
|
|
||||||
DEBUG("added %s watchpoint at 0x%8.8x of length 0x%8.8x", watchpoint_rw_strings[rw], address, length);
|
if ((retval = target->type->add_watchpoint(target, *watchpoint_p)) != ERROR_OK)
|
||||||
|
{
|
||||||
|
switch (retval)
|
||||||
|
{
|
||||||
|
case ERROR_TARGET_RESOURCE_NOT_AVAILABLE:
|
||||||
|
INFO("can't add %s watchpoint, resource not available", watchpoint_rw_strings[(*watchpoint_p)->rw]);
|
||||||
|
free (*watchpoint_p);
|
||||||
|
*watchpoint_p = NULL;
|
||||||
|
return retval;
|
||||||
|
break;
|
||||||
|
case ERROR_TARGET_NOT_HALTED:
|
||||||
|
INFO("can't add watchpoint while target is running");
|
||||||
|
free (*watchpoint_p);
|
||||||
|
*watchpoint_p = NULL;
|
||||||
|
return retval;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ERROR("unknown error");
|
||||||
|
exit(-1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUG("added %s watchpoint at 0x%8.8x of length 0x%8.8x",
|
||||||
|
watchpoint_rw_strings[(*watchpoint_p)->rw],
|
||||||
|
(*watchpoint_p)->address, (*watchpoint_p)->length);
|
||||||
|
|
||||||
return ERROR_OK;
|
return ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,9 +125,9 @@ typedef struct target_type_s
|
||||||
/* target break-/watchpoint control
|
/* target break-/watchpoint control
|
||||||
* rw: 0 = write, 1 = read, 2 = access
|
* rw: 0 = write, 1 = read, 2 = access
|
||||||
*/
|
*/
|
||||||
int (*add_breakpoint)(struct target_s *target, u32 address, u32 length, enum breakpoint_type type);
|
int (*add_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
|
||||||
int (*remove_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
|
int (*remove_breakpoint)(struct target_s *target, breakpoint_t *breakpoint);
|
||||||
int (*add_watchpoint)(struct target_s *target, u32 address, u32 length, enum watchpoint_rw rw);
|
int (*add_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
|
||||||
int (*remove_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
|
int (*remove_watchpoint)(struct target_s *target, watchpoint_t *watchpoint);
|
||||||
|
|
||||||
/* target algorithm support */
|
/* target algorithm support */
|
||||||
|
|
Loading…
Reference in New Issue