Removed target->reset_mode, no longer used
git-svn-id: svn://svn.berlios.de/openocd/trunk@976 b42882b7-edfa-0310-969c-e2dbd0fdcd60
This commit is contained in:
parent
ef1cfb2394
commit
5ac8036b7f
|
@ -0,0 +1,427 @@
|
|||
To be incorporated in openocd.texi...
|
||||
|
||||
|
||||
==
|
||||
Current as of Aug 30, 2008 - Duane Ellis
|
||||
==
|
||||
|
||||
===================================================
|
||||
Overview - History
|
||||
|
||||
Pre "tcl" - many commands in openocd where implimented as C
|
||||
functions. Post "tcl" (Jim-Tcl to be more exact, June 2008 ...) TCL
|
||||
became a bigger part of OpenOCD.
|
||||
|
||||
One of the biggest changes is the introduction of 'target specific'
|
||||
commands. When every you create a target, a special command name is
|
||||
created specifically for that target.
|
||||
|
||||
For example - in Tcl/Tk - if you create a button (or any other
|
||||
screen object) you can specify various "button configuration
|
||||
parameters". One of those parameters is the "object cmd/name"
|
||||
[ In TK - this is refered to as the object path ]. Later you
|
||||
can use that 'path' as a command to modify the button, for
|
||||
example to make it "grey", or change the color.
|
||||
|
||||
In effect, the "path" function is an 'object oriented command'
|
||||
|
||||
The TCL change in OpenOCD follows the same principle, you create a
|
||||
target, and a specific "targetname" command is created.
|
||||
|
||||
There are two methods of creating a target.
|
||||
|
||||
(1) Depricated: Using the old syntax Target names are autogenerated
|
||||
as: "target0", "target1" etc..
|
||||
|
||||
(2) Using the new syntax, you can specify the name of the target.
|
||||
|
||||
As most users will have a single JTAG target, and by default the
|
||||
command name will probably default to "target0", thus for reasons of
|
||||
simplicity the instructions below use the name 'target0'
|
||||
|
||||
Overview - History *END*
|
||||
==================================================
|
||||
|
||||
OpenOCD has the following 'target' or 'target-like' commands.
|
||||
|
||||
(1) targets -(plural) lists all known targets and a little bit of
|
||||
information about each target, most importantly the target
|
||||
*COMMAND*NAME* (it also lists the target number)
|
||||
|
||||
(2) target -(singular) used to create, configure list, etc the targets
|
||||
|
||||
(3) target0 - the command object for the first target.
|
||||
Unless you specified another name.
|
||||
|
||||
===================================================
|
||||
|
||||
The "targets" (plural, 1 above) command has 2 functions.
|
||||
|
||||
With a parameter, you can change the current command line target.
|
||||
|
||||
NOTE: "with a parameter" is really only useful with 'multiple
|
||||
jtag targets' not something you normally encounter (ie: If you
|
||||
had 2 arm chips - sharing the same JTAG chain)
|
||||
|
||||
# using a target name..
|
||||
(gdb) mon targets target0
|
||||
# or a target by number.
|
||||
(gdb) mon targets 3
|
||||
|
||||
Or - plain, without any parameter lists targets, for example:
|
||||
|
||||
(gdb) mon targets
|
||||
CmdName Type Endian ChainPos State
|
||||
-- ---------- ---------- ---------- -------- ----------
|
||||
0: target0 arm7tdmi little 0 halted
|
||||
|
||||
This shows:
|
||||
(a) in this example, a single target
|
||||
(b) target number 0 (1st column)
|
||||
(c) the 'object name' is target0 (the default name)
|
||||
(d) it is an arm7tdmi
|
||||
(e) little endian
|
||||
(f) The position in the JTAG chain
|
||||
(g) and is currently halted.
|
||||
|
||||
====================================================
|
||||
|
||||
The "target" (singular, 2 above) command has the following options:
|
||||
|
||||
target create CMDNAME TYPE ... config options ...
|
||||
argv[0] = 'target'
|
||||
argv[1] = 'create'
|
||||
argv[2] = the 'object command'
|
||||
(normally, target0, see (3) above)
|
||||
argv[3] = the target type, ie: arm7tdmi
|
||||
argv[4..N] = configuration parameters
|
||||
|
||||
target types
|
||||
Lists all supported target types.
|
||||
ie: arm7tdmi, xscale, fericon, cortex-m3
|
||||
|
||||
The result TCL List of all known target types (and is human
|
||||
readable)
|
||||
|
||||
target names
|
||||
|
||||
Returns a TCL list of all known target commands (and is
|
||||
human readable)
|
||||
|
||||
Example:
|
||||
foreach t [target names] {
|
||||
puts [format "Target: %s\n" $t]
|
||||
}
|
||||
|
||||
|
||||
target current
|
||||
|
||||
Returns the TCL command name of the current target.
|
||||
|
||||
Example:
|
||||
set ct [target current]
|
||||
set t [$ct cget -type]
|
||||
|
||||
puts "Current target name is: $ct, and is a: $t"
|
||||
|
||||
|
||||
target number <VALUE>
|
||||
|
||||
Returns the TCL command name of the specified target.
|
||||
For example
|
||||
|
||||
set thename [target number $x]
|
||||
puts [format "Target %d is: %s\n" $x $thename]
|
||||
|
||||
For instance, assuming the defaults
|
||||
|
||||
target number 0
|
||||
|
||||
Would return 'target0' (or whatever you called it)
|
||||
|
||||
target count
|
||||
|
||||
Returns the larget+1 target number.
|
||||
For example:
|
||||
|
||||
set c [target count]
|
||||
for { set x 0 } { $x < $c } { incr x } {
|
||||
# Assuming you have this function..
|
||||
print_target_details $x
|
||||
}
|
||||
|
||||
====================================================
|
||||
|
||||
"target0" - (#3 above) the "Target Object" command.
|
||||
|
||||
Once a target is 'created' a command object by that targets name is
|
||||
created, for example
|
||||
|
||||
target create BiGRed arm7tdmi -endian little -chain-position 3
|
||||
|
||||
Would create a [case sensative] "command" BiGRed
|
||||
|
||||
If you use the old [deprecated] syntax, the name is automatically
|
||||
generated and is in the form:
|
||||
|
||||
target0, target1, target2, target3, .... etc.
|
||||
|
||||
====================================================
|
||||
|
||||
** Target CREATE, CONFIGURE and CGET options **
|
||||
|
||||
The commands:
|
||||
|
||||
target create CMDNAME TYPE [configure-options]
|
||||
CMDNAME configure [configure-options]
|
||||
CMDNAME cget [configure-options]
|
||||
|
||||
In the 'create' case, one is creating the target and can specify any
|
||||
number of configuration parameters.
|
||||
|
||||
In the 'CMDNAME cget' case, the goal is to query the target for a
|
||||
specific configuration option.
|
||||
|
||||
In the 'CMDNAME configure' case, one can change the setting.
|
||||
[Not all things can, or should be changed]
|
||||
|
||||
In the above, the "default" name target0 is 'target0'
|
||||
|
||||
Example:
|
||||
|
||||
From the (gdb) prompt, one can type this:
|
||||
|
||||
(gdb) mon target0 configure -endian big
|
||||
|
||||
And change target0 to 'big-endian'. This is a contrived example,
|
||||
specifically for this document - don't expect changing endian
|
||||
'mid-operation' to work you should set the endian at creation.
|
||||
|
||||
Known options [30/august/2008] are:
|
||||
|
||||
[Manditory 'create' Options]
|
||||
-type arm7tdmi|arm720|etc ...
|
||||
-chain-position NUMBER
|
||||
-endian ENDIAN
|
||||
|
||||
Optional
|
||||
|
||||
-event EVENTNAME "tcl-action"
|
||||
-reset RESETACTION
|
||||
-work-area-virt ADDR
|
||||
-work-area-phys ADDR
|
||||
-work-area-size ADDR
|
||||
-work-area-backup BOOLEAN
|
||||
|
||||
[Hint: To get a list of avaialable options, try this]
|
||||
|
||||
(gdb) mon target0 cget -BLAHBLAHBLAH
|
||||
|
||||
the abov causes an error - and a helpful list of valid options.
|
||||
|
||||
==================================================
|
||||
** Example Target Configure Query **
|
||||
|
||||
One can query any of the above options at run time, for example:
|
||||
|
||||
(gdb) mon target0 cget -OPTION [param]
|
||||
|
||||
Example TCL script
|
||||
|
||||
# For all targets...
|
||||
set c [target count]
|
||||
for { set x 0 } { $x < $c } { incr x ] {
|
||||
set n [target number $x]
|
||||
set t [$n cget -type]
|
||||
set e [$n cget -endian]
|
||||
puts [format "%d: %s, %s, endian: %s\n" $x $n $t $n]
|
||||
}
|
||||
|
||||
Might produce:
|
||||
0: pic32chip, mips_m4k, endain: little
|
||||
1: arm7, arm7tdmi, endian: big
|
||||
2: blackfin, bf534, endian: little
|
||||
|
||||
Notice the above example is not target0, target1, target2 Why? Because
|
||||
in this contrived multi-target example - more human understandable
|
||||
target names might be helpful.
|
||||
|
||||
For example these two are the same:
|
||||
|
||||
(gdb) mon blackfin configure -event FOO {puts "Hi mom"}
|
||||
|
||||
or:
|
||||
(gdb) mon [target number 2] configure -event FOO {puts "Hi mom"}
|
||||
|
||||
In the second case, we use [] to get the command name of target #2, in
|
||||
this contrived example - it is "blackfin"
|
||||
|
||||
====================================================
|
||||
** TWO Important Configure Options Are: **
|
||||
|
||||
Two important configuration options are:
|
||||
|
||||
"-event" and "-reset"
|
||||
|
||||
The "-reset" option specifies what should happen when the chip is
|
||||
reset, for example should it 'halt', 're-init', or what.
|
||||
|
||||
The "-event" option less you specifiy a TCL command to occur when a
|
||||
specific event occurs.
|
||||
|
||||
====================================================
|
||||
** Target Events * Overview **
|
||||
|
||||
At various points in time - certian 'target' events happen. You can
|
||||
create a custom event action to occur at that time.
|
||||
|
||||
For example - after reset, the PLLs and CLOCKs may need to be
|
||||
reconfigured, or perhaps the SDRAM needs to be re-initialized
|
||||
|
||||
Often the easiest way to do that is to create a simple script file
|
||||
containing the series of (mww [poke memory]) commands you would type
|
||||
by hand, to reconfigure the target clocks. You could specify the
|
||||
"event action" like this:
|
||||
|
||||
(gdb) mon target0 configure -event reset-init "script cfg.clocks"
|
||||
|
||||
In the above example, when the event "reset-init" occurs, the
|
||||
"action-string" will be evaluated as if you typed it at the console
|
||||
|
||||
Option1 -
|
||||
|
||||
The simple approach (above) is to create a script file with
|
||||
lots of "mww" (memory write word) commands to configure your
|
||||
targets clocks and/or external memory.
|
||||
|
||||
Option2 -
|
||||
|
||||
You can instead create a fancy Tcl procedure and invoke that
|
||||
procedure instead of sourcing a file.
|
||||
|
||||
[Infact, "script" is a TCL procedure that loads a file]
|
||||
|
||||
==================================================
|
||||
|
||||
** Target Events * Details **
|
||||
|
||||
There are many events one could use, to get a current list of events
|
||||
type the following invalid command, you'll get a helpful "runtime
|
||||
error" message, see below: [list valid as of 30/august/2008]
|
||||
|
||||
(gdb) mon target0 cget -event FAFA
|
||||
|
||||
Runtime error, file "../../../openocd23/src/helper/command.c", line 433:
|
||||
-event: Unknown: FAFA, try one of: old-pre_reset,
|
||||
old-gdb_program_config, old-post_reset, halted,
|
||||
resumed, resume-start, resume-end, reset-start,
|
||||
reset-assert-pre, reset-assert-post,
|
||||
reset-deassert-pre, reset-deassert-post,
|
||||
reset-halt-pre, reset-halt-post, reset-wait-pre,
|
||||
reset-wait-post, reset-init, reset-end,
|
||||
examine-start, examine-end, debug-halted,
|
||||
debug-resumed, gdb-attach, gdb-detach,
|
||||
gdb-flash-write-start, gdb-flash-write-end,
|
||||
gdb-flash-erase-start, gdb-flash-erase-end,
|
||||
resume-start, resume-ok, or resume-end
|
||||
|
||||
NOTE:
|
||||
|
||||
The event-names "old-*" are deprecated and exist only to help old
|
||||
scripts continue to function, and the old "target_script" command
|
||||
to work. Please do not rely on them.
|
||||
|
||||
These are some other important names.
|
||||
|
||||
gdb-flash-erase-start
|
||||
gdb-flash-erase-end
|
||||
gdb-flash-write-start
|
||||
gdb-flash-write-end
|
||||
|
||||
These occur when GDB/OpenOCD attempts to erase & program the FLASH
|
||||
chip via GDB.
|
||||
|
||||
For example - some PCBs may have a simple GPIO pin that acts like
|
||||
a "flash write protect" you might need to write a script that
|
||||
disables "write protect"
|
||||
|
||||
==================================================
|
||||
|
||||
** How to get a list of current event actions **
|
||||
|
||||
To get a list of current 'event actions', type the following command:
|
||||
|
||||
(gdb) mon target0 eventlist
|
||||
|
||||
Event actions for target (0) target0
|
||||
|
||||
Event | Body
|
||||
------------------------- | ----------------------------------------
|
||||
old-post_reset | script event/sam7x256_reset.script
|
||||
***END***
|
||||
|
||||
Here is a simple example for all targets:
|
||||
|
||||
(gdb) mon foreach x [target names] { $x eventlist }
|
||||
|
||||
The above uses some TCL tricks:
|
||||
|
||||
(a) foreach VARIABLE LIST BODY
|
||||
|
||||
(b) to generate the list, we use [target names]
|
||||
|
||||
(c) the BODY, contains $x - the loop variable
|
||||
and expands to the target specific name
|
||||
|
||||
====================================================
|
||||
|
||||
Recalling the earlier discussion - the "object command" there are
|
||||
other things you can do besides "configure" the target.
|
||||
|
||||
Note: Many of these commands exist as "global" commands, and they also
|
||||
exist as target specific commands.
|
||||
|
||||
For example, the "mww" (memory write word) operates on the current target
|
||||
if you have more then 1 target, you must switch
|
||||
|
||||
In contrast to the normal commands, these commands operate on the
|
||||
specific target. For example, the command "mww" writes data to the
|
||||
*current* command line target.
|
||||
|
||||
Often, you have only a single target - but if you have multiple
|
||||
targets (ie: a PIC32 and an at91sam7 - your reset-init scripts might
|
||||
get a bit more complicated, ie: you must specify which of the two
|
||||
chips you want to write to. Writing 'pic32' clock configuration to an
|
||||
at91sam7 does not work)
|
||||
|
||||
The commands are: [as of 30/august/2008]
|
||||
|
||||
TNAME mww ADDRESS VALUE
|
||||
TNAME mwh ADDRESS VALUE
|
||||
TNAME mwb ADDRESS VALUE
|
||||
Write(poke): 32, 16, 8bit values to memory.
|
||||
|
||||
TNAME mdw ADDRESS VALUE
|
||||
TNAME mdh ADDRESS VALUE
|
||||
TNAME mdb ADDRESS VALUE
|
||||
Human 'hexdump' with ascii 32, 16, 8bit values
|
||||
|
||||
TNAME mem2array [see mem2array command]
|
||||
TNAME array2mem [see array2mem command]
|
||||
|
||||
TNAME curstate
|
||||
Returns the current state of the target.
|
||||
|
||||
|
||||
TNAME examine
|
||||
See 'advanced target reset'
|
||||
TNAME poll
|
||||
See 'advanced target reset'
|
||||
TNAME reset assert
|
||||
See 'advanced target reset'
|
||||
TNAME reset deassert
|
||||
See 'advanced target reset'
|
||||
TNAME halt
|
||||
See 'advanced target reset'
|
||||
TNAME waitstate STATENAME
|
||||
See 'advanced target reset'
|
|
@ -160,7 +160,7 @@ const Jim_Nvp nvp_target_event[] = {
|
|||
{ .value = TARGET_EVENT_OLD_gdb_program_config , .name = "old-gdb_program_config" },
|
||||
{ .value = TARGET_EVENT_OLD_post_reset , .name = "old-post_reset" },
|
||||
{ .value = TARGET_EVENT_OLD_pre_resume , .name = "old-pre_resume" },
|
||||
|
||||
|
||||
|
||||
{ .value = TARGET_EVENT_HALTED, .name = "halted" },
|
||||
{ .value = TARGET_EVENT_RESUMED, .name = "resumed" },
|
||||
|
@ -188,7 +188,7 @@ const Jim_Nvp nvp_target_event[] = {
|
|||
|
||||
{ .value = TARGET_EVENT_EXAMINE_START, .name = "examine-start" },
|
||||
{ .value = TARGET_EVENT_EXAMINE_START, .name = "examine-end" },
|
||||
|
||||
|
||||
|
||||
{ .value = TARGET_EVENT_DEBUG_HALTED, .name = "debug-halted" },
|
||||
{ .value = TARGET_EVENT_DEBUG_RESUMED, .name = "debug-resumed" },
|
||||
|
@ -342,7 +342,7 @@ target_t* get_target_by_num(int num)
|
|||
while (target){
|
||||
if( target->target_number == num ){
|
||||
return target;
|
||||
}
|
||||
}
|
||||
target = target->next;
|
||||
}
|
||||
|
||||
|
@ -758,8 +758,8 @@ int target_call_event_callbacks(target_t *target, enum target_event event)
|
|||
target_event_callback_t *callback = target_event_callbacks;
|
||||
target_event_callback_t *next_callback;
|
||||
|
||||
LOG_DEBUG("target event %i (%s)",
|
||||
event,
|
||||
LOG_DEBUG("target event %i (%s)",
|
||||
event,
|
||||
Jim_Nvp_value2name_simple( nvp_target_event, event )->name );
|
||||
|
||||
target_handle_event( target, event );
|
||||
|
@ -1000,7 +1000,7 @@ int target_arch_state(struct target_s *target)
|
|||
return ERROR_OK;
|
||||
}
|
||||
|
||||
LOG_USER("target state: %s",
|
||||
LOG_USER("target state: %s",
|
||||
Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name);
|
||||
|
||||
if (target->state!=TARGET_HALTED)
|
||||
|
@ -1394,18 +1394,18 @@ int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **
|
|||
if( 0 == strcmp( args[0], target->cmd_name ) ){
|
||||
/* MATCH */
|
||||
goto Match;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
/* no match, try as number */
|
||||
|
||||
|
||||
int num = strtoul(args[0], &cp, 0 );
|
||||
if( *cp != 0 ){
|
||||
/* then it was not a number */
|
||||
command_print( cmd_ctx, "Target: %s unknown, try one of:\n", args[0] );
|
||||
goto DumpTargets;
|
||||
}
|
||||
|
||||
|
||||
target = get_target_by_num( num );
|
||||
if( target == NULL ){
|
||||
command_print(cmd_ctx,"Target: %s is unknown, try one of:\n", args[0] );
|
||||
|
@ -1422,11 +1422,11 @@ int handle_targets_command(struct command_context_s *cmd_ctx, char *cmd, char **
|
|||
while (target)
|
||||
{
|
||||
/* XX: abcdefghij abcdefghij abcdefghij abcdefghij */
|
||||
command_print(cmd_ctx, "%2d: %-10s %-10s %-10s %8d %s",
|
||||
command_print(cmd_ctx, "%2d: %-10s %-10s %-10s %8d %s",
|
||||
target->target_number,
|
||||
target->cmd_name,
|
||||
target->type->name,
|
||||
Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness )->name,
|
||||
target->type->name,
|
||||
Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness )->name,
|
||||
target->chain_position,
|
||||
Jim_Nvp_value2name_simple( nvp_target_state, target->state )->name );
|
||||
target = target->next;
|
||||
|
@ -1689,14 +1689,14 @@ int target_wait_state(target_t *target, enum target_state state, int ms)
|
|||
if (once)
|
||||
{
|
||||
once=0;
|
||||
LOG_DEBUG("waiting for target %s...",
|
||||
LOG_DEBUG("waiting for target %s...",
|
||||
Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
|
||||
}
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
if ((now.tv_sec > timeout.tv_sec) || ((now.tv_sec == timeout.tv_sec) && (now.tv_usec >= timeout.tv_usec)))
|
||||
{
|
||||
LOG_ERROR("timed out while waiting for target %s",
|
||||
LOG_ERROR("timed out while waiting for target %s",
|
||||
Jim_Nvp_value2name_simple(nvp_target_state,state)->name);
|
||||
return ERROR_FAIL;
|
||||
}
|
||||
|
@ -2801,7 +2801,7 @@ static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
|
|||
{
|
||||
command_context_t *context;
|
||||
target_t *target;
|
||||
|
||||
|
||||
context = Jim_GetAssocData(interp, "context");
|
||||
if (context == NULL){
|
||||
LOG_ERROR("array2mem: no command context");
|
||||
|
@ -2812,10 +2812,10 @@ static int jim_array2mem(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
|
|||
LOG_ERROR("array2mem: no current target");
|
||||
return JIM_ERR;
|
||||
}
|
||||
|
||||
|
||||
return target_array2mem( interp,target, argc, argv );
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int target_array2mem(Jim_Interp *interp, target_t *target, int argc, Jim_Obj *const *argv)
|
||||
{
|
||||
|
@ -2955,7 +2955,7 @@ target_all_handle_event( enum target_event e )
|
|||
target_t *target;
|
||||
|
||||
|
||||
LOG_DEBUG( "**all*targets: event: %d, %s",
|
||||
LOG_DEBUG( "**all*targets: event: %d, %s",
|
||||
e,
|
||||
Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
|
||||
|
||||
|
@ -2990,7 +2990,7 @@ target_handle_event( target_t *target, enum target_event e )
|
|||
teap = teap->next;
|
||||
}
|
||||
if( !done ){
|
||||
LOG_DEBUG( "event: %d %s - no action",
|
||||
LOG_DEBUG( "event: %d %s - no action",
|
||||
e,
|
||||
Jim_Nvp_value2name_simple( nvp_target_event, e )->name );
|
||||
}
|
||||
|
@ -2998,7 +2998,7 @@ target_handle_event( target_t *target, enum target_event e )
|
|||
|
||||
enum target_cfg_param {
|
||||
TCFG_TYPE,
|
||||
TCFG_EVENT,
|
||||
TCFG_EVENT,
|
||||
TCFG_RESET,
|
||||
TCFG_WORK_AREA_VIRT,
|
||||
TCFG_WORK_AREA_PHYS,
|
||||
|
@ -3021,10 +3021,10 @@ static Jim_Nvp nvp_config_opts[] = {
|
|||
{ .name = "-endian" , .value = TCFG_ENDIAN },
|
||||
{ .name = "-variant", .value = TCFG_VARIANT },
|
||||
{ .name = "-chain-position", .value = TCFG_CHAIN_POSITION },
|
||||
|
||||
|
||||
{ .name = NULL, .value = -1 }
|
||||
};
|
||||
|
||||
|
||||
|
||||
static int
|
||||
target_configure( Jim_GetOptInfo *goi,
|
||||
|
@ -3093,7 +3093,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
if( goi->argc == 0 ){
|
||||
Jim_WrongNumArgs( goi->interp, goi->argc, goi->argv, "-event ?event-name? ?EVENT-BODY?");
|
||||
return JIM_ERR;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if( goi->argc != 0 ){
|
||||
Jim_WrongNumArgs(goi->interp, goi->argc, goi->argv, "-event ?event-name?");
|
||||
|
@ -3101,10 +3101,10 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
|
||||
{
|
||||
target_event_action_t *teap;
|
||||
|
||||
|
||||
teap = target->event_action;
|
||||
/* replace existing? */
|
||||
while( teap ){
|
||||
|
@ -3113,7 +3113,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
}
|
||||
teap = teap->next;
|
||||
}
|
||||
|
||||
|
||||
if( goi->isconfigure ){
|
||||
if( teap == NULL ){
|
||||
/* create new */
|
||||
|
@ -3126,7 +3126,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
}
|
||||
teap->body = Jim_DuplicateObj( goi->interp, o );
|
||||
/*
|
||||
* FIXME:
|
||||
* FIXME:
|
||||
* Tcl/TK - "tk events" have a nice feature.
|
||||
* See the "BIND" command.
|
||||
* We should support that here.
|
||||
|
@ -3153,32 +3153,6 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
/* loop for more */
|
||||
break;
|
||||
|
||||
case TCFG_RESET:
|
||||
if( goi->isconfigure ){
|
||||
e = Jim_GetOpt_Nvp( goi, nvp_reset_modes, &n );
|
||||
if( e != JIM_OK ){
|
||||
Jim_GetOpt_NvpUnknown( goi, nvp_reset_modes, 1 );
|
||||
return e;
|
||||
}
|
||||
if( n->value == RESET_UNKNOWN ){
|
||||
Jim_SetResultString( interp, "'unknown' is not a valid selection",-1);
|
||||
return JIM_ERR;
|
||||
}
|
||||
target->reset_mode = n->value;
|
||||
} else {
|
||||
if( goi->argc != 0 ){
|
||||
goto no_params;
|
||||
}
|
||||
}
|
||||
n = Jim_Nvp_value2name_simple( nvp_reset_modes, target->reset_mode );
|
||||
if( n->name == NULL ){
|
||||
target->reset_mode = RESET_HALT;
|
||||
n = Jim_Nvp_value2name_simple( nvp_reset_modes, target->reset_mode );
|
||||
}
|
||||
Jim_SetResultString( goi->interp, n->name, -1 );
|
||||
/* loop for more */
|
||||
break;
|
||||
|
||||
case TCFG_WORK_AREA_VIRT:
|
||||
if( goi->isconfigure ){
|
||||
target_free_all_working_areas(target);
|
||||
|
@ -3191,11 +3165,11 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
if( goi->argc != 0 ){
|
||||
goto no_params;
|
||||
}
|
||||
}
|
||||
}
|
||||
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_virt ) );
|
||||
/* loop for more */
|
||||
break;
|
||||
|
||||
|
||||
case TCFG_WORK_AREA_PHYS:
|
||||
if( goi->isconfigure ){
|
||||
target_free_all_working_areas(target);
|
||||
|
@ -3208,7 +3182,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
if( goi->argc != 0 ){
|
||||
goto no_params;
|
||||
}
|
||||
}
|
||||
}
|
||||
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_phys ) );
|
||||
/* loop for more */
|
||||
break;
|
||||
|
@ -3225,7 +3199,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
if( goi->argc != 0 ){
|
||||
goto no_params;
|
||||
}
|
||||
}
|
||||
}
|
||||
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
|
||||
/* loop for more */
|
||||
break;
|
||||
|
@ -3243,7 +3217,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
if( goi->argc != 0 ){
|
||||
goto no_params;
|
||||
}
|
||||
}
|
||||
}
|
||||
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->working_area_size ) );
|
||||
/* loop for more e*/
|
||||
break;
|
||||
|
@ -3265,7 +3239,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
if( n->name == NULL ){
|
||||
target->endianness = TARGET_LITTLE_ENDIAN;
|
||||
n = Jim_Nvp_value2name_simple( nvp_target_endian, target->endianness );
|
||||
}
|
||||
}
|
||||
Jim_SetResultString( goi->interp, n->name, -1 );
|
||||
/* loop for more */
|
||||
break;
|
||||
|
@ -3287,7 +3261,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
if( goi->argc != 0 ){
|
||||
goto no_params;
|
||||
}
|
||||
}
|
||||
}
|
||||
Jim_SetResultString( goi->interp, target->variant,-1 );
|
||||
/* loop for more */
|
||||
break;
|
||||
|
@ -3304,7 +3278,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
if( goi->argc != 0 ){
|
||||
goto no_params;
|
||||
}
|
||||
}
|
||||
}
|
||||
Jim_SetResult( interp, Jim_NewIntObj( goi->interp, target->chain_position ) );
|
||||
/* loop for more e*/
|
||||
break;
|
||||
|
@ -3318,7 +3292,7 @@ target_configure( Jim_GetOptInfo *goi,
|
|||
/** this is the 'tcl' handler for the target specific command */
|
||||
static int
|
||||
tcl_target_func( Jim_Interp *interp,
|
||||
int argc,
|
||||
int argc,
|
||||
Jim_Obj *const *argv )
|
||||
{
|
||||
Jim_GetOptInfo goi;
|
||||
|
@ -3334,12 +3308,12 @@ tcl_target_func( Jim_Interp *interp,
|
|||
enum {
|
||||
TS_CMD_CONFIGURE,
|
||||
TS_CMD_CGET,
|
||||
|
||||
|
||||
TS_CMD_MWW, TS_CMD_MWH, TS_CMD_MWB,
|
||||
TS_CMD_MDW, TS_CMD_MDH, TS_CMD_MDB,
|
||||
TS_CMD_MRW, TS_CMD_MRH, TS_CMD_MRB,
|
||||
TS_CMD_MEM2ARRAY, TS_CMD_ARRAY2MEM,
|
||||
TS_CMD_EXAMINE,
|
||||
TS_CMD_EXAMINE,
|
||||
TS_CMD_POLL,
|
||||
TS_CMD_RESET,
|
||||
TS_CMD_HALT,
|
||||
|
@ -3347,7 +3321,7 @@ tcl_target_func( Jim_Interp *interp,
|
|||
TS_CMD_EVENTLIST,
|
||||
TS_CMD_CURSTATE,
|
||||
};
|
||||
|
||||
|
||||
static const Jim_Nvp target_options[] = {
|
||||
{ .name = "configure", .value = TS_CMD_CONFIGURE },
|
||||
{ .name = "cget", .value = TS_CMD_CGET },
|
||||
|
@ -3412,7 +3386,7 @@ tcl_target_func( Jim_Interp *interp,
|
|||
* argv[2] = data
|
||||
* argv[3] = optional count.
|
||||
*/
|
||||
|
||||
|
||||
if( (goi.argc == 3) || (goi.argc == 4) ){
|
||||
/* all is well */
|
||||
} else {
|
||||
|
@ -3420,7 +3394,7 @@ tcl_target_func( Jim_Interp *interp,
|
|||
Jim_SetResult_sprintf( goi.interp, "expected: %s ADDR DATA [COUNT]", n->name );
|
||||
return JIM_ERR;
|
||||
}
|
||||
|
||||
|
||||
e = Jim_GetOpt_Wide( &goi, &a );
|
||||
if( e != JIM_OK ){
|
||||
goto mwx_error;
|
||||
|
@ -3438,7 +3412,7 @@ tcl_target_func( Jim_Interp *interp,
|
|||
} else {
|
||||
c = 1;
|
||||
}
|
||||
|
||||
|
||||
switch( n->value ){
|
||||
case TS_CMD_MWW:
|
||||
target_buffer_set_u32( target, target_buf, b );
|
||||
|
@ -3515,7 +3489,7 @@ tcl_target_func( Jim_Interp *interp,
|
|||
Jim_SetResult_sprintf( interp, "error reading target @ 0x%08lx", (int)(a) );
|
||||
return JIM_ERR;
|
||||
}
|
||||
|
||||
|
||||
Jim_fprintf( interp, interp->cookie_stdout, "0x%08x ", (int)(a) );
|
||||
switch( b ){
|
||||
case 4:
|
||||
|
@ -3549,7 +3523,7 @@ tcl_target_func( Jim_Interp *interp,
|
|||
}
|
||||
/* ascii-ify the bytes */
|
||||
for( x = 0 ; x < y ; x++ ){
|
||||
if( (target_buf[x] >= 0x20) &&
|
||||
if( (target_buf[x] >= 0x20) &&
|
||||
(target_buf[x] <= 0x7e) ){
|
||||
/* good */
|
||||
} else {
|
||||
|
@ -3633,7 +3607,7 @@ tcl_target_func( Jim_Interp *interp,
|
|||
target->type->halt( target );
|
||||
return JIM_OK;
|
||||
case TS_CMD_WAITSTATE:
|
||||
// params: <name> statename timeoutmsecs
|
||||
// params: <name> statename timeoutmsecs
|
||||
if( goi.argc != 2 ){
|
||||
Jim_SetResult_sprintf( goi.interp, "%s STATENAME TIMEOUTMSECS", n->name );
|
||||
return JIM_ERR;
|
||||
|
@ -3650,7 +3624,7 @@ tcl_target_func( Jim_Interp *interp,
|
|||
e = target_wait_state( target, n->value, a );
|
||||
if( e == ERROR_OK ){
|
||||
Jim_SetResult_sprintf( goi.interp,
|
||||
"target: %s wait %s fails %d",
|
||||
"target: %s wait %s fails %d",
|
||||
target->cmd_name,
|
||||
n->name,
|
||||
target_strerror_safe(e) );
|
||||
|
@ -3666,12 +3640,12 @@ tcl_target_func( Jim_Interp *interp,
|
|||
target_event_action_t *teap;
|
||||
teap = target->event_action;
|
||||
command_print( cmd_ctx, "Event actions for target (%d) %s\n",
|
||||
target->target_number,
|
||||
target->target_number,
|
||||
target->cmd_name );
|
||||
command_print( cmd_ctx, "%-25s | Body", "Event");
|
||||
command_print( cmd_ctx, "------------------------- | ----------------------------------------");
|
||||
while( teap ){
|
||||
command_print( cmd_ctx,
|
||||
command_print( cmd_ctx,
|
||||
"%-25s | %s",
|
||||
Jim_Nvp_value2name_simple( nvp_target_event, teap->event )->name,
|
||||
Jim_GetString( teap->body, NULL ) );
|
||||
|
@ -3685,7 +3659,7 @@ tcl_target_func( Jim_Interp *interp,
|
|||
Jim_WrongNumArgs( goi.interp, 0, argv, "[no parameters]");
|
||||
return JIM_ERR;
|
||||
}
|
||||
Jim_SetResultString( goi.interp,
|
||||
Jim_SetResultString( goi.interp,
|
||||
Jim_Nvp_value2name_simple(nvp_target_state,target->state)->name,-1);
|
||||
return JIM_OK;
|
||||
}
|
||||
|
@ -3695,8 +3669,8 @@ tcl_target_func( Jim_Interp *interp,
|
|||
|
||||
static int
|
||||
target_create( Jim_GetOptInfo *goi )
|
||||
{
|
||||
|
||||
{
|
||||
|
||||
Jim_Obj *new_cmd;
|
||||
Jim_Cmd *cmd;
|
||||
const char *cp;
|
||||
|
@ -3721,7 +3695,7 @@ target_create( Jim_GetOptInfo *goi )
|
|||
Jim_SetResult_sprintf(goi->interp, "Command/target: %s Exists", cp);
|
||||
return JIM_ERR;
|
||||
}
|
||||
|
||||
|
||||
/* TYPE */
|
||||
e = Jim_GetOpt_String( goi, &cp2, NULL );
|
||||
cp = cp2;
|
||||
|
@ -3736,12 +3710,12 @@ target_create( Jim_GetOptInfo *goi )
|
|||
Jim_SetResult_sprintf( goi->interp, "Unknown target type %s, try one of ", cp );
|
||||
for( x = 0 ; target_types[x] ; x++ ){
|
||||
if( target_types[x+1] ){
|
||||
Jim_AppendStrings( goi->interp,
|
||||
Jim_AppendStrings( goi->interp,
|
||||
Jim_GetResult(goi->interp),
|
||||
target_types[x]->name,
|
||||
", ", NULL);
|
||||
} else {
|
||||
Jim_AppendStrings( goi->interp,
|
||||
Jim_AppendStrings( goi->interp,
|
||||
Jim_GetResult(goi->interp),
|
||||
" or ",
|
||||
target_types[x]->name,NULL );
|
||||
|
@ -3750,7 +3724,7 @@ target_create( Jim_GetOptInfo *goi )
|
|||
return JIM_ERR;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Create it */
|
||||
target = calloc(1,sizeof(target_t));
|
||||
/* set target number */
|
||||
|
@ -3760,7 +3734,7 @@ target_create( Jim_GetOptInfo *goi )
|
|||
target->type = (target_type_t*)calloc(1,sizeof(target_type_t));
|
||||
|
||||
memcpy( target->type, target_types[x], sizeof(target_type_t));
|
||||
|
||||
|
||||
/* will be set by "-endian" */
|
||||
target->endianness = TARGET_ENDIAN_UNKNOWN;
|
||||
|
||||
|
@ -3768,7 +3742,7 @@ target_create( Jim_GetOptInfo *goi )
|
|||
target->working_area_size = 0x0;
|
||||
target->working_areas = NULL;
|
||||
target->backup_working_area = 0;
|
||||
|
||||
|
||||
target->state = TARGET_UNKNOWN;
|
||||
target->debug_reason = DBG_REASON_UNDEFINED;
|
||||
target->reg_cache = NULL;
|
||||
|
@ -3776,7 +3750,7 @@ target_create( Jim_GetOptInfo *goi )
|
|||
target->watchpoints = NULL;
|
||||
target->next = NULL;
|
||||
target->arch_info = NULL;
|
||||
|
||||
|
||||
/* initialize trace information */
|
||||
target->trace_info = malloc(sizeof(trace_t));
|
||||
target->trace_info->num_trace_points = 0;
|
||||
|
@ -3786,7 +3760,7 @@ target_create( Jim_GetOptInfo *goi )
|
|||
target->trace_info->trace_history = NULL;
|
||||
target->trace_info->trace_history_pos = 0;
|
||||
target->trace_info->trace_history_overflowed = 0;
|
||||
|
||||
|
||||
target->dbgmsg = NULL;
|
||||
target->dbg_msg_enabled = 0;
|
||||
|
||||
|
@ -3858,9 +3832,9 @@ jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
|
|||
TG_CMD_COUNT,
|
||||
};
|
||||
const char *target_cmds[] = {
|
||||
"create", "types", "names", "current", "number",
|
||||
"create", "types", "names", "current", "number",
|
||||
"count",
|
||||
NULL // terminate
|
||||
NULL // terminate
|
||||
};
|
||||
|
||||
LOG_DEBUG("Target command params:");
|
||||
|
@ -3887,9 +3861,9 @@ jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
|
|||
/* YES IT IS OLD SYNTAX */
|
||||
Jim_Obj *new_argv[10];
|
||||
int new_argc;
|
||||
|
||||
/* target_old_syntax
|
||||
*
|
||||
|
||||
/* target_old_syntax
|
||||
*
|
||||
* argv[0] typename (above)
|
||||
* argv[1] endian
|
||||
* argv[2] reset method, deprecated/ignored
|
||||
|
@ -3936,14 +3910,14 @@ jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
|
|||
* argv[8] = -variant
|
||||
* argv[9] = "somestring"
|
||||
*/
|
||||
|
||||
|
||||
/* don't let these be released */
|
||||
for( x = 0 ; x < new_argc ; x++ ){
|
||||
Jim_IncrRefCount( new_argv[x]);
|
||||
}
|
||||
/* call our self */
|
||||
LOG_DEBUG("Target OLD SYNTAX - converted to new syntax");
|
||||
|
||||
|
||||
r = jim_target( goi.interp, new_argc, new_argv );
|
||||
|
||||
/* release? these items */
|
||||
|
@ -3995,7 +3969,7 @@ jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
|
|||
Jim_NewStringObj( goi.interp, target->cmd_name, -1 ) );
|
||||
target = target->next;
|
||||
}
|
||||
return JIM_OK;
|
||||
return JIM_OK;
|
||||
case TG_CMD_CREATE:
|
||||
if( goi.argc < 3 ){
|
||||
Jim_WrongNumArgs( goi.interp, goi.argc, goi.argv, "?name ... config options ...");
|
||||
|
@ -4027,7 +4001,7 @@ jim_target( Jim_Interp *interp, int argc, Jim_Obj *const *argv )
|
|||
Jim_WrongNumArgs( goi.interp, 0, goi.argv, "<no parameters>");
|
||||
return JIM_ERR;
|
||||
}
|
||||
Jim_SetResult( goi.interp,
|
||||
Jim_SetResult( goi.interp,
|
||||
Jim_NewIntObj( goi.interp, max_target_number()));
|
||||
return JIM_OK;
|
||||
}
|
||||
|
|
|
@ -244,7 +244,6 @@ typedef struct target_s
|
|||
int target_number; /* generaly, target index but may not be in order */
|
||||
int chain_position; /* where on the jtag chain is this */
|
||||
const char *variant; /* what varient of this chip is it? */
|
||||
enum target_reset_mode reset_mode; /* how should this target be reset */
|
||||
target_event_action_t *event_action;
|
||||
|
||||
int reset_halt; /* attempt resetting the CPU into the halted mode? */
|
||||
|
|
Loading…
Reference in New Issue