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
This commit is contained in:
parent
a7d3a4a7f8
commit
7805be1b3a
|
@ -95,6 +95,10 @@ int handle_init_command(struct command_context_s *cmd_ctx, char *cmd, char **arg
|
||||||
|
|
||||||
atexit(exit_handler);
|
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)
|
if (jtag_init(cmd_ctx) != ERROR_OK)
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
LOG_DEBUG("jtag init complete");
|
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;
|
return ERROR_FAIL;
|
||||||
LOG_DEBUG("target init complete");
|
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)
|
if (flash_init_drivers(cmd_ctx) != ERROR_OK)
|
||||||
return ERROR_FAIL;
|
return ERROR_FAIL;
|
||||||
LOG_DEBUG("flash init complete");
|
LOG_DEBUG("flash init complete");
|
||||||
|
|
|
@ -264,7 +264,9 @@ int target_process_reset(struct command_context_s *cmd_ctx)
|
||||||
if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
|
if ((retval = jtag_init_reset(cmd_ctx)) != ERROR_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
|
if ((retval = target_examine(cmd_ctx)) != ERROR_OK)
|
||||||
|
return retval;
|
||||||
|
|
||||||
/* prepare reset_halt where necessary */
|
/* prepare reset_halt where necessary */
|
||||||
target = targets;
|
target = targets;
|
||||||
while (target)
|
while (target)
|
||||||
|
@ -428,12 +430,36 @@ static int default_mmu(struct target_s *target, int *enabled)
|
||||||
return ERROR_OK;
|
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)
|
int target_init(struct command_context_s *cmd_ctx)
|
||||||
{
|
{
|
||||||
target_t *target = targets;
|
target_t *target = targets;
|
||||||
|
|
||||||
while (target)
|
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)
|
if (target->type->init_target(cmd_ctx, target) != ERROR_OK)
|
||||||
{
|
{
|
||||||
LOG_ERROR("target '%s' init failed", target->type->name);
|
LOG_ERROR("target '%s' init failed", target->type->name);
|
||||||
|
|
|
@ -98,6 +98,8 @@ typedef struct working_area_s
|
||||||
typedef struct target_type_s
|
typedef struct target_type_s
|
||||||
{
|
{
|
||||||
char *name;
|
char *name;
|
||||||
|
|
||||||
|
int examined;
|
||||||
|
|
||||||
/* poll current target status */
|
/* poll current target status */
|
||||||
int (*poll)(struct target_s *target);
|
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 (*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);
|
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 (*init_target)(struct command_context_s *cmd_ctx, struct target_s *target);
|
||||||
int (*quit)(void);
|
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_commands(struct command_context_s *cmd_ctx);
|
||||||
extern int target_register_user_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(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 handle_target(void *priv);
|
||||||
extern int target_process_reset(struct command_context_s *cmd_ctx);
|
extern int target_process_reset(struct command_context_s *cmd_ctx);
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ target_script 0 reset event/xba_revA3.script
|
||||||
run_and_halt_time 0 100
|
run_and_halt_time 0 100
|
||||||
|
|
||||||
flash bank cfi 0x50000000 0x400000 2 2 0
|
flash bank cfi 0x50000000 0x400000 2 2 0
|
||||||
working_area 0 0x20010000 0x8000 nobackup
|
working_area 0 0x20010000 0x8060 nobackup
|
||||||
|
|
||||||
# halt target
|
# halt target
|
||||||
wait_halt
|
wait_halt
|
||||||
|
|
Loading…
Reference in New Issue