aboutsummaryrefslogtreecommitdiff
path: root/src/arm7tdmi.c
diff options
context:
space:
mode:
authorGareth McMullin2012-11-03 16:42:46 +1300
committerGareth McMullin2012-11-03 16:42:46 +1300
commit0990c2224c201a1f42533a754c9ef3b548335406 (patch)
tree3f0da0778087db8cd0c8471525b05461d7afef3d /src/arm7tdmi.c
parentfaa43fdc92f6d0749c51522b777d678c2a4fe8f4 (diff)
Allow target attachment to timeout and report failure.
This is needed for if the target device is held in reset.
Diffstat (limited to 'src/arm7tdmi.c')
-rw-r--r--src/arm7tdmi.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/src/arm7tdmi.c b/src/arm7tdmi.c
index e5f7acb..805f995 100644
--- a/src/arm7tdmi.c
+++ b/src/arm7tdmi.c
@@ -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_write(struct target_s *target, const void *data);
static void arm7_halt_request(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)
{
@@ -242,7 +242,7 @@ static int arm7_halt_wait(struct target_s *target)
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;
@@ -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);
}
-static void arm7_attach(struct target_s *target)
+static bool arm7_attach(struct target_s *target)
{
+ int tries = 0;
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)