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:
parent
faa43fdc92
commit
0990c2224c
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;")) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue