Laurentiu Cocanu - integrated new tcl target command docs
git-svn-id: svn://svn.berlios.de/openocd/trunk@1073 b42882b7-edfa-0310-969c-e2dbd0fdcd60__archive__
parent
ba02ce97a4
commit
e2f941b546
|
@ -1,427 +0,0 @@
|
||||||
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'
|
|
443
doc/openocd.texi
443
doc/openocd.texi
|
@ -980,6 +980,449 @@ Dump <size> bytes, starting at <@var{offset}> bytes from the beginning of the <@
|
||||||
to a <@var{file}>.
|
to a <@var{file}>.
|
||||||
@end itemize
|
@end itemize
|
||||||
|
|
||||||
|
@page
|
||||||
|
@section Target Commands
|
||||||
|
@cindex Target Commands
|
||||||
|
|
||||||
|
@subsection Overview
|
||||||
|
@cindex Overview
|
||||||
|
Pre "TCL" - many commands in OpenOCD where implemented 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 time 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 referred 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:
|
||||||
|
|
||||||
|
@enumerate
|
||||||
|
@item
|
||||||
|
Using the old syntax (deprecated). Target names are autogenerated as:
|
||||||
|
"target0", "target1", etc.;
|
||||||
|
@cindex old syntax
|
||||||
|
@item
|
||||||
|
Using the new syntax, you can specify the name of the target.
|
||||||
|
@cindex new syntax
|
||||||
|
@end enumerate
|
||||||
|
|
||||||
|
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".
|
||||||
|
|
||||||
|
@subsection Commands
|
||||||
|
@cindex Commands
|
||||||
|
OpenOCD has the following 'target' or 'target-like' commands:
|
||||||
|
|
||||||
|
@enumerate
|
||||||
|
@item
|
||||||
|
@b{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);
|
||||||
|
@cindex targets
|
||||||
|
@item
|
||||||
|
@b{target (singular)} - used to create, configure list, etc the targets;
|
||||||
|
@cindex target
|
||||||
|
@item
|
||||||
|
@b{target0} - the command object for the first target. Unless you specified another name.
|
||||||
|
@cindex target0
|
||||||
|
@end enumerate
|
||||||
|
|
||||||
|
@subsubsection Targets Command
|
||||||
|
@cindex Targets Command
|
||||||
|
The "targets" command has 2 functions:
|
||||||
|
|
||||||
|
@itemize
|
||||||
|
@item
|
||||||
|
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).
|
||||||
|
@verbatim
|
||||||
|
# using a target name.
|
||||||
|
(gdb) mon targets target0
|
||||||
|
# or a target by number.
|
||||||
|
(gdb) mon targets 3
|
||||||
|
@end verbatim
|
||||||
|
@cindex with a parameter
|
||||||
|
@item
|
||||||
|
Plain, without any parameter lists targets, for example:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
(gdb) mon targets
|
||||||
|
CmdName Type Endian ChainPos State
|
||||||
|
-- ---------- ---------- ---------- -------- ----------
|
||||||
|
0: target0 arm7tdmi little 0 halted
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
This shows:
|
||||||
|
@enumerate a
|
||||||
|
@item
|
||||||
|
in this example, a single target;
|
||||||
|
@item
|
||||||
|
target number 0 (1st column);
|
||||||
|
@item
|
||||||
|
the 'object name' is target0 (the default name);
|
||||||
|
@item
|
||||||
|
it is an arm7tdmi;
|
||||||
|
@item
|
||||||
|
little endian;
|
||||||
|
@item
|
||||||
|
the position in the JTAG chain;
|
||||||
|
@item
|
||||||
|
and is currently halted.
|
||||||
|
@end enumerate
|
||||||
|
@cindex without any parameter
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
@subsubsection Target Command
|
||||||
|
@cindex Target Command
|
||||||
|
|
||||||
|
The "target" command has the following options:
|
||||||
|
@itemize
|
||||||
|
@item
|
||||||
|
target create
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
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
|
||||||
|
@end verbatim
|
||||||
|
@item
|
||||||
|
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).
|
||||||
|
@item
|
||||||
|
target names
|
||||||
|
|
||||||
|
Returns a TCL list of all known target commands (and is human readable).
|
||||||
|
|
||||||
|
Example:
|
||||||
|
@verbatim
|
||||||
|
foreach t [target names] {
|
||||||
|
puts [format "Target: %s\n" $t]
|
||||||
|
}
|
||||||
|
@end verbatim
|
||||||
|
@item
|
||||||
|
target current
|
||||||
|
|
||||||
|
Returns the TCL command name of the current target.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
@verbatim
|
||||||
|
set ct [target current]
|
||||||
|
set t [$ct cget -type]
|
||||||
|
|
||||||
|
puts "Current target name is: $ct, and is a: $t"
|
||||||
|
@end verbatim
|
||||||
|
@item
|
||||||
|
target number <VALUE>
|
||||||
|
|
||||||
|
Returns the TCL command name of the specified target.
|
||||||
|
|
||||||
|
Example
|
||||||
|
@verbatim
|
||||||
|
set thename [target number $x]
|
||||||
|
puts [format "Target %d is: %s\n" $x $thename]
|
||||||
|
@end verbatim
|
||||||
|
For instance, assuming the defaults
|
||||||
|
@verbatim
|
||||||
|
target number 0
|
||||||
|
@end verbatim
|
||||||
|
Would return 'target0' (or whatever you called it)
|
||||||
|
@item
|
||||||
|
target count
|
||||||
|
|
||||||
|
Returns the larget+1 target number.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
@verbatim
|
||||||
|
set c [target count]
|
||||||
|
for { set x 0 } { $x < $c } { incr x } {
|
||||||
|
# Assuming you have this function..
|
||||||
|
print_target_details $x
|
||||||
|
}
|
||||||
|
@end verbatim
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
@subsubsection Target0 Command
|
||||||
|
@cindex Target0 Command
|
||||||
|
The "target0" command (the "Target Object" command):
|
||||||
|
|
||||||
|
Once a target is 'created' a command object by that targets name is created, for example
|
||||||
|
@verbatim
|
||||||
|
target create BiGRed arm7tdmi -endian little -chain-position 3
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
Would create a [case sensitive] "command" BiGRed
|
||||||
|
|
||||||
|
If you use the old [deprecated] syntax, the name is automatically
|
||||||
|
generated and is in the form:
|
||||||
|
@verbatim
|
||||||
|
target0, target1, target2, target3, ... etc.
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
@subsubsection Target CREATE, CONFIGURE and CGET Options Command
|
||||||
|
@cindex Target CREATE, CONFIGURE and CGET Options Command
|
||||||
|
The commands:
|
||||||
|
@verbatim
|
||||||
|
target create CMDNAME TYPE [configure-options]
|
||||||
|
CMDNAME configure [configure-options]
|
||||||
|
CMDNAME cget [configure-options]
|
||||||
|
@end verbatim
|
||||||
|
@itemize
|
||||||
|
@item
|
||||||
|
In the 'create' case, one is creating the target and can specify any
|
||||||
|
number of configuration parameters.
|
||||||
|
@item
|
||||||
|
In the 'CMDNAME configure' case, one can change the setting [Not all things can, or should be changed].
|
||||||
|
@item
|
||||||
|
In the 'CMDNAME cget' case, the goal is to query the target for a
|
||||||
|
specific configuration option.
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
In the above, the "default" name target0 is 'target0'.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
From the (gdb) prompt, one can type this:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
(gdb) mon target0 configure -endian big
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
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:
|
||||||
|
@itemize
|
||||||
|
@item
|
||||||
|
[Mandatory 'create' Options]
|
||||||
|
@itemize
|
||||||
|
@item
|
||||||
|
type arm7tdmi|arm720|etc ...
|
||||||
|
@item
|
||||||
|
chain-position NUMBER
|
||||||
|
@item
|
||||||
|
endian ENDIAN
|
||||||
|
@end itemize
|
||||||
|
@item
|
||||||
|
Optional
|
||||||
|
@itemize
|
||||||
|
@item
|
||||||
|
event EVENTNAME "tcl-action"
|
||||||
|
@item
|
||||||
|
reset RESETACTION
|
||||||
|
@item
|
||||||
|
work-area-virt ADDR
|
||||||
|
@item
|
||||||
|
work-area-phys ADDR
|
||||||
|
@item
|
||||||
|
work-area-size ADDR
|
||||||
|
@item
|
||||||
|
work-area-backup BOOLEAN
|
||||||
|
@end itemize
|
||||||
|
@end itemize
|
||||||
|
Hint: To get a list of available options, try this:
|
||||||
|
@verbatim
|
||||||
|
(gdb) mon target0 cget -BLAHBLAHBLAH
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
the above causes an error - and a helpful list of valid options.
|
||||||
|
|
||||||
|
One can query any of the above options at run time, for example:
|
||||||
|
@verbatim
|
||||||
|
(gdb) mon target0 cget -OPTION [param]
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
Example TCL script
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
# 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]
|
||||||
|
}
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
Might produce:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
0: pic32chip, mips_m4k, endain: little
|
||||||
|
1: arm7, arm7tdmi, endian: big
|
||||||
|
2: blackfin, bf534, endian: little
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
(gdb) mon blackfin configure -event FOO {puts "Hi mom"}
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
or:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
(gdb) mon [target number 2] configure -event FOO {puts "Hi mom"}
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
In the second case, we use [] to get the command name of target #2, in this contrived example - it is "blackfin".
|
||||||
|
|
||||||
|
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 specify a TCL command to occur when a specific event occurs.
|
||||||
|
|
||||||
|
@subsection Target Events
|
||||||
|
@cindex Target Events
|
||||||
|
|
||||||
|
@subsubsection Overview
|
||||||
|
@cindex Overview
|
||||||
|
At various points in time - certain '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:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
(gdb) mon target0 configure -event reset-init "script cfg.clocks"
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
In the above example, when the event "reset-init" occurs, the "action-string" will be evaluated as if you typed it at the
|
||||||
|
console:
|
||||||
|
@itemize
|
||||||
|
@item @b{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;
|
||||||
|
@item @b{Option2} - You can instead create a fancy TCL procedure and invoke that procedure instead of sourcing a file [In fact,
|
||||||
|
"script" is a TCL procedure that loads a file].
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
@subsubsection Details
|
||||||
|
@cindex 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]:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
(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
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
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:
|
||||||
|
@itemize
|
||||||
|
@item gdb-flash-erase-start
|
||||||
|
@item gdb-flash-erase-end
|
||||||
|
@item gdb-flash-write-start
|
||||||
|
@item gdb-flash-write-end
|
||||||
|
@end itemize
|
||||||
|
|
||||||
|
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".
|
||||||
|
|
||||||
|
To get a list of current 'event actions', type the following command:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
(gdb) mon target0 eventlist
|
||||||
|
|
||||||
|
Event actions for target (0) target0
|
||||||
|
|
||||||
|
Event | Body
|
||||||
|
------------------------- | ----------------------------------------
|
||||||
|
old-post_reset | script event/sam7x256_reset.script
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
Here is a simple example for all targets:
|
||||||
|
|
||||||
|
@verbatim
|
||||||
|
(gdb) mon foreach x [target names] { $x eventlist }
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
|
The above uses some TCL tricks:
|
||||||
|
@enumerate a
|
||||||
|
@item foreach VARIABLE LIST BODY
|
||||||
|
@item to generate the list, we use [target names]
|
||||||
|
@item the BODY, contains $x - the loop variable and expands to the target specific name
|
||||||
|
@end enumerate
|
||||||
|
|
||||||
|
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]:
|
||||||
|
@verbatim
|
||||||
|
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'
|
||||||
|
@end verbatim
|
||||||
|
|
||||||
@page
|
@page
|
||||||
@section Target Specific Commands
|
@section Target Specific Commands
|
||||||
@cindex Target Specific Commands
|
@cindex Target Specific Commands
|
||||||
|
|
Loading…
Reference in New Issue