summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-04-11 06:52:52 +0000
committeroharboe <oharboe@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2008-04-11 06:52:52 +0000
commit7805be1b3a8f65aff9a861fd8ca62518143f1524 (patch)
tree781e28e65d50b238decb01f06fac51b9d609c236 /src
parenta7d3a4a7f8a0def61ed3caa7fb461b82b2d6ade1 (diff)
downloadopenocd+libswd-7805be1b3a8f65aff9a861fd8ca62518143f1524.tar.gz
openocd+libswd-7805be1b3a8f65aff9a861fd8ca62518143f1524.tar.bz2
openocd+libswd-7805be1b3a8f65aff9a861fd8ca62518143f1524.tar.xz
openocd+libswd-7805be1b3a8f65aff9a861fd8ca62518143f1524.zip
added target->type->examine(). Eventually this will allow for bringing up telnet/gdb *before* jtag chain has been validated + it might fix some reset halt problems seen as examine() needs to run after TRST has been asserted.
git-svn-id: svn://svn.berlios.de/openocd/trunk@563 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src')
-rw-r--r--src/openocd.c8
-rw-r--r--src/target/target.c28
-rw-r--r--src/target/target.h16
-rw-r--r--src/target/target/xba_revA3.cfg2
4 files changed, 51 insertions, 3 deletions
diff --git a/src/openocd.c b/src/openocd.c
index 71963cb9..3c7816ea 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -95,6 +95,10 @@ int handle_init_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
atexit(exit_handler);
+ /* FIX!!! this should happen *after* target_init(), but
+ * for now there are target initialisations that talk
+ * to JTAG whereas that *should* happen during target_examine()
+ */
if (jtag_init(cmd_ctx) != ERROR_OK)
return ERROR_FAIL;
LOG_DEBUG("jtag init complete");
@@ -103,6 +107,10 @@ int handle_init_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
return ERROR_FAIL;
LOG_DEBUG("target init complete");
+ if (target_examine(cmd_ctx) != ERROR_OK)
+ return ERROR_FAIL;
+ LOG_DEBUG("target examine complete");
+
if (flash_init_drivers(cmd_ctx) != ERROR_OK)
return ERROR_FAIL;
LOG_DEBUG("flash init complete");
diff --git a/src/target/target.c b/src/target/target.c
index ce411b45..5850fada 100644
--- a/src/target/target.c
+++ b/src/target/target.c
@@ -264,7 +264,9 @@ int target_process_reset(struct command_context_s *cmd_ctx)
if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
return retval;
-
+ if ((retval = target_examine(cmd_ctx)) != ERROR_OK)
+ return retval;
+
/* prepare reset_halt where necessary */
target = targets;
while (target)
@@ -428,12 +430,36 @@ static int default_mmu(struct target_s *target, int *enabled)
return ERROR_OK;
}
+static int default_examine(struct command_context_s *cmd_ctx, struct target_s *target)
+{
+ return ERROR_OK;
+}
+
+
+int target_examine(struct command_context_s *cmd_ctx)
+{
+ int retval = ERROR_OK;
+ target_t *target = targets;
+ while (target)
+ {
+ if ((retval = target->type->examine(cmd_ctx, target))!=ERROR_OK)
+ return retval;
+ target = target->next;
+ }
+ return retval;
+}
int target_init(struct command_context_s *cmd_ctx)
{
target_t *target = targets;
while (target)
{
+ target->type->examined = 0;
+ if (target->type->examine == NULL)
+ {
+ target->type->examine = default_examine;
+ }
+
if (target->type->init_target(cmd_ctx, target) != ERROR_OK)
{
LOG_ERROR("target '%s' init failed", target->type->name);
diff --git a/src/target/target.h b/src/target/target.h
index d95c4aa7..6480bc5b 100644
--- a/src/target/target.h
+++ b/src/target/target.h
@@ -98,6 +98,8 @@ typedef struct working_area_s
typedef struct target_type_s
{
char *name;
+
+ int examined;
/* poll current target status */
int (*poll)(struct target_s *target);
@@ -168,6 +170,18 @@ typedef struct target_type_s
int (*register_commands)(struct command_context_s *cmd_ctx);
int (*target_command)(struct command_context_s *cmd_ctx, char *cmd, char **args, int argc, struct target_s *target);
+ /* invoked after JTAG chain has been examined & validated. During
+ * this stage the target is examined and any additional setup is
+ * performed.
+ *
+ * invoked every time after the jtag chain has been validated/examined
+ */
+ int (*examine)(struct command_context_s *cmd_ctx, struct target_s *target);
+ /* Set up structures for target.
+ *
+ * It is illegal to talk to the target at this stage as this fn is invoked
+ * before the JTAG chain has been examined/verified
+ */
int (*init_target)(struct command_context_s *cmd_ctx, struct target_s *target);
int (*quit)(void);
@@ -236,7 +250,7 @@ typedef struct target_timer_callback_s
extern int target_register_commands(struct command_context_s *cmd_ctx);
extern int target_register_user_commands(struct command_context_s *cmd_ctx);
extern int target_init(struct command_context_s *cmd_ctx);
-extern int target_init_reset(struct command_context_s *cmd_ctx);
+extern int target_examine(struct command_context_s *cmd_ctx);
extern int handle_target(void *priv);
extern int target_process_reset(struct command_context_s *cmd_ctx);
diff --git a/src/target/target/xba_revA3.cfg b/src/target/target/xba_revA3.cfg
index 0c73e8c1..5918ea6e 100644
--- a/src/target/target/xba_revA3.cfg
+++ b/src/target/target/xba_revA3.cfg
@@ -19,7 +19,7 @@ target_script 0 reset event/xba_revA3.script
run_and_halt_time 0 100
flash bank cfi 0x50000000 0x400000 2 2 0
-working_area 0 0x20010000 0x8000 nobackup
+working_area 0 0x20010000 0x8060 nobackup
# halt target
wait_halt