Allow target attachment to timeout and report failure.

This is needed for if the target device is held in reset.
This commit is contained in:
Gareth McMullin 2012-11-03 16:42:46 +13:00
parent faa43fdc92
commit 0990c2224c
5 changed files with 29 additions and 15 deletions

View File

@ -108,12 +108,12 @@ static void do_nothing(void)
{ {
} }
static void arm7_attach(struct target_s *target); static bool arm7_attach(struct target_s *target);
static int arm7_regs_read(struct target_s *target, void *data); static int arm7_regs_read(struct target_s *target, void *data);
static int arm7_regs_write(struct target_s *target, const void *data); static int arm7_regs_write(struct target_s *target, const void *data);
static void arm7_halt_request(struct target_s *target); static void arm7_halt_request(struct target_s *target);
static int arm7_halt_wait(struct target_s *target); static int arm7_halt_wait(struct target_s *target);
static void arm7_halt_resume(struct target_s *target, uint8_t step); static void arm7_halt_resume(struct target_s *target, bool step);
void arm7tdmi_jtag_handler(jtag_dev_t *dev) void arm7tdmi_jtag_handler(jtag_dev_t *dev)
{ {
@ -242,7 +242,7 @@ static int arm7_halt_wait(struct target_s *target)
return 1; return 1;
} }
static void arm7_halt_resume(struct target_s *target, uint8_t step) static void arm7_halt_resume(struct target_s *target, bool step)
{ {
struct target_arm7_s *t = (struct target_arm7_s *)target; struct target_arm7_s *t = (struct target_arm7_s *)target;
@ -270,10 +270,15 @@ static void arm7_halt_resume(struct target_s *target, uint8_t step)
jtag_dev_write_ir(t->jtag, ARM7_IR_RESTART); jtag_dev_write_ir(t->jtag, ARM7_IR_RESTART);
} }
static void arm7_attach(struct target_s *target) static bool arm7_attach(struct target_s *target)
{ {
int tries = 0;
target_halt_request(target); target_halt_request(target);
while(!target_halt_wait(target)); while(!target_halt_wait(target) && --tries)
platform_delay(2);
if(!tries)
return false;
return true;
} }
static int arm7_regs_read(struct target_s *target, void *data) static int arm7_regs_read(struct target_s *target, void *data)

View File

@ -180,7 +180,7 @@ const struct command_s cortexm_cmd_list[] = {
#define SIGTRAP 5 #define SIGTRAP 5
#define SIGSEGV 11 #define SIGSEGV 11
static void cortexm_attach(struct target_s *target); static bool cortexm_attach(struct target_s *target);
static void cortexm_detach(struct target_s *target); static void cortexm_detach(struct target_s *target);
static int cortexm_regs_read(struct target_s *target, void *data); static int cortexm_regs_read(struct target_s *target, void *data);
@ -333,7 +333,7 @@ cortexm_probe(struct target_s *target)
target->halt_request = cortexm_halt_request; target->halt_request = cortexm_halt_request;
target->halt_wait = cortexm_halt_wait; target->halt_wait = cortexm_halt_wait;
target->halt_resume = cortexm_halt_resume; target->halt_resume = cortexm_halt_resume;
target->regs_size = sizeof(regnum_cortex_m); /* XXX: detect FP extension */ target->regs_size = sizeof(regnum_cortex_m);
target_add_commands(target, cortexm_cmd_list, cortexm_driver_str); target_add_commands(target, cortexm_cmd_list, cortexm_driver_str);
@ -371,19 +371,24 @@ cortexm_probe(struct target_s *target)
return 0; return 0;
} }
static void static bool
cortexm_attach(struct target_s *target) cortexm_attach(struct target_s *target)
{ {
ADIv5_AP_t *ap = adiv5_target_ap(target); ADIv5_AP_t *ap = adiv5_target_ap(target);
struct cortexm_priv *priv = ap->priv; struct cortexm_priv *priv = ap->priv;
unsigned i; unsigned i;
uint32_t r; uint32_t r;
int tries;
/* Clear any pending fault condition */ /* Clear any pending fault condition */
target_check_error(target); target_check_error(target);
target_halt_request(target); target_halt_request(target);
while(!target_halt_wait(target)); tries = 10;
while(!target_halt_wait(target) && --tries)
platform_delay(2);
if(!tries)
return false;
/* Request halt on reset */ /* Request halt on reset */
adiv5_ap_mem_write(ap, CORTEXM_DEMCR, priv->demcr); adiv5_ap_mem_write(ap, CORTEXM_DEMCR, priv->demcr);
@ -423,6 +428,8 @@ cortexm_attach(struct target_s *target)
target->set_hw_wp = cortexm_set_hw_wp; target->set_hw_wp = cortexm_set_hw_wp;
target->clear_hw_wp = cortexm_clear_hw_wp; target->clear_hw_wp = cortexm_clear_hw_wp;
target->check_hw_wp = cortexm_check_hw_wp; target->check_hw_wp = cortexm_check_hw_wp;
return true;
} }
static void static void

View File

@ -396,14 +396,15 @@ handle_v_packet(char *packet, int plen)
/* Attach to remote target processor */ /* Attach to remote target processor */
target *t; target *t;
uint32_t i; uint32_t i;
for(t = target_list, i = 1; t; t = t->next, i++) for(t = target_list, i = 1; t; t = t->next, i++)
if(i == addr) { if(i == addr) {
cur_target = target_attach(t, cur_target = target_attach(t,
gdb_target_destroy_callback); gdb_target_destroy_callback);
gdb_putpacketz("T05");
break; break;
} }
if(!cur_target) /* Failed to attach */ if(cur_target)
gdb_putpacketz("T05");
else
gdb_putpacketz("E01"); gdb_putpacketz("E01");
} else if (!strcmp(packet, "vRun;")) { } else if (!strcmp(packet, "vRun;")) {

View File

@ -120,7 +120,7 @@ struct target_s {
target_destroy_callback destroy_callback; target_destroy_callback destroy_callback;
/* Attach/Detach funcitons */ /* Attach/Detach funcitons */
void (*attach)(struct target_s *target); bool (*attach)(struct target_s *target);
void (*detach)(struct target_s *target); void (*detach)(struct target_s *target);
int (*check_error)(struct target_s *target); int (*check_error)(struct target_s *target);

View File

@ -75,7 +75,8 @@ target *target_attach(target *t, target_destroy_callback destroy_cb)
t->destroy_callback = destroy_cb; t->destroy_callback = destroy_cb;
t->attach(t); if (!t->attach(t))
return NULL;
return t; return t;
} }