Merge up to ac63cd00d7 from upstream

- src/jtag/drivers/ftdi.c:

```
++<<<<<<< HEAD
 +      int i;
 +      static const uint8_t zero;
++=======
+       uint8_t zero = 0;
++>>>>>>> ocd_upstream
```

Decided to choose the latter.

- src/target/riscv/riscv-013.c:

```
++<<<<<<< HEAD
 +      int abs_chain_position;
 +      /* The base address to access this DM on DMI */
 +      uint32_t base;
++=======
+       unsigned int abs_chain_position;
+
++>>>>>>> ocd_upstream
```

Decided to choose the latter (abs_chain_position is unsigned now)

- src/target/riscv/batch.c:

```
++<<<<<<< HEAD
++=======
+ void dump_field(int idle, const struct scan_field *field)
+ {
  ...
+ }
++>>>>>>> ocd_upstream
```

dump_field function is not needed anymore

Signed-off-by: Parshintsev Anatoly <anatoly.parshintsev@syntacore.com>
This commit is contained in:
Parshintsev Anatoly 2024-08-20 15:34:55 +03:00
commit 9740a4ddd6
105 changed files with 1365 additions and 760 deletions

14
AUTHORS
View File

@ -1,12 +1,2 @@
Dominic Rath <Dominic.Rath@gmx.de> Please check the source code files and/or Git history for a list of all authors
Magnus Lundin <lundin@mlu.mine.nu> and contributors.
Michael Fischer <fischermi@t-online.de>
Spencer Oliver <spen@spen-soft.co.uk>
Carsten Schlote <schlote@vahanus.net>
Øyvind Harboe <oyvind.harboe@zylin.com>
Duane Ellis <openocd@duaneellis.com>
Michael Schwingen <michael@schwingen.org>
Rick Altherr <kc8apf@users.berlios.de>
David Brownell <dbrownell@users.sourceforge.net>
Vincint Palatin <vpalatin@users.berlios.de>
Zachary T Welch <zw@superlucidity.net>

View File

@ -50,6 +50,8 @@ AM_CPPFLAGS = $(HOST_CPPFLAGS)\
if INTERNAL_JIMTCL if INTERNAL_JIMTCL
AM_CPPFLAGS += -I$(top_srcdir)/jimtcl \ AM_CPPFLAGS += -I$(top_srcdir)/jimtcl \
-I$(top_builddir)/jimtcl -I$(top_builddir)/jimtcl
else
AM_CPPFLAGS += $(JIMTCL_CFLAGS)
endif endif
EXTRA_DIST += \ EXTRA_DIST += \
BUGS \ BUGS \

View File

@ -38,8 +38,8 @@ if [ -n "$SKIP_SUBMODULE" ]; then
echo "Skipping submodule setup" echo "Skipping submodule setup"
else else
echo "Setting up submodules" echo "Setting up submodules"
git submodule init git submodule sync
git submodule update git submodule update --init
fi fi
if [ -x src/jtag/drivers/libjaylink/autogen.sh ]; then if [ -x src/jtag/drivers/libjaylink/autogen.sh ]; then

View File

@ -595,6 +595,15 @@ AS_IF([test "x$use_internal_jimtcl" = "xyes"], [
], [ ], [
AC_MSG_ERROR([jimtcl not found, run git submodule init and git submodule update.]) AC_MSG_ERROR([jimtcl not found, run git submodule init and git submodule update.])
]) ])
], [
PKG_CHECK_MODULES([JIMTCL], [jimtcl >= 0.79], [
have_jimtcl_pkg_config=yes
], [
have_jimtcl_pkg_config=no
AC_CHECK_HEADER([jim.h], [], [
AC_MSG_ERROR([jimtcl is required but not found via pkg-config and system includes])
])
])
]) ])
AS_IF([test "x$build_remote_bitbang" = "xyes"], [ AS_IF([test "x$build_remote_bitbang" = "xyes"], [
@ -782,6 +791,7 @@ AM_CONDITIONAL([DMEM], [test "x$build_dmem" = "xyes"])
AM_CONDITIONAL([HAVE_CAPSTONE], [test "x$enable_capstone" != "xno"]) AM_CONDITIONAL([HAVE_CAPSTONE], [test "x$enable_capstone" != "xno"])
AM_CONDITIONAL([INTERNAL_JIMTCL], [test "x$use_internal_jimtcl" = "xyes"]) AM_CONDITIONAL([INTERNAL_JIMTCL], [test "x$use_internal_jimtcl" = "xyes"])
AM_CONDITIONAL([HAVE_JIMTCL_PKG_CONFIG], [test "x$have_jimtcl_pkg_config" = "xyes"])
AM_CONDITIONAL([INTERNAL_LIBJAYLINK], [test "x$use_internal_libjaylink" = "xyes"]) AM_CONDITIONAL([INTERNAL_LIBJAYLINK], [test "x$use_internal_libjaylink" = "xyes"])
# Look for environ alternatives. Possibility #1: is environ in unistd.h or stdlib.h? # Look for environ alternatives. Possibility #1: is environ in unistd.h or stdlib.h?

View File

@ -29,6 +29,27 @@ ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="660", GROUP="plugdev",
# Original FT231XQ VID:PID # Original FT231XQ VID:PID
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE="660", GROUP="plugdev", TAG+="uaccess" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE="660", GROUP="plugdev", TAG+="uaccess"
# Original FT2233HP VID:PID
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6040", MODE="660", GROUP="plugdev", TAG+="uaccess"
# Original FT4233HP VID:PID
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6041", MODE="660", GROUP="plugdev", TAG+="uaccess"
# Original FT2232HP VID:PID
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6042", MODE="660", GROUP="plugdev", TAG+="uaccess"
# Original FT4232HP VID:PID
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6043", MODE="660", GROUP="plugdev", TAG+="uaccess"
# Original FT233HP VID:PID
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6044", MODE="660", GROUP="plugdev", TAG+="uaccess"
# Original FT232HP VID:PID
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6045", MODE="660", GROUP="plugdev", TAG+="uaccess"
# Original FT4232HA VID:PID
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6048", MODE="660", GROUP="plugdev", TAG+="uaccess"
# DISTORTEC JTAG-lock-pick Tiny 2 # DISTORTEC JTAG-lock-pick Tiny 2
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8220", MODE="660", GROUP="plugdev", TAG+="uaccess" ATTRS{idVendor}=="0403", ATTRS{idProduct}=="8220", MODE="660", GROUP="plugdev", TAG+="uaccess"

View File

@ -1,3 +1,5 @@
# SPDX-License-Identifier: GPL-2.0-or-later
info_TEXINFOS += %D%/openocd.texi info_TEXINFOS += %D%/openocd.texi
%C%_openocd_TEXINFOS = %D%/fdl.texi %C%_openocd_TEXINFOS = %D%/fdl.texi

View File

@ -1,24 +1,21 @@
.TH "OPENOCD" "1" "November 24, 2009" .TH "OPENOCD" "1" "June 18, 2024"
.SH "NAME" .SH "NAME"
openocd \- A free and open on\-chip debugging, in\-system programming and openocd \- A free and open on\-chip debugging, in\-system programming and
boundary\-scan testing tool for ARM and MIPS systems boundary\-scan testing tool for microcontrollers and other embedded devices
.SH "SYNOPSIS" .SH "SYNOPSIS"
.B openocd \fR[\fB\-fsdlcphv\fR] [\fB\-\-file\fR <filename>] [\fB\-\-search\fR <dirname>] [\fB\-\-debug\fR <debuglevel>] [\fB\-\-log_output\fR <filename>] [\fB\-\-command\fR <cmd>] [\fB\-\-pipe\fR] [\fB\-\-help\fR] [\fB\-\-version\fR] .B openocd \fR[\fB\-fsdlchv\fR] [\fB\-\-file\fR <filename>] [\fB\-\-search\fR <dirname>] [\fB\-\-debug\fR <debuglevel>] [\fB\-\-log_output\fR <filename>] [\fB\-\-command\fR <cmd>] [\fB\-\-help\fR] [\fB\-\-version\fR]
.SH "DESCRIPTION" .SH "DESCRIPTION"
.B OpenOCD .B OpenOCD
is an on\-chip debugging, in\-system programming and boundary\-scan is an on\-chip debugging, in\-system programming and boundary\-scan
testing tool for various ARM and MIPS systems. testing tool for various microcontrollers and other embedded devices.
.PP .PP
The debugger uses an IEEE 1149\-1 compliant JTAG TAP bus master to access Various different types of debug adapters as well as transport protocols like
on\-chip debug functionality available on ARM based microcontrollers or JTAG and SWD are supported by OpenOCD, please check the \fIopenocd\fR info page
system-on-chip solutions. For MIPS systems the EJTAG interface is supported. for the complete list.
.PP .PP
User interaction is realized through a telnet command line interface, User interaction is realized through a telnet command line interface,
a gdb (the GNU debugger) remote protocol server, and a simplified RPC a gdb (the GNU debugger) remote protocol server, and a simplified RPC
connection that can be used to interface with OpenOCD's Jim Tcl engine. connection that can be used to interface with OpenOCD's Jim Tcl engine.
.PP
OpenOCD supports various different types of JTAG interfaces/programmers,
please check the \fIopenocd\fR info page for the complete list.
.SH "OPTIONS" .SH "OPTIONS"
.TP .TP
.B "\-f, \-\-file <filename>" .B "\-f, \-\-file <filename>"
@ -68,8 +65,6 @@ Note that you will need to explicitly invoke
.I init .I init
if the command requires access to a target or flash. if the command requires access to a target or flash.
.TP .TP
.B "\-p, \-\-pipe"
Use pipes when talking to gdb.
.TP .TP
.B "\-h, \-\-help" .B "\-h, \-\-help"
Show a help text and exit. Show a help text and exit.
@ -82,8 +77,6 @@ Please report any bugs on the mailing list at
.SH "LICENCE" .SH "LICENCE"
.B OpenOCD .B OpenOCD
is covered by the GNU General Public License (GPL), version 2 or later. is covered by the GNU General Public License (GPL), version 2 or later.
.SH "SEE ALSO"
.BR jtag (1)
.PP .PP
The full documentation for The full documentation for
.B openocd .B openocd

View File

@ -930,8 +930,8 @@ a board with an Atmel AT91SAM7X256 microcontroller:
source [find interface/ftdi/signalyzer.cfg] source [find interface/ftdi/signalyzer.cfg]
# GDB can also flash my flash! # GDB can also flash my flash!
gdb_memory_map enable gdb memory_map enable
gdb_flash_program enable gdb flash_program enable
source [find target/sam7x256.cfg] source [find target/sam7x256.cfg]
@end example @end example
@ -940,8 +940,8 @@ Here is the command line equivalent of that configuration:
@example @example
openocd -f interface/ftdi/signalyzer.cfg \ openocd -f interface/ftdi/signalyzer.cfg \
-c "gdb_memory_map enable" \ -c "gdb memory_map enable" \
-c "gdb_flash_program enable" \ -c "gdb flash_program enable" \
-f target/sam7x256.cfg -f target/sam7x256.cfg
@end example @end example
@ -2179,18 +2179,16 @@ only during configuration (before those ports are opened).
For reasons including security, you may wish to prevent remote For reasons including security, you may wish to prevent remote
access using one or more of these ports. access using one or more of these ports.
In such cases, just specify the relevant port number as "disabled". In such cases, just specify the relevant port number as "disabled".
If you disable all access through TCP/IP, you will need to
use the command line @option{-pipe} option.
You can request the operating system to select one of the available You can request the operating system to select one of the available
ports for the server by specifying the relevant port number as "0". ports for the server by specifying the relevant port number as "0".
@anchor{gdb_port} @anchor{gdb port}
@deffn {Config Command} {gdb_port} [number] @deffn {Config Command} {gdb port} [number]
@cindex GDB server @cindex GDB server
Normally gdb listens to a TCP/IP port, but GDB can also Normally gdb listens to a TCP/IP port, but GDB can also
communicate via pipes(stdin/out or named pipes). The name communicate via pipes(stdin/out or named pipes). The name
"gdb_port" stuck because it covers probably more than 90% of "gdb port" stuck because it covers probably more than 90% of
the normal use cases. the normal use cases.
No arguments reports GDB port. "pipe" means listen to stdin No arguments reports GDB port. "pipe" means listen to stdin
@ -2205,7 +2203,7 @@ Output pipe is the same name as input pipe, but with 'o' appended,
e.g. /var/gdb, /var/gdbo. e.g. /var/gdb, /var/gdbo.
The GDB port for the first target will be the base port, the The GDB port for the first target will be the base port, the
second target will listen on gdb_port + 1, and so on. second target will listen on port + 1, and so on.
When not specified during the configuration stage, When not specified during the configuration stage,
the port @var{number} defaults to 3333. the port @var{number} defaults to 3333.
When @var{number} is not a numeric value, incrementing it to compute When @var{number} is not a numeric value, incrementing it to compute
@ -2214,12 +2212,12 @@ the next port number does not work. In this case, specify the proper
commands @command{target create} or @command{$target_name configure}. commands @command{target create} or @command{$target_name configure}.
@xref{gdbportoverride,,option -gdb-port}. @xref{gdbportoverride,,option -gdb-port}.
Note: when using "gdb_port pipe", increasing the default remote timeout in Note: when using "gdb port pipe", increasing the default remote timeout in
gdb (with 'set remotetimeout') is recommended. An insufficient timeout may gdb (with 'set remotetimeout') is recommended. An insufficient timeout may
cause initialization to fail with "Unknown remote qXfer reply: OK". cause initialization to fail with "Unknown remote qXfer reply: OK".
@end deffn @end deffn
@deffn {Config Command} {tcl_port} [number] @deffn {Config Command} {tcl port} [number]
Specify or query the port used for a simplified RPC Specify or query the port used for a simplified RPC
connection that can be used by clients to issue TCL commands and get the connection that can be used by clients to issue TCL commands and get the
output from the Tcl engine. output from the Tcl engine.
@ -2248,7 +2246,7 @@ The ones listed here are static and global.
@xref{targetevents,,Target Events}, about configuring target-specific event handling. @xref{targetevents,,Target Events}, about configuring target-specific event handling.
@anchor{gdbbreakpointoverride} @anchor{gdbbreakpointoverride}
@deffn {Command} {gdb_breakpoint_override} [@option{hard}|@option{soft}|@option{disable}] @deffn {Command} {gdb breakpoint_override} [@option{hard}|@option{soft}|@option{disable}]
Force breakpoint type for gdb @command{break} commands. Force breakpoint type for gdb @command{break} commands.
This option supports GDB GUIs which don't This option supports GDB GUIs which don't
distinguish hard versus soft breakpoints, if the default OpenOCD and distinguish hard versus soft breakpoints, if the default OpenOCD and
@ -2257,41 +2255,41 @@ breakpoints if the memory map has been set up for flash regions.
@end deffn @end deffn
@anchor{gdbflashprogram} @anchor{gdbflashprogram}
@deffn {Config Command} {gdb_flash_program} (@option{enable}|@option{disable}) @deffn {Config Command} {gdb flash_program} (@option{enable}|@option{disable})
Set to @option{enable} to cause OpenOCD to program the flash memory when a Set to @option{enable} to cause OpenOCD to program the flash memory when a
vFlash packet is received. vFlash packet is received.
The default behaviour is @option{enable}. The default behaviour is @option{enable}.
@end deffn @end deffn
@deffn {Config Command} {gdb_memory_map} (@option{enable}|@option{disable}) @deffn {Config Command} {gdb memory_map} (@option{enable}|@option{disable})
Set to @option{enable} to cause OpenOCD to send the memory configuration to GDB when Set to @option{enable} to cause OpenOCD to send the memory configuration to GDB when
requested. GDB will then know when to set hardware breakpoints, and program flash requested. GDB will then know when to set hardware breakpoints, and program flash
using the GDB load command. @command{gdb_flash_program enable} must also be enabled using the GDB load command. @command{gdb flash_program enable} must also be enabled
for flash programming to work. for flash programming to work.
Default behaviour is @option{enable}. Default behaviour is @option{enable}.
@xref{gdbflashprogram,,gdb_flash_program}. @xref{gdbflashprogram,,gdb flash_program}.
@end deffn @end deffn
@deffn {Config Command} {gdb_report_data_abort} (@option{enable}|@option{disable}) @deffn {Config Command} {gdb report_data_abort} (@option{enable}|@option{disable})
Specifies whether data aborts cause an error to be reported Specifies whether data aborts cause an error to be reported
by GDB memory read packets. by GDB memory read packets.
The default behaviour is @option{disable}; The default behaviour is @option{disable};
use @option{enable} see these errors reported. use @option{enable} see these errors reported.
@end deffn @end deffn
@deffn {Config Command} {gdb_report_register_access_error} (@option{enable}|@option{disable}) @deffn {Config Command} {gdb report_register_access_error} (@option{enable}|@option{disable})
Specifies whether register accesses requested by GDB register read/write Specifies whether register accesses requested by GDB register read/write
packets report errors or not. packets report errors or not.
The default behaviour is @option{disable}; The default behaviour is @option{disable};
use @option{enable} see these errors reported. use @option{enable} see these errors reported.
@end deffn @end deffn
@deffn {Config Command} {gdb_target_description} (@option{enable}|@option{disable}) @deffn {Config Command} {gdb target_description} (@option{enable}|@option{disable})
Set to @option{enable} to cause OpenOCD to send the target descriptions to gdb via qXfer:features:read packet. Set to @option{enable} to cause OpenOCD to send the target descriptions to gdb via qXfer:features:read packet.
The default behaviour is @option{enable}. The default behaviour is @option{enable}.
@end deffn @end deffn
@deffn {Command} {gdb_save_tdesc} @deffn {Command} {gdb save_tdesc}
Saves the target description file to the local file system. Saves the target description file to the local file system.
The file name is @i{target_name}.xml. The file name is @i{target_name}.xml.
@ -2989,6 +2987,11 @@ Display free device internal memory.
Set the JTAG command version to be used. Without argument, show the actual JTAG Set the JTAG command version to be used. Without argument, show the actual JTAG
command version. command version.
@end deffn @end deffn
@deffn {Command} {jlink targetpower} [@option{0}|@option{1}|@option{on}|@option{off}]
Switch the 5@ V target power supply on or off.
Without argument, show the state of the target power supply.
The target power supply is usually connected to pin 19 of the 20-pin connector.
@end deffn
@deffn {Command} {jlink config} @deffn {Command} {jlink config}
Display the device configuration. Display the device configuration.
@end deffn @end deffn
@ -3228,19 +3231,19 @@ versions of firmware where serial number is reset after first use. Suggest
using ST firmware update utility to upgrade ST-LINK firmware even if current using ST firmware update utility to upgrade ST-LINK firmware even if current
version reported is V2.J21.S4. version reported is V2.J21.S4.
@deffn {Config Command} {hla_device_desc} description @deffn {Config Command} {hla device_desc} description
Currently Not Supported. Currently Not Supported.
@end deffn @end deffn
@deffn {Config Command} {hla_layout} (@option{stlink}|@option{icdi}|@option{nulink}) @deffn {Config Command} {hla layout} (@option{stlink}|@option{icdi}|@option{nulink})
Specifies the adapter layout to use. Specifies the adapter layout to use.
@end deffn @end deffn
@deffn {Config Command} {hla_vid_pid} [vid pid]+ @deffn {Config Command} {hla vid_pid} [vid pid]+
Pairs of vendor IDs and product IDs of the device. Pairs of vendor IDs and product IDs of the device.
@end deffn @end deffn
@deffn {Config Command} {hla_stlink_backend} (usb | tcp [port]) @deffn {Config Command} {hla stlink_backend} (usb | tcp [port])
@emph{ST-Link only:} Choose between 'exclusive' USB communication (the default backend) or @emph{ST-Link only:} Choose between 'exclusive' USB communication (the default backend) or
'shared' mode using ST-Link TCP server (the default port is 7184). 'shared' mode using ST-Link TCP server (the default port is 7184).
@ -3249,7 +3252,7 @@ available from @url{https://www.st.com/en/development-tools/st-link-server.html,
ST-LINK server software module}. ST-LINK server software module}.
@end deffn @end deffn
@deffn {Command} {hla_command} command @deffn {Command} {hla command} command
Execute a custom adapter-specific command. The @var{command} string is Execute a custom adapter-specific command. The @var{command} string is
passed as is to the underlying adapter layout handler. passed as is to the underlying adapter layout handler.
@end deffn @end deffn
@ -3719,20 +3722,18 @@ displays the names of the transports supported by this
version of OpenOCD. version of OpenOCD.
@end deffn @end deffn
@deffn {Command} {transport select} @option{transport_name} @deffn {Command} {transport select} [transport_name]
Select which of the supported transports to use in this OpenOCD session. Select which of the supported transports to use in this OpenOCD session.
When invoked with @option{transport_name}, attempts to select the named When invoked with @option{transport_name}, attempts to select the named
transport. The transport must be supported by the debug adapter transport. The transport must be supported by the debug adapter
hardware and by the version of OpenOCD you are using (including the hardware and by the version of OpenOCD you are using (including the
adapter's driver). adapter's driver).
When invoked with no transport name:
If no transport has been selected and no @option{transport_name} is @itemize @minus
provided, @command{transport select} auto-selects the first transport @item if no transport has been selected yet, it auto-selects the first transport supported by the debug adapter
supported by the debug adapter. @item it returns the name of the session's selected transport
@end itemize
@command{transport select} always returns the name of the session's selected
transport, if any.
@end deffn @end deffn
@subsection JTAG Transport @subsection JTAG Transport
@ -5190,6 +5191,38 @@ On ADIv6 DAP @var{ap_number} is the base address of the DAP AP the target is con
Use this option with systems where multiple, independent cores are connected Use this option with systems where multiple, independent cores are connected
to separate access ports of the same DAP. to separate access ports of the same DAP.
@item @code{-dbgbase} @var{dbg_base_address} -- set the base address of the
debug controller.
This is ignored and not required for target types that have the debug controller
at fixed addresses, like @code{cortex_m}.
On DAP based SoC, OpenOCD can parse the ROM table in the DAP access port to
identify the base address of the debug controller, but the parsing can be slow
on devices with big ROM tables.
While using @code{-dbgbase} is suggested to speed up the target examination,
it is often the only viable solution for devices with incorrect ROM table
content or with ROM table partially not accessible due to clock gating or
power management.
@item @code{-coreid} @var{coreid} -- set an index to identify the CPU or its
debug controller.
@itemize @minus
@item When @code{-dbgbase} option is not provided on devices with multiple
CPUs on the same DAP access port
(e.g. @code{cortex_a}, @code{cortex_r4}, @code{aarch64} and @code{armv8r}),
this option specifies that the ROM table parsing should select the CPU in
position @var{coreid}.
@item On target type @code{riscv}, @var{coreid} specifies the hart
(HARdware Threads) on the DM (Debug Module). It is used on multi-hart
devices to index a specific hart ID.
When not present, it's default value is zero.
@item This value @var{coreid} is currently also used in other contexts as a
general CPU index, e.g. in SMP nodes or to select a specific CPU in a chip.
To avoid confusion, these additional use cases are going to be dropped.
@end itemize
@item @code{-cti} @var{cti_name} -- set Cross-Trigger Interface (CTI) connected @item @code{-cti} @var{cti_name} -- set Cross-Trigger Interface (CTI) connected
to the target. Currently, only the @code{aarch64} target makes use of this option, to the target. Currently, only the @code{aarch64} target makes use of this option,
where it is a mandatory configuration for the target run control. where it is a mandatory configuration for the target run control.
@ -5197,11 +5230,11 @@ where it is a mandatory configuration for the target run control.
for instruction on how to declare and control a CTI instance. for instruction on how to declare and control a CTI instance.
@anchor{gdbportoverride} @anchor{gdbportoverride}
@item @code{-gdb-port} @var{number} -- see command @command{gdb_port} for the @item @code{-gdb-port} @var{number} -- @xref{gdb port,,command gdb port}, for the
possible values of the parameter @var{number}, which are not only numeric values. possible values of the parameter @var{number}, which are not only numeric values.
Use this option to override, for this target only, the global parameter set with Use this option to override, for this target only, the global parameter set with
command @command{gdb_port}. command @command{gdb port}.
@xref{gdb_port,,command gdb_port}. @xref{gdb port,,command gdb port}.
@item @code{-gdb-max-connections} @var{number} -- EXPERIMENTAL: set the maximum @item @code{-gdb-max-connections} @var{number} -- EXPERIMENTAL: set the maximum
number of GDB connections that are allowed for the target. Default is 1. number of GDB connections that are allowed for the target. Default is 1.
@ -10587,7 +10620,7 @@ the destination of the trace data:
@item @option{external} -- configure TPIU/SWO to let user capture trace @item @option{external} -- configure TPIU/SWO to let user capture trace
output externally, either with an additional UART or with a logic analyzer (default); output externally, either with an additional UART or with a logic analyzer (default);
@item @option{-} -- configure TPIU/SWO and debug adapter to gather trace data @item @option{-} -- configure TPIU/SWO and debug adapter to gather trace data
and forward it to @command{tcl_trace} command; and forward it to @command{tcl trace} command;
@item @option{:}@var{port} -- configure TPIU/SWO and debug adapter to gather @item @option{:}@var{port} -- configure TPIU/SWO and debug adapter to gather
trace data, open a TCP server at port @var{port} and send the trace data to trace data, open a TCP server at port @var{port} and send the trace data to
each connected client; each connected client;
@ -12593,7 +12626,7 @@ target remote localhost:3333
A pipe connection is typically started as follows: A pipe connection is typically started as follows:
@example @example
target extended-remote | \ target extended-remote | \
openocd -c "gdb_port pipe; log_output openocd.log" openocd -c "gdb port pipe; log_output openocd.log"
@end example @end example
This would cause GDB to run OpenOCD and communicate using pipes (stdin/stdout). This would cause GDB to run OpenOCD and communicate using pipes (stdin/stdout).
Using this method has the advantage of GDB starting/stopping OpenOCD for the debug Using this method has the advantage of GDB starting/stopping OpenOCD for the debug
@ -12677,7 +12710,7 @@ using @command{gdb -x filename}.
By default the target memory map is sent to GDB. This can be disabled by By default the target memory map is sent to GDB. This can be disabled by
the following OpenOCD configuration option: the following OpenOCD configuration option:
@example @example
gdb_memory_map disable gdb memory_map disable
@end example @end example
For this to function correctly a valid flash configuration must also be set For this to function correctly a valid flash configuration must also be set
in OpenOCD. For faster performance you should also configure a valid in OpenOCD. For faster performance you should also configure a valid
@ -12685,8 +12718,8 @@ working area.
Informing GDB of the memory map of the target will enable GDB to protect any Informing GDB of the memory map of the target will enable GDB to protect any
flash areas of the target and use hardware breakpoints by default. This means flash areas of the target and use hardware breakpoints by default. This means
that the OpenOCD option @command{gdb_breakpoint_override} is not required when that the OpenOCD option @command{gdb breakpoint_override} is not required when
using a memory map. @xref{gdbbreakpointoverride,,gdb_breakpoint_override}. using a memory map. @xref{gdbbreakpointoverride,,gdb breakpoint_override}.
To view the configured memory map in GDB, use the GDB command @option{info mem}. To view the configured memory map in GDB, use the GDB command @option{info mem}.
All other unassigned addresses within GDB are treated as RAM. All other unassigned addresses within GDB are treated as RAM.
@ -12697,7 +12730,7 @@ This can be changed to the old behaviour by using the following GDB command
set mem inaccessible-by-default off set mem inaccessible-by-default off
@end example @end example
If @command{gdb_flash_program enable} is also used, GDB will be able to If @command{gdb flash_program enable} is also used, GDB will be able to
program any flash memory using the vFlash interface. program any flash memory using the vFlash interface.
GDB will look at the target memory map when a load command is given, if any GDB will look at the target memory map when a load command is given, if any
@ -12736,9 +12769,9 @@ $_TARGETNAME configure -event gdb-attach @{@}
@end example @end example
If any of installed flash banks does not support probe on running target, If any of installed flash banks does not support probe on running target,
switch off gdb_memory_map: switch off gdb memory_map:
@example @example
gdb_memory_map disable gdb memory_map disable
@end example @end example
Ensure GDB is configured without interrupt-on-connect. Ensure GDB is configured without interrupt-on-connect.
@ -12747,7 +12780,7 @@ Some GDB versions set it by default, some does not.
set remote interrupt-on-connect off set remote interrupt-on-connect off
@end example @end example
If you switched gdb_memory_map off, you may want to setup GDB memory map If you switched gdb memory_map off, you may want to setup GDB memory map
manually or issue @command{set mem inaccessible-by-default off} manually or issue @command{set mem inaccessible-by-default off}
Now you can issue GDB command @command{target extended-remote ...} and inspect memory Now you can issue GDB command @command{target extended-remote ...} and inspect memory
@ -12960,7 +12993,7 @@ OpenOCD provides a simple RPC server that allows to run arbitrary Tcl
commands and receive the results. commands and receive the results.
To access it, your application needs to connect to a configured TCP port To access it, your application needs to connect to a configured TCP port
(see @command{tcl_port}). Then it can pass any string to the (see @command{tcl port}). Then it can pass any string to the
interpreter terminating it with @code{0x1a} and wait for the return interpreter terminating it with @code{0x1a} and wait for the return
value (it will be terminated with @code{0x1a} as well). This can be value (it will be terminated with @code{0x1a} as well). This can be
repeated as many times as desired without reopening the connection. repeated as many times as desired without reopening the connection.
@ -12986,7 +13019,7 @@ type target_state state [state-name]
type target_reset mode [reset-mode] type target_reset mode [reset-mode]
@end verbatim @end verbatim
@deffn {Command} {tcl_notifications} [on/off] @deffn {Command} {tcl notifications} [on/off]
Toggle output of target notifications to the current Tcl RPC server. Toggle output of target notifications to the current Tcl RPC server.
Only available from the Tcl RPC server. Only available from the Tcl RPC server.
Defaults to off. Defaults to off.
@ -13005,7 +13038,7 @@ Target trace data is emitted as a Tcl associative array in the following format.
type target_trace data [trace-data-hex-encoded] type target_trace data [trace-data-hex-encoded]
@end verbatim @end verbatim
@deffn {Command} {tcl_trace} [on/off] @deffn {Command} {tcl trace} [on/off]
Toggle output of target trace data to the current Tcl RPC server. Toggle output of target trace data to the current Tcl RPC server.
Only available from the Tcl RPC server. Only available from the Tcl RPC server.
Defaults to off. Defaults to off.

View File

@ -17,8 +17,12 @@ bin_PROGRAMS += %D%/openocd
if INTERNAL_JIMTCL if INTERNAL_JIMTCL
%C%_openocd_LDADD += $(top_builddir)/jimtcl/libjim.a %C%_openocd_LDADD += $(top_builddir)/jimtcl/libjim.a
else else
if HAVE_JIMTCL_PKG_CONFIG
%C%_openocd_LDADD += $(JIMTCL_LIBS)
else
%C%_openocd_LDADD += -ljim %C%_openocd_LDADD += -ljim
endif endif
endif
%C%_libopenocd_la_CPPFLAGS = %C%_libopenocd_la_CPPFLAGS =

View File

@ -117,20 +117,24 @@ struct nrf5_map {
struct nrf5_info { struct nrf5_info {
unsigned int refcount; unsigned int refcount;
bool chip_probed;
struct nrf5_bank { struct nrf5_bank {
struct nrf5_info *chip; struct nrf5_info *chip;
bool probed; bool probed;
} bank[2]; } bank[2];
struct target *target; struct target *target;
/* chip identification stored in nrf5_probe() for use in nrf5_info() */ /* chip identification stored in nrf5_probe_chip()
* for use in nrf5_info() and nrf5_setup_bank() */
bool ficr_info_valid; bool ficr_info_valid;
struct nrf52_ficr_info ficr_info; struct nrf52_ficr_info ficr_info;
const struct nrf5_device_spec *spec; const struct nrf5_device_spec *spec;
uint16_t hwid; uint16_t hwid;
enum nrf5_features features; enum nrf5_features features;
unsigned int flash_size_kb; uint32_t flash_page_size;
uint32_t flash_num_sectors;
unsigned int ram_size_kb; unsigned int ram_size_kb;
const struct nrf5_map *map; const struct nrf5_map *map;
@ -341,16 +345,19 @@ const struct flash_driver nrf5_flash, nrf51_flash;
static bool nrf5_bank_is_probed(const struct flash_bank *bank) static bool nrf5_bank_is_probed(const struct flash_bank *bank)
{ {
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
return nbank->probed; return nbank->probed;
} }
static bool nrf5_chip_is_probed(const struct flash_bank *bank)
{
struct nrf5_bank *nbank = bank->driver_priv;
struct nrf5_info *chip = nbank->chip;
return chip->chip_probed;
}
static bool nrf5_bank_is_uicr(const struct nrf5_bank *nbank) static bool nrf5_bank_is_uicr(const struct nrf5_bank *nbank)
{ {
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
return nbank == &chip->bank[1]; return nbank == &chip->bank[1];
} }
@ -470,9 +477,7 @@ static int nrf51_protect_check_clenr0(struct flash_bank *bank)
uint32_t clenr0; uint32_t clenr0;
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
res = target_read_u32(chip->target, NRF51_FICR_CLENR0, res = target_read_u32(chip->target, NRF51_FICR_CLENR0,
&clenr0); &clenr0);
@ -501,9 +506,7 @@ static int nrf51_protect_check_clenr0(struct flash_bank *bank)
static int nrf52_protect_check_bprot(struct flash_bank *bank) static int nrf52_protect_check_bprot(struct flash_bank *bank)
{ {
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
static uint32_t nrf5_bprot_offsets[4] = { 0x600, 0x604, 0x610, 0x614 }; static uint32_t nrf5_bprot_offsets[4] = { 0x600, 0x604, 0x610, 0x614 };
uint32_t bprot_reg = 0; uint32_t bprot_reg = 0;
@ -528,9 +531,7 @@ static int nrf52_protect_check_bprot(struct flash_bank *bank)
static int nrf5_protect_check(struct flash_bank *bank) static int nrf5_protect_check(struct flash_bank *bank)
{ {
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
/* UICR cannot be write protected so just return early */ /* UICR cannot be write protected so just return early */
if (nrf5_bank_is_uicr(nbank)) if (nrf5_bank_is_uicr(nbank))
@ -554,9 +555,7 @@ static int nrf51_protect_clenr0(struct flash_bank *bank, int set, unsigned int f
uint32_t clenr0, ppfc; uint32_t clenr0, ppfc;
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
if (first != 0) { if (first != 0) {
LOG_ERROR("Code region 0 must start at the beginning of the bank"); LOG_ERROR("Code region 0 must start at the beginning of the bank");
@ -614,9 +613,7 @@ static int nrf5_protect(struct flash_bank *bank, int set, unsigned int first,
unsigned int last) unsigned int last)
{ {
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
/* UICR cannot be write protected so just bail out early */ /* UICR cannot be write protected so just bail out early */
if (nrf5_bank_is_uicr(nbank)) { if (nrf5_bank_is_uicr(nbank)) {
@ -701,16 +698,15 @@ static int nrf5_get_chip_type_str(const struct nrf5_info *chip, char *buf, unsig
static int nrf5_info(struct flash_bank *bank, struct command_invocation *cmd) static int nrf5_info(struct flash_bank *bank, struct command_invocation *cmd)
{ {
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
char chip_type_str[256]; char chip_type_str[256];
if (nrf5_get_chip_type_str(chip, chip_type_str, sizeof(chip_type_str)) != ERROR_OK) if (nrf5_get_chip_type_str(chip, chip_type_str, sizeof(chip_type_str)) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
unsigned int flash_size_kb = chip->flash_num_sectors * chip->flash_page_size / 1024;
command_print_sameline(cmd, "%s %ukB Flash, %ukB RAM", command_print_sameline(cmd, "%s %ukB Flash, %ukB RAM",
chip_type_str, chip->flash_size_kb, chip->ram_size_kb); chip_type_str, flash_size_kb, chip->ram_size_kb);
return ERROR_OK; return ERROR_OK;
} }
@ -838,14 +834,12 @@ static int nrf51_get_ram_size(struct target *target, uint32_t *ram_size)
return res; return res;
} }
static int nrf5_probe(struct flash_bank *bank) static int nrf5_probe_chip(struct flash_bank *bank)
{ {
int res = ERROR_TARGET_RESOURCE_NOT_AVAILABLE; int res = ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
struct target *target = chip->target; struct target *target = chip->target;
chip->spec = NULL; chip->spec = NULL;
@ -968,9 +962,8 @@ static int nrf5_probe(struct flash_bank *bank)
} }
/* The value stored in FICR CODEPAGESIZE is the number of bytes in one page of FLASH. */ /* The value stored in FICR CODEPAGESIZE is the number of bytes in one page of FLASH. */
uint32_t flash_page_size;
res = target_read_u32(chip->target, ficr_base + ficr_offsets->codepagesize, res = target_read_u32(chip->target, ficr_base + ficr_offsets->codepagesize,
&flash_page_size); &chip->flash_page_size);
if (res != ERROR_OK) { if (res != ERROR_OK) {
LOG_ERROR("Couldn't read code page size"); LOG_ERROR("Couldn't read code page size");
return res; return res;
@ -978,69 +971,93 @@ static int nrf5_probe(struct flash_bank *bank)
/* Note the register name is misleading, /* Note the register name is misleading,
* FICR CODESIZE is the number of pages in flash memory, not the number of bytes! */ * FICR CODESIZE is the number of pages in flash memory, not the number of bytes! */
uint32_t num_sectors;
res = target_read_u32(chip->target, ficr_base + ficr_offsets->codesize, res = target_read_u32(chip->target, ficr_base + ficr_offsets->codesize,
&num_sectors); &chip->flash_num_sectors);
if (res != ERROR_OK) { if (res != ERROR_OK) {
LOG_ERROR("Couldn't read code memory size"); LOG_ERROR("Couldn't read code memory size");
return res; return res;
} }
chip->flash_size_kb = num_sectors * flash_page_size / 1024;
if (!chip->bank[0].probed && !chip->bank[1].probed) {
char chip_type_str[256]; char chip_type_str[256];
if (nrf5_get_chip_type_str(chip, chip_type_str, sizeof(chip_type_str)) != ERROR_OK) if (nrf5_get_chip_type_str(chip, chip_type_str, sizeof(chip_type_str)) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
unsigned int flash_size_kb = chip->flash_num_sectors * chip->flash_page_size / 1024;
const bool device_is_unknown = (!chip->spec && !chip->ficr_info_valid); const bool device_is_unknown = (!chip->spec && !chip->ficr_info_valid);
LOG_INFO("%s%s %ukB Flash, %ukB RAM", LOG_INFO("%s%s %ukB Flash, %ukB RAM",
device_is_unknown ? "Unknown device: " : "", device_is_unknown ? "Unknown device: " : "",
chip_type_str, chip_type_str,
chip->flash_size_kb, flash_size_kb,
chip->ram_size_kb); chip->ram_size_kb);
chip->chip_probed = true;
return ERROR_OK;
} }
free(bank->sectors); static int nrf5_setup_bank(struct flash_bank *bank)
{
struct nrf5_bank *nbank = bank->driver_priv;
struct nrf5_info *chip = nbank->chip;
if (bank->base == chip->map->flash_base) { if (bank->base == chip->map->flash_base) {
unsigned int flash_size_kb = chip->flash_num_sectors * chip->flash_page_size / 1024;
/* Sanity check */ /* Sanity check */
if (chip->spec && chip->flash_size_kb != chip->spec->flash_size_kb) if (chip->spec && flash_size_kb != chip->spec->flash_size_kb)
LOG_WARNING("Chip's reported Flash capacity does not match expected one"); LOG_WARNING("Chip's reported Flash capacity does not match expected one");
if (chip->ficr_info_valid && chip->flash_size_kb != chip->ficr_info.flash) if (chip->ficr_info_valid && flash_size_kb != chip->ficr_info.flash)
LOG_WARNING("Chip's reported Flash capacity does not match FICR INFO.FLASH"); LOG_WARNING("Chip's reported Flash capacity does not match FICR INFO.FLASH");
bank->num_sectors = num_sectors; bank->num_sectors = chip->flash_num_sectors;
bank->size = num_sectors * flash_page_size; bank->size = chip->flash_num_sectors * chip->flash_page_size;
bank->sectors = alloc_block_array(0, flash_page_size, num_sectors); bank->sectors = alloc_block_array(0, chip->flash_page_size, bank->num_sectors);
if (!bank->sectors) if (!bank->sectors)
return ERROR_FAIL; return ERROR_FAIL;
chip->bank[0].probed = true; chip->bank[0].probed = true;
} else { } else if (bank->base == chip->map->uicr_base) {
/* UICR bank */ /* UICR bank */
bank->num_sectors = 1; bank->num_sectors = 1;
bank->size = flash_page_size; bank->size = chip->flash_page_size;
bank->sectors = alloc_block_array(0, flash_page_size, num_sectors); bank->sectors = alloc_block_array(0, chip->flash_page_size, bank->num_sectors);
if (!bank->sectors) if (!bank->sectors)
return ERROR_FAIL; return ERROR_FAIL;
bank->sectors[0].is_protected = 0; bank->sectors[0].is_protected = 0;
chip->bank[1].probed = true; chip->bank[1].probed = true;
} else {
LOG_ERROR("Invalid nRF bank address " TARGET_ADDR_FMT, bank->base);
return ERROR_FLASH_BANK_INVALID;
} }
return ERROR_OK; return ERROR_OK;
} }
static int nrf5_probe(struct flash_bank *bank)
{
/* probe always reads actual info from the device */
int res = nrf5_probe_chip(bank);
if (res != ERROR_OK)
return res;
return nrf5_setup_bank(bank);
}
static int nrf5_auto_probe(struct flash_bank *bank) static int nrf5_auto_probe(struct flash_bank *bank)
{ {
if (nrf5_bank_is_probed(bank)) if (nrf5_bank_is_probed(bank))
return ERROR_OK; return ERROR_OK;
return nrf5_probe(bank); if (!nrf5_chip_is_probed(bank)) {
int res = nrf5_probe_chip(bank);
if (res != ERROR_OK)
return res;
}
return nrf5_setup_bank(bank);
} }
@ -1214,9 +1231,7 @@ static int nrf5_write(struct flash_bank *bank, const uint8_t *buffer,
} }
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
assert(offset % 4 == 0); assert(offset % 4 == 0);
assert(count % 4 == 0); assert(count % 4 == 0);
@ -1276,9 +1291,7 @@ static int nrf5_erase(struct flash_bank *bank, unsigned int first,
} }
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
/* UICR CLENR0 based protection used on nRF51 prevents erase /* UICR CLENR0 based protection used on nRF51 prevents erase
* absolutely silently. NVMC has no flag to indicate the protection * absolutely silently. NVMC has no flag to indicate the protection
@ -1322,7 +1335,6 @@ error:
static void nrf5_free_driver_priv(struct flash_bank *bank) static void nrf5_free_driver_priv(struct flash_bank *bank)
{ {
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
if (!chip) if (!chip)
return; return;
@ -1372,8 +1384,8 @@ FLASH_BANK_COMMAND_HANDLER(nrf5_flash_bank_command)
case NRF53NET_UICR_BASE: case NRF53NET_UICR_BASE:
break; break;
default: default:
LOG_ERROR("Invalid bank address " TARGET_ADDR_FMT, bank->base); LOG_ERROR("Invalid nRF bank address " TARGET_ADDR_FMT, bank->base);
return ERROR_FAIL; return ERROR_FLASH_BANK_INVALID;
} }
chip = nrf5_get_chip(bank->target); chip = nrf5_get_chip(bank->target);
@ -1418,17 +1430,13 @@ COMMAND_HANDLER(nrf5_handle_mass_erase_command)
if (res != ERROR_OK) if (res != ERROR_OK)
return res; return res;
assert(bank);
if (target->state != TARGET_HALTED) { if (target->state != TARGET_HALTED) {
LOG_ERROR("Target not halted"); LOG_ERROR("Target not halted");
return ERROR_TARGET_NOT_HALTED; return ERROR_TARGET_NOT_HALTED;
} }
struct nrf5_bank *nbank = bank->driver_priv; struct nrf5_bank *nbank = bank->driver_priv;
assert(nbank);
struct nrf5_info *chip = nbank->chip; struct nrf5_info *chip = nbank->chip;
assert(chip);
if (chip->features & NRF5_FEATURE_SERIES_51) { if (chip->features & NRF5_FEATURE_SERIES_51) {
uint32_t ppfc; uint32_t ppfc;

View File

@ -223,6 +223,8 @@ static int ipc_poll_lock_stat(struct target *target, uint32_t ipc_id, bool lock_
{ {
int hr; int hr;
uint32_t reg_val; uint32_t reg_val;
struct armv7m_common *armv7m = target_to_armv7m(target);
bool is_cm0 = (armv7m->arm.arch == ARM_ARCH_V6M);
struct timeout to; struct timeout to;
timeout_init(&to, IPC_TIMEOUT_MS); timeout_init(&to, IPC_TIMEOUT_MS);
@ -244,7 +246,7 @@ static int ipc_poll_lock_stat(struct target *target, uint32_t ipc_id, bool lock_
return ERROR_OK; return ERROR_OK;
} }
if (target->coreid) { if (!is_cm0) {
LOG_WARNING("SROM API calls via CM4 target are supported on single-core PSoC6 devices only. " LOG_WARNING("SROM API calls via CM4 target are supported on single-core PSoC6 devices only. "
"Please perform all Flash-related operations via CM0+ target on dual-core devices."); "Please perform all Flash-related operations via CM0+ target on dual-core devices.");
} }
@ -886,7 +888,8 @@ static int handle_reset_halt(struct target *target)
{ {
int hr; int hr;
uint32_t reset_addr; uint32_t reset_addr;
bool is_cm0 = (target->coreid == 0); struct armv7m_common *armv7m = target_to_armv7m(target);
bool is_cm0 = (armv7m->arm.arch == ARM_ARCH_V6M);
/* Halt target device */ /* Halt target device */
if (target->state != TARGET_HALTED) { if (target->state != TARGET_HALTED) {

View File

@ -120,6 +120,12 @@
* http://www.st.com/resource/en/reference_manual/dm00346336.pdf * http://www.st.com/resource/en/reference_manual/dm00346336.pdf
*/ */
/* STM32U5xxx series for reference.
*
* RM0456 (STM32U5xx)
* http://www.st.com/resource/en/reference_manual/dm00477635.pdf
*/
/* Erase time can be as high as 25ms, 10x this and assume it's toast... */ /* Erase time can be as high as 25ms, 10x this and assume it's toast... */
#define FLASH_ERASE_TIMEOUT 250 #define FLASH_ERASE_TIMEOUT 250
@ -344,9 +350,17 @@ static const struct stm32l4_rev stm32g49_g4axx_revs[] = {
{ 0x1000, "A" }, { 0x1000, "A" },
}; };
static const struct stm32l4_rev stm32u53_u54xx_revs[] = {
{ 0x1000, "A" }, { 0x1001, "Z" },
};
static const struct stm32l4_rev stm32u57_u58xx_revs[] = { static const struct stm32l4_rev stm32u57_u58xx_revs[] = {
{ 0x1000, "A" }, { 0x1001, "Z" }, { 0x1003, "Y" }, { 0x2000, "B" }, { 0x1000, "A" }, { 0x1001, "Z" }, { 0x1003, "Y" }, { 0x2000, "B" },
{ 0x2001, "X" }, { 0x3000, "C" }, { 0x2001, "X" }, { 0x3000, "C" }, { 0x3001, "W" },
};
static const struct stm32l4_rev stm32u59_u5axx_revs[] = {
{ 0x3001, "X" },
}; };
static const struct stm32l4_rev stm32wba5x_revs[] = { static const struct stm32l4_rev stm32wba5x_revs[] = {
@ -418,6 +432,18 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
.otp_base = 0x1FFF7000, .otp_base = 0x1FFF7000,
.otp_size = 1024, .otp_size = 1024,
}, },
{
.id = DEVID_STM32U53_U54XX,
.revs = stm32u53_u54xx_revs,
.num_revs = ARRAY_SIZE(stm32u53_u54xx_revs),
.device_str = "STM32U535/U545",
.max_flash_size_kb = 512,
.flags = F_HAS_DUAL_BANK | F_QUAD_WORD_PROG | F_HAS_TZ | F_HAS_L5_FLASH_REGS,
.flash_regs_base = 0x40022000,
.fsize_addr = 0x0BFA07A0,
.otp_base = 0x0BFA0000,
.otp_size = 512,
},
{ {
.id = DEVID_STM32G05_G06XX, .id = DEVID_STM32G05_G06XX,
.revs = stm32g05_g06xx_revs, .revs = stm32g05_g06xx_revs,
@ -574,6 +600,18 @@ static const struct stm32l4_part_info stm32l4_parts[] = {
.otp_base = 0x1FFF7000, .otp_base = 0x1FFF7000,
.otp_size = 1024, .otp_size = 1024,
}, },
{
.id = DEVID_STM32U59_U5AXX,
.revs = stm32u59_u5axx_revs,
.num_revs = ARRAY_SIZE(stm32u59_u5axx_revs),
.device_str = "STM32U59/U5Axx",
.max_flash_size_kb = 4096,
.flags = F_HAS_DUAL_BANK | F_QUAD_WORD_PROG | F_HAS_TZ | F_HAS_L5_FLASH_REGS,
.flash_regs_base = 0x40022000,
.fsize_addr = 0x0BFA07A0,
.otp_base = 0x0BFA0000,
.otp_size = 512,
},
{ {
.id = DEVID_STM32U57_U58XX, .id = DEVID_STM32U57_U58XX,
.revs = stm32u57_u58xx_revs, .revs = stm32u57_u58xx_revs,
@ -2000,10 +2038,22 @@ static int stm32l4_probe(struct flash_bank *bank)
stm32l4_info->bank1_sectors = num_pages / 2; stm32l4_info->bank1_sectors = num_pages / 2;
} }
break; break;
case DEVID_STM32U53_U54XX:
case DEVID_STM32U57_U58XX: case DEVID_STM32U57_U58XX:
/* if flash size is max (2M) the device is always dual bank case DEVID_STM32U59_U5AXX:
* otherwise check DUALBANK /* according to RM0456 Rev 4, Chapter 7.3.1 and 7.9.13
* U53x/U54x have 512K max flash size:
* 512K variants are always in DUAL BANK mode
* 256K and 128K variants can be in DUAL BANK mode if FLASH_OPTR:DUALBANK is set
* U57x/U58x have 2M max flash size:
* 2M variants are always in DUAL BANK mode
* 1M variants can be in DUAL BANK mode if FLASH_OPTR:DUALBANK is set
* U59x/U5Ax have 4M max flash size:
* 4M variants are always in DUAL BANK mode
* 2M variants can be in DUAL BANK mode if FLASH_OPTR:DUALBANK is set
* Note: flash banks are always contiguous
*/ */
page_size_kb = 8; page_size_kb = 8;
num_pages = flash_size_kb / page_size_kb; num_pages = flash_size_kb / page_size_kb;
stm32l4_info->bank1_sectors = num_pages; stm32l4_info->bank1_sectors = num_pages;

View File

@ -89,6 +89,7 @@
#define DEVID_STM32L43_L44XX 0x435 #define DEVID_STM32L43_L44XX 0x435
#define DEVID_STM32C01XX 0x443 #define DEVID_STM32C01XX 0x443
#define DEVID_STM32C03XX 0x453 #define DEVID_STM32C03XX 0x453
#define DEVID_STM32U53_U54XX 0x455
#define DEVID_STM32G05_G06XX 0x456 #define DEVID_STM32G05_G06XX 0x456
#define DEVID_STM32G07_G08XX 0x460 #define DEVID_STM32G07_G08XX 0x460
#define DEVID_STM32L49_L4AXX 0x461 #define DEVID_STM32L49_L4AXX 0x461
@ -102,6 +103,7 @@
#define DEVID_STM32L4P_L4QXX 0x471 #define DEVID_STM32L4P_L4QXX 0x471
#define DEVID_STM32L55_L56XX 0x472 #define DEVID_STM32L55_L56XX 0x472
#define DEVID_STM32G49_G4AXX 0x479 #define DEVID_STM32G49_G4AXX 0x479
#define DEVID_STM32U59_U5AXX 0x481
#define DEVID_STM32U57_U58XX 0x482 #define DEVID_STM32U57_U58XX 0x482
#define DEVID_STM32WBA5X 0x492 #define DEVID_STM32WBA5X 0x492
#define DEVID_STM32WB1XX 0x494 #define DEVID_STM32WB1XX 0x494

View File

@ -5,7 +5,7 @@
# #
# program utility proc # program utility proc
# usage: program filename # usage: program filename
# optional args: verify, reset, exit and address # optional args: preverify, verify, reset, exit and address
# #
lappend _telnet_autocomplete_skip program_error lappend _telnet_autocomplete_skip program_error
@ -101,8 +101,8 @@ proc program {filename args} {
return return
} }
add_help_text program "write an image to flash, address is only required for binary images. verify, reset, exit are optional" add_help_text program "write an image to flash, address is only required for binary images. preverify, verify, reset, exit are optional"
add_usage_text program "<filename> \[address\] \[pre-verify\] \[verify\] \[reset\] \[exit\]" add_usage_text program "<filename> \[address\] \[preverify\] \[verify\] \[reset\] \[exit\]"
# stm32[f0x|f3x] uses the same flash driver as the stm32f1x # stm32[f0x|f3x] uses the same flash driver as the stm32f1x
proc stm32f0x args { eval stm32f1x $args } proc stm32f0x args { eval stm32f1x $args }

View File

@ -102,7 +102,6 @@ bool buf_cmp_mask(const void *_buf1, const void *_buf2,
return buf_cmp_trailing(buf1[last], buf2[last], mask[last], trailing); return buf_cmp_trailing(buf1[last], buf2[last], mask[last], trailing);
} }
void *buf_set_ones(void *_buf, unsigned size) void *buf_set_ones(void *_buf, unsigned size)
{ {
uint8_t *buf = _buf; uint8_t *buf = _buf;
@ -206,36 +205,75 @@ char *buf_to_hex_str(const void *_buf, unsigned buf_len)
return str; return str;
} }
/** identify radix, and skip radix-prefix (0, 0x or 0X) */ static bool str_has_hex_prefix(const char *s)
static void str_radix_guess(const char **_str, unsigned *_str_len,
unsigned *_radix)
{ {
unsigned radix = *_radix; /* Starts with "0x" or "0X" */
if (radix != 0) return (s[0] == '0') && (s[1] == 'x' || s[1] == 'X');
return;
const char *str = *_str;
unsigned str_len = *_str_len;
if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
radix = 16;
str += 2;
str_len -= 2;
} else if ((str[0] == '0') && (str_len != 1)) {
radix = 8;
str += 1;
str_len -= 1;
} else
radix = 10;
*_str = str;
*_str_len = str_len;
*_radix = radix;
} }
int str_to_buf(const char *str, unsigned str_len, static bool str_has_octal_prefix(const char *s)
void *_buf, unsigned buf_len, unsigned radix)
{ {
str_radix_guess(&str, &str_len, &radix); /* - starts with '0',
* - has at least two characters, and
* - the second character is not 'x' or 'X' */
return (s[0] == '0') && (s[1] != '\0') && (s[1] != 'x') && (s[1] != 'X');
}
float factor; /**
* Try to identify the radix of the number by looking at its prefix.
* No further validation of the number is preformed.
*/
static unsigned int str_radix_guess(const char *str)
{
assert(str);
if (str_has_hex_prefix(str))
return 16;
if (str_has_octal_prefix(str))
return 8;
/* Otherwise assume a decadic number. */
return 10;
}
/** Strip leading "0x" or "0X" from hex numbers or "0" from octal numbers. */
static void str_strip_number_prefix_if_present(const char **_str, unsigned int radix)
{
assert(radix == 16 || radix == 10 || radix == 8);
assert(_str);
const char *str = *_str;
assert(str);
if (radix == 16 && str_has_hex_prefix(str))
str += 2;
else if (radix == 8 && str_has_octal_prefix(str))
str += 1;
/* No prefix to strip for radix == 10. */
*_str = str;
}
int str_to_buf(const char *str, void *_buf, unsigned int buf_len,
unsigned int radix, unsigned int *_detected_radix)
{
assert(radix == 0 || radix == 8 || radix == 10 || radix == 16);
if (radix == 0)
radix = str_radix_guess(str);
if (_detected_radix)
*_detected_radix = radix;
str_strip_number_prefix_if_present(&str, radix);
const size_t str_len = strlen(str);
if (str_len == 0)
return ERROR_INVALID_NUMBER;
float factor = 0.0;
if (radix == 16) if (radix == 16)
factor = 0.5; /* log(16) / log(256) = 0.5 */ factor = 0.5; /* log(16) / log(256) = 0.5 */
else if (radix == 10) else if (radix == 10)
@ -243,41 +281,69 @@ int str_to_buf(const char *str, unsigned str_len,
else if (radix == 8) else if (radix == 8)
factor = 0.375; /* log(8) / log(256) = 0.375 */ factor = 0.375; /* log(8) / log(256) = 0.375 */
else else
return 0; assert(false);
/* copy to zero-terminated buffer */ const unsigned int b256_len = ceil_f_to_u32(str_len * factor);
char *charbuf = strndup(str, str_len);
/* number of digits in base-256 notation */ /* Allocate a buffer for digits in base-256 notation */
unsigned b256_len = ceil_f_to_u32(str_len * factor);
uint8_t *b256_buf = calloc(b256_len, 1); uint8_t *b256_buf = calloc(b256_len, 1);
if (!b256_buf) {
LOG_ERROR("Unable to allocate memory");
return ERROR_FAIL;
}
/* go through zero terminated buffer /* Go through the zero-terminated buffer
* input digits (ASCII) */ * of input digits (ASCII) */
unsigned i; for (unsigned int i = 0; str[i]; i++) {
for (i = 0; charbuf[i]; i++) { uint32_t tmp = str[i];
uint32_t tmp = charbuf[i]; if ((tmp >= '0') && (tmp <= '9')) {
if ((tmp >= '0') && (tmp <= '9'))
tmp = (tmp - '0'); tmp = (tmp - '0');
else if ((tmp >= 'a') && (tmp <= 'f')) } else if ((tmp >= 'a') && (tmp <= 'f')) {
tmp = (tmp - 'a' + 10); tmp = (tmp - 'a' + 10);
else if ((tmp >= 'A') && (tmp <= 'F')) } else if ((tmp >= 'A') && (tmp <= 'F')) {
tmp = (tmp - 'A' + 10); tmp = (tmp - 'A' + 10);
else } else {
continue; /* skip characters other than [0-9,a-f,A-F] */ /* Characters other than [0-9,a-f,A-F] are invalid */
free(b256_buf);
return ERROR_INVALID_NUMBER;
}
if (tmp >= radix) if (tmp >= radix) {
continue; /* skip digits invalid for the current radix */ /* Encountered a digit that is invalid for the current radix */
free(b256_buf);
return ERROR_INVALID_NUMBER;
}
/* base-256 digits */ /* Add the current digit (tmp) to the intermediate result
for (unsigned j = 0; j < b256_len; j++) { * in b256_buf (base-256 digits) */
for (unsigned int j = 0; j < b256_len; j++) {
tmp += (uint32_t)b256_buf[j] * radix; tmp += (uint32_t)b256_buf[j] * radix;
b256_buf[j] = (uint8_t)(tmp & 0xFF); b256_buf[j] = (uint8_t)(tmp & 0xFFu);
tmp >>= 8; tmp >>= 8;
} }
/* The b256_t buffer is large enough to contain the whole result. */
assert(tmp == 0);
} }
/* The result must not contain more bits than buf_len. */
/* Check the whole bytes: */
for (unsigned int j = DIV_ROUND_UP(buf_len, 8); j < b256_len; j++) {
if (b256_buf[j] != 0x0) {
free(b256_buf);
return ERROR_NUMBER_EXCEEDS_BUFFER;
}
}
/* Check the partial byte: */
if (buf_len % 8) {
const uint8_t mask = 0xFFu << (buf_len % 8);
if ((b256_buf[(buf_len / 8)] & mask) != 0x0) {
free(b256_buf);
return ERROR_NUMBER_EXCEEDS_BUFFER;
}
}
/* Copy the digits to the output buffer */
uint8_t *buf = _buf; uint8_t *buf = _buf;
for (unsigned j = 0; j < DIV_ROUND_UP(buf_len, 8); j++) { for (unsigned j = 0; j < DIV_ROUND_UP(buf_len, 8); j++) {
if (j < b256_len) if (j < b256_len)
@ -286,14 +352,8 @@ int str_to_buf(const char *str, unsigned str_len,
buf[j] = 0; buf[j] = 0;
} }
/* mask out bits that don't belong to the buffer */
if (buf_len % 8)
buf[(buf_len / 8)] &= 0xff >> (8 - (buf_len % 8));
free(b256_buf); free(b256_buf);
free(charbuf); return ERROR_OK;
return i;
} }
void bit_copy_queue_init(struct bit_copy_queue *q) void bit_copy_queue_init(struct bit_copy_queue *q)

View File

@ -14,6 +14,9 @@
#include <helper/list.h> #include <helper/list.h>
#include <helper/types.h> #include <helper/types.h>
#define ERROR_INVALID_NUMBER (-1700)
#define ERROR_NUMBER_EXCEEDS_BUFFER (-1701)
/** @file /** @file
* Support functions to access arbitrary bits in a byte array * Support functions to access arbitrary bits in a byte array
*/ */
@ -189,8 +192,18 @@ void *buf_set_ones(void *buf, unsigned size);
void *buf_set_buf(const void *src, unsigned src_start, void *buf_set_buf(const void *src, unsigned src_start,
void *dst, unsigned dst_start, unsigned len); void *dst, unsigned dst_start, unsigned len);
int str_to_buf(const char *str, unsigned len, /**
void *bin_buf, unsigned buf_size, unsigned radix); * Parse an unsigned number (provided as a zero-terminated string)
* into a bit buffer whose size is buf_len bits.
* @param str Input number, zero-terminated string
* @param _buf Output buffer, allocated by the caller
* @param buf_len Output buffer size in bits
* @param radix Base of the input number - 16, 10, 8 or 0.
* 0 means auto-detect the radix.
*/
int str_to_buf(const char *str, void *_buf, unsigned int buf_len,
unsigned int radix, unsigned int *_detected_radix);
char *buf_to_hex_str(const void *buf, unsigned size); char *buf_to_hex_str(const void *buf, unsigned size);
/* read a uint32_t from a buffer in target memory endianness */ /* read a uint32_t from a buffer in target memory endianness */

View File

@ -1360,6 +1360,46 @@ int command_parse_bool_arg(const char *in, bool *out)
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
} }
static const char *radix_to_str(unsigned int radix)
{
switch (radix) {
case 16: return "hexadecimal";
case 10: return "decadic";
case 8: return "octal";
}
assert(false);
return "";
}
COMMAND_HELPER(command_parse_str_to_buf, const char *str, void *buf, unsigned int buf_len,
unsigned int radix)
{
assert(str);
assert(buf);
int ret = str_to_buf(str, buf, buf_len, radix, NULL);
if (ret == ERROR_OK)
return ret;
/* Provide a clear error message to the user */
if (ret == ERROR_INVALID_NUMBER) {
if (radix == 0) {
/* Any radix is accepted, so don't include it in the error message. */
command_print(CMD, "'%s' is not a valid number", str);
} else {
/* Specific radix is required - tell the user what it is. */
command_print(CMD, "'%s' is not a valid number (requiring %s number)",
str, radix_to_str(radix));
}
} else if (ret == ERROR_NUMBER_EXCEEDS_BUFFER) {
command_print(CMD, "Number %s exceeds %u bits", str, buf_len);
} else {
command_print(CMD, "Could not parse number '%s'", str);
}
return ERROR_COMMAND_ARGUMENT_INVALID;
}
COMMAND_HELPER(handle_command_parse_bool, bool *out, const char *label) COMMAND_HELPER(handle_command_parse_bool, bool *out, const char *label)
{ {
switch (CMD_ARGC) { switch (CMD_ARGC) {

View File

@ -517,6 +517,17 @@ DECLARE_PARSE_WRAPPER(_target_addr, target_addr_t);
int command_parse_bool_arg(const char *in, bool *out); int command_parse_bool_arg(const char *in, bool *out);
COMMAND_HELPER(handle_command_parse_bool, bool *out, const char *label); COMMAND_HELPER(handle_command_parse_bool, bool *out, const char *label);
/**
* Parse a number (base 10, base 16 or base 8) and store the result
* into a bit buffer.
*
* In case of parsing error, a user-readable error message is produced.
*
* If radix = 0 is given, the function guesses the radix by looking at the number prefix.
*/
COMMAND_HELPER(command_parse_str_to_buf, const char *str, void *buf, unsigned int buf_len,
unsigned int radix);
/** parses an on/off command argument */ /** parses an on/off command argument */
#define COMMAND_PARSE_ON_OFF(in, out) \ #define COMMAND_PARSE_ON_OFF(in, out) \
COMMAND_PARSE_BOOL(in, out, "on", "off") COMMAND_PARSE_BOOL(in, out, "on", "off")

View File

@ -8,9 +8,7 @@
* identification code list, please visit the JEDEC website at www.jedec.org . * identification code list, please visit the JEDEC website at www.jedec.org .
*/ */
/* This file is aligned to revision JEP106BI January 2024. */ /* This file is aligned to revision JEP106BJ.01 July 2024. */
/* "NXP (Philips)" is reported below, while missing since JEP106BG */
[0][0x01 - 1] = "AMD", [0][0x01 - 1] = "AMD",
[0][0x02 - 1] = "AMI", [0][0x02 - 1] = "AMI",
@ -30,7 +28,7 @@
[0][0x10 - 1] = "NEC", [0][0x10 - 1] = "NEC",
[0][0x11 - 1] = "RCA", [0][0x11 - 1] = "RCA",
[0][0x12 - 1] = "Raytheon", [0][0x12 - 1] = "Raytheon",
[0][0x13 - 1] = "Conexant (Rockwell)", [0][0x13 - 1] = "Synaptics",
[0][0x14 - 1] = "Seeq", [0][0x14 - 1] = "Seeq",
[0][0x15 - 1] = "NXP (Philips)", [0][0x15 - 1] = "NXP (Philips)",
[0][0x16 - 1] = "Synertek", [0][0x16 - 1] = "Synertek",
@ -1045,7 +1043,7 @@
[8][0x17 - 1] = "Axell Corporation", [8][0x17 - 1] = "Axell Corporation",
[8][0x18 - 1] = "Essencore Limited", [8][0x18 - 1] = "Essencore Limited",
[8][0x19 - 1] = "Phytium", [8][0x19 - 1] = "Phytium",
[8][0x1a - 1] = "Xi'an UniIC Semiconductors Co Ltd", [8][0x1a - 1] = "UniIC Semiconductors Co Ltd",
[8][0x1b - 1] = "Ambiq Micro", [8][0x1b - 1] = "Ambiq Micro",
[8][0x1c - 1] = "eveRAM Technology Inc", [8][0x1c - 1] = "eveRAM Technology Inc",
[8][0x1d - 1] = "Infomax", [8][0x1d - 1] = "Infomax",
@ -1452,7 +1450,7 @@
[11][0x34 - 1] = "Acacia Communications", [11][0x34 - 1] = "Acacia Communications",
[11][0x35 - 1] = "Beijinjinshengyihe Technology Co Ltd", [11][0x35 - 1] = "Beijinjinshengyihe Technology Co Ltd",
[11][0x36 - 1] = "Zyzyx", [11][0x36 - 1] = "Zyzyx",
[11][0x37 - 1] = "T-HEAD Semiconductor Co Ltd", [11][0x37 - 1] = "C-SKY Microsystems Co Ltd",
[11][0x38 - 1] = "Shenzhen Hystou Technology Co Ltd", [11][0x38 - 1] = "Shenzhen Hystou Technology Co Ltd",
[11][0x39 - 1] = "Syzexion", [11][0x39 - 1] = "Syzexion",
[11][0x3a - 1] = "Kembona", [11][0x3a - 1] = "Kembona",
@ -1938,4 +1936,31 @@
[15][0x22 - 1] = "SkyeChip", [15][0x22 - 1] = "SkyeChip",
[15][0x23 - 1] = "Guangzhou Kaishile Trading Co Ltd", [15][0x23 - 1] = "Guangzhou Kaishile Trading Co Ltd",
[15][0x24 - 1] = "Jing Pai Digital Technology (Shenzhen) Co", [15][0x24 - 1] = "Jing Pai Digital Technology (Shenzhen) Co",
[15][0x25 - 1] = "Memoritek",
[15][0x26 - 1] = "Zhejiang Hikstor Technology Co Ltd",
[15][0x27 - 1] = "Memoritek PTE Ltd",
[15][0x28 - 1] = "Longsailing Semiconductor Co Ltd",
[15][0x29 - 1] = "LX Semicon",
[15][0x2a - 1] = "Shenzhen Techwinsemi Technology Co Ltd",
[15][0x2b - 1] = "AOC",
[15][0x2c - 1] = "GOEPEL Electronic GmbH",
[15][0x2d - 1] = "Shenzhen G-Bong Technology Co Ltd",
[15][0x2e - 1] = "Openedges Technology Inc",
[15][0x2f - 1] = "EA Semi Shangahi Limited",
[15][0x30 - 1] = "EMBCORF",
[15][0x31 - 1] = "Shenzhen MicroBT Electronics Technology",
[15][0x32 - 1] = "Shanghai Simor Chip Semiconductor Co",
[15][0x33 - 1] = "Xllbyte",
[15][0x34 - 1] = "Guangzhou Maidite Electronics Co Ltd.",
[15][0x35 - 1] = "Zhejiang Changchun Technology Co Ltd",
[15][0x36 - 1] = "Beijing Cloud Security Technology Co Ltd",
[15][0x37 - 1] = "SSTC Technology and Distribution Inc",
[15][0x38 - 1] = "Shenzhen Panmin Technology Co Ltd",
[15][0x39 - 1] = "ITE Tech Inc",
[15][0x3a - 1] = "Beijing Zettastone Technology Co Ltd",
[15][0x3b - 1] = "Powerchip Micro Device",
[15][0x3c - 1] = "Shenzhen Ysemi Computing Co Ltd",
[15][0x3d - 1] = "Shenzhen Titan Micro Electronics Co Ltd",
[15][0x3e - 1] = "Shenzhen Macroflash Technology Co Ltd",
[15][0x3f - 1] = "Advantech Group",
/* EOF */ /* EOF */

View File

@ -166,10 +166,9 @@ void jtag_scan_field_clone(struct scan_field *dst, const struct scan_field *src)
enum scan_type jtag_scan_type(const struct scan_command *cmd) enum scan_type jtag_scan_type(const struct scan_command *cmd)
{ {
int i;
int type = 0; int type = 0;
for (i = 0; i < cmd->num_fields; i++) { for (unsigned int i = 0; i < cmd->num_fields; i++) {
if (cmd->fields[i].in_value) if (cmd->fields[i].in_value)
type |= SCAN_IN; type |= SCAN_IN;
if (cmd->fields[i].out_value) if (cmd->fields[i].out_value)
@ -179,13 +178,12 @@ enum scan_type jtag_scan_type(const struct scan_command *cmd)
return type; return type;
} }
int jtag_scan_size(const struct scan_command *cmd) unsigned int jtag_scan_size(const struct scan_command *cmd)
{ {
int bit_count = 0; unsigned int bit_count = 0;
int i;
/* count bits in scan command */ /* count bits in scan command */
for (i = 0; i < cmd->num_fields; i++) for (unsigned int i = 0; i < cmd->num_fields; i++)
bit_count += cmd->fields[i].num_bits; bit_count += cmd->fields[i].num_bits;
return bit_count; return bit_count;
@ -193,19 +191,16 @@ int jtag_scan_size(const struct scan_command *cmd)
int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer) int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer)
{ {
int bit_count = 0; unsigned int bit_count = jtag_scan_size(cmd);
int i;
bit_count = jtag_scan_size(cmd);
*buffer = calloc(1, DIV_ROUND_UP(bit_count, 8)); *buffer = calloc(1, DIV_ROUND_UP(bit_count, 8));
bit_count = 0; bit_count = 0;
LOG_DEBUG_IO("%s num_fields: %i", LOG_DEBUG_IO("%s num_fields: %u",
cmd->ir_scan ? "IRSCAN" : "DRSCAN", cmd->ir_scan ? "IRSCAN" : "DRSCAN",
cmd->num_fields); cmd->num_fields);
for (i = 0; i < cmd->num_fields; i++) { for (unsigned int i = 0; i < cmd->num_fields; i++) {
if (cmd->fields[i].out_value) { if (cmd->fields[i].out_value) {
if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) { if (LOG_LEVEL_IS(LOG_LVL_DEBUG_IO)) {
char *char_buf = buf_to_hex_str(cmd->fields[i].out_value, char *char_buf = buf_to_hex_str(cmd->fields[i].out_value,
@ -213,14 +208,14 @@ int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer)
? DEBUG_JTAG_IOZ ? DEBUG_JTAG_IOZ
: cmd->fields[i].num_bits); : cmd->fields[i].num_bits);
LOG_DEBUG("fields[%i].out_value[%i]: 0x%s", i, LOG_DEBUG("fields[%u].out_value[%u]: 0x%s", i,
cmd->fields[i].num_bits, char_buf); cmd->fields[i].num_bits, char_buf);
free(char_buf); free(char_buf);
} }
buf_set_buf(cmd->fields[i].out_value, 0, *buffer, buf_set_buf(cmd->fields[i].out_value, 0, *buffer,
bit_count, cmd->fields[i].num_bits); bit_count, cmd->fields[i].num_bits);
} else { } else {
LOG_DEBUG_IO("fields[%i].out_value[%i]: NULL", LOG_DEBUG_IO("fields[%u].out_value[%u]: NULL",
i, cmd->fields[i].num_bits); i, cmd->fields[i].num_bits);
} }
@ -234,19 +229,18 @@ int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer)
int jtag_read_buffer(uint8_t *buffer, const struct scan_command *cmd) int jtag_read_buffer(uint8_t *buffer, const struct scan_command *cmd)
{ {
int i;
int bit_count = 0; int bit_count = 0;
int retval; int retval;
/* we return ERROR_OK, unless a check fails, or a handler reports a problem */ /* we return ERROR_OK, unless a check fails, or a handler reports a problem */
retval = ERROR_OK; retval = ERROR_OK;
for (i = 0; i < cmd->num_fields; i++) { for (unsigned int i = 0; i < cmd->num_fields; i++) {
/* if neither in_value nor in_handler /* if neither in_value nor in_handler
* are specified we don't have to examine this field * are specified we don't have to examine this field
*/ */
if (cmd->fields[i].in_value) { if (cmd->fields[i].in_value) {
int num_bits = cmd->fields[i].num_bits; const unsigned int num_bits = cmd->fields[i].num_bits;
uint8_t *captured = buf_set_buf(buffer, bit_count, uint8_t *captured = buf_set_buf(buffer, bit_count,
malloc(DIV_ROUND_UP(num_bits, 8)), 0, num_bits); malloc(DIV_ROUND_UP(num_bits, 8)), 0, num_bits);
@ -256,7 +250,7 @@ int jtag_read_buffer(uint8_t *buffer, const struct scan_command *cmd)
? DEBUG_JTAG_IOZ ? DEBUG_JTAG_IOZ
: num_bits); : num_bits);
LOG_DEBUG("fields[%i].in_value[%i]: 0x%s", LOG_DEBUG("fields[%u].in_value[%u]: 0x%s",
i, num_bits, char_buf); i, num_bits, char_buf);
free(char_buf); free(char_buf);
} }

View File

@ -36,7 +36,7 @@ struct scan_command {
/** instruction/not data scan */ /** instruction/not data scan */
bool ir_scan; bool ir_scan;
/** number of fields in *fields array */ /** number of fields in *fields array */
int num_fields; unsigned int num_fields;
/** pointer to an array of data scan fields */ /** pointer to an array of data scan fields */
struct scan_field *fields; struct scan_field *fields;
/** state in which JTAG commands should finish */ /** state in which JTAG commands should finish */
@ -50,14 +50,14 @@ struct statemove_command {
struct pathmove_command { struct pathmove_command {
/** number of states in *path */ /** number of states in *path */
int num_states; unsigned int num_states;
/** states that have to be passed */ /** states that have to be passed */
tap_state_t *path; tap_state_t *path;
}; };
struct runtest_command { struct runtest_command {
/** number of cycles to spend in Run-Test/Idle state */ /** number of cycles to spend in Run-Test/Idle state */
int num_cycles; unsigned int num_cycles;
/** state in which JTAG commands should finish */ /** state in which JTAG commands should finish */
tap_state_t end_state; tap_state_t end_state;
}; };
@ -65,7 +65,7 @@ struct runtest_command {
struct stableclocks_command { struct stableclocks_command {
/** number of clock cycles that should be sent */ /** number of clock cycles that should be sent */
int num_cycles; unsigned int num_cycles;
}; };
@ -100,7 +100,7 @@ struct sleep_command {
*/ */
struct tms_command { struct tms_command {
/** How many bits should be clocked out. */ /** How many bits should be clocked out. */
unsigned num_bits; unsigned int num_bits;
/** The bits to clock out; the LSB is bit 0 of bits[0]. */ /** The bits to clock out; the LSB is bit 0 of bits[0]. */
const uint8_t *bits; const uint8_t *bits;
}; };
@ -157,7 +157,7 @@ struct jtag_command *jtag_command_queue_get(void);
void jtag_scan_field_clone(struct scan_field *dst, const struct scan_field *src); void jtag_scan_field_clone(struct scan_field *dst, const struct scan_field *src);
enum scan_type jtag_scan_type(const struct scan_command *cmd); enum scan_type jtag_scan_type(const struct scan_command *cmd);
int jtag_scan_size(const struct scan_command *cmd); unsigned int jtag_scan_size(const struct scan_command *cmd);
int jtag_read_buffer(uint8_t *buffer, const struct scan_command *cmd); int jtag_read_buffer(uint8_t *buffer, const struct scan_command *cmd);
int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer); int jtag_build_buffer(const struct scan_command *cmd, uint8_t **buffer);

View File

@ -39,7 +39,7 @@
#include "server/ipdbg.h" #include "server/ipdbg.h"
/** The number of JTAG queue flushes (for profiling and debugging purposes). */ /** The number of JTAG queue flushes (for profiling and debugging purposes). */
static int jtag_flush_queue_count; static unsigned int jtag_flush_queue_count;
/* Sleep this # of ms after flushing the queue */ /* Sleep this # of ms after flushing the queue */
static int jtag_flush_queue_sleep; static int jtag_flush_queue_sleep;
@ -88,14 +88,14 @@ static enum reset_types jtag_reset_config = RESET_NONE;
tap_state_t cmd_queue_cur_state = TAP_RESET; tap_state_t cmd_queue_cur_state = TAP_RESET;
static bool jtag_verify_capture_ir = true; static bool jtag_verify_capture_ir = true;
static int jtag_verify = 1; static bool jtag_verify = true;
/* how long the OpenOCD should wait before attempting JTAG communication after reset lines /* how long the OpenOCD should wait before attempting JTAG communication after reset lines
*deasserted (in ms) */ *deasserted (in ms) */
static int adapter_nsrst_delay; /* default to no nSRST delay */ static unsigned int adapter_nsrst_delay; /* default to no nSRST delay */
static int jtag_ntrst_delay;/* default to no nTRST delay */ static unsigned int jtag_ntrst_delay;/* default to no nTRST delay */
static int adapter_nsrst_assert_width; /* width of assertion */ static unsigned int adapter_nsrst_assert_width; /* width of assertion */
static int jtag_ntrst_assert_width; /* width of assertion */ static unsigned int jtag_ntrst_assert_width; /* width of assertion */
/** /**
* Contains a single callback along with a pointer that will be passed * Contains a single callback along with a pointer that will be passed
@ -186,10 +186,10 @@ struct jtag_tap *jtag_all_taps(void)
return __jtag_all_taps; return __jtag_all_taps;
}; };
unsigned jtag_tap_count(void) unsigned int jtag_tap_count(void)
{ {
struct jtag_tap *t = jtag_all_taps(); struct jtag_tap *t = jtag_all_taps();
unsigned n = 0; unsigned int n = 0;
while (t) { while (t) {
n++; n++;
t = t->next_tap; t = t->next_tap;
@ -197,10 +197,10 @@ unsigned jtag_tap_count(void)
return n; return n;
} }
unsigned jtag_tap_count_enabled(void) unsigned int jtag_tap_count_enabled(void)
{ {
struct jtag_tap *t = jtag_all_taps(); struct jtag_tap *t = jtag_all_taps();
unsigned n = 0; unsigned int n = 0;
while (t) { while (t) {
if (t->enabled) if (t->enabled)
n++; n++;
@ -212,7 +212,7 @@ unsigned jtag_tap_count_enabled(void)
/** Append a new TAP to the chain of all taps. */ /** Append a new TAP to the chain of all taps. */
static void jtag_tap_add(struct jtag_tap *t) static void jtag_tap_add(struct jtag_tap *t)
{ {
unsigned jtag_num_taps = 0; unsigned int jtag_num_taps = 0;
struct jtag_tap **tap = &__jtag_all_taps; struct jtag_tap **tap = &__jtag_all_taps;
while (*tap) { while (*tap) {
@ -499,7 +499,7 @@ void jtag_add_tlr(void)
* *
* @todo Update naming conventions to stop assuming everything is JTAG. * @todo Update naming conventions to stop assuming everything is JTAG.
*/ */
int jtag_add_tms_seq(unsigned nbits, const uint8_t *seq, enum tap_state state) int jtag_add_tms_seq(unsigned int nbits, const uint8_t *seq, enum tap_state state)
{ {
int retval; int retval;
@ -514,7 +514,7 @@ int jtag_add_tms_seq(unsigned nbits, const uint8_t *seq, enum tap_state state)
return retval; return retval;
} }
void jtag_add_pathmove(int num_states, const tap_state_t *path) void jtag_add_pathmove(unsigned int num_states, const tap_state_t *path)
{ {
tap_state_t cur_state = cmd_queue_cur_state; tap_state_t cur_state = cmd_queue_cur_state;
@ -525,7 +525,7 @@ void jtag_add_pathmove(int num_states, const tap_state_t *path)
return; return;
} }
for (int i = 0; i < num_states; i++) { for (unsigned int i = 0; i < num_states; i++) {
if (path[i] == TAP_RESET) { if (path[i] == TAP_RESET) {
LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences"); LOG_ERROR("BUG: TAP_RESET is not a valid state for pathmove sequences");
jtag_set_error(ERROR_JTAG_STATE_INVALID); jtag_set_error(ERROR_JTAG_STATE_INVALID);
@ -567,12 +567,12 @@ int jtag_add_statemove(tap_state_t goal_state)
/* nothing to do */; /* nothing to do */;
else if (tap_is_state_stable(cur_state) && tap_is_state_stable(goal_state)) { else if (tap_is_state_stable(cur_state) && tap_is_state_stable(goal_state)) {
unsigned tms_bits = tap_get_tms_path(cur_state, goal_state); unsigned int tms_bits = tap_get_tms_path(cur_state, goal_state);
unsigned tms_count = tap_get_tms_path_len(cur_state, goal_state); unsigned int tms_count = tap_get_tms_path_len(cur_state, goal_state);
tap_state_t moves[8]; tap_state_t moves[8];
assert(tms_count < ARRAY_SIZE(moves)); assert(tms_count < ARRAY_SIZE(moves));
for (unsigned i = 0; i < tms_count; i++, tms_bits >>= 1) { for (unsigned int i = 0; i < tms_count; i++, tms_bits >>= 1) {
bool bit = tms_bits & 1; bool bit = tms_bits & 1;
cur_state = tap_state_transition(cur_state, bit); cur_state = tap_state_transition(cur_state, bit);
@ -589,14 +589,14 @@ int jtag_add_statemove(tap_state_t goal_state)
return ERROR_OK; return ERROR_OK;
} }
void jtag_add_runtest(int num_cycles, tap_state_t state) void jtag_add_runtest(unsigned int num_cycles, tap_state_t state)
{ {
jtag_prelude(state); jtag_prelude(state);
jtag_set_error(interface_jtag_add_runtest(num_cycles, state)); jtag_set_error(interface_jtag_add_runtest(num_cycles, state));
} }
void jtag_add_clocks(int num_cycles) void jtag_add_clocks(unsigned int num_cycles)
{ {
if (!tap_is_state_stable(cmd_queue_cur_state)) { if (!tap_is_state_stable(cmd_queue_cur_state)) {
LOG_ERROR("jtag_add_clocks() called with TAP in unstable state \"%s\"", LOG_ERROR("jtag_add_clocks() called with TAP in unstable state \"%s\"",
@ -960,16 +960,16 @@ int default_interface_jtag_execute_queue(void)
LOG_DEBUG_IO("JTAG %s SCAN to %s", LOG_DEBUG_IO("JTAG %s SCAN to %s",
cmd->cmd.scan->ir_scan ? "IR" : "DR", cmd->cmd.scan->ir_scan ? "IR" : "DR",
tap_state_name(cmd->cmd.scan->end_state)); tap_state_name(cmd->cmd.scan->end_state));
for (int i = 0; i < cmd->cmd.scan->num_fields; i++) { for (unsigned int i = 0; i < cmd->cmd.scan->num_fields; i++) {
struct scan_field *field = cmd->cmd.scan->fields + i; struct scan_field *field = cmd->cmd.scan->fields + i;
if (field->out_value) { if (field->out_value) {
char *str = buf_to_hex_str(field->out_value, field->num_bits); char *str = buf_to_hex_str(field->out_value, field->num_bits);
LOG_DEBUG_IO(" %db out: %s", field->num_bits, str); LOG_DEBUG_IO(" %ub out: %s", field->num_bits, str);
free(str); free(str);
} }
if (field->in_value) { if (field->in_value) {
char *str = buf_to_hex_str(field->in_value, field->num_bits); char *str = buf_to_hex_str(field->in_value, field->num_bits);
LOG_DEBUG_IO(" %db in: %s", field->num_bits, str); LOG_DEBUG_IO(" %ub in: %s", field->num_bits, str);
free(str); free(str);
} }
} }
@ -1029,7 +1029,7 @@ void jtag_execute_queue_noclear(void)
} }
} }
int jtag_get_flush_queue_count(void) unsigned int jtag_get_flush_queue_count(void)
{ {
return jtag_flush_queue_count; return jtag_flush_queue_count;
} }
@ -1081,7 +1081,7 @@ void jtag_sleep(uint32_t us)
/* a larger IR length than we ever expect to autoprobe */ /* a larger IR length than we ever expect to autoprobe */
#define JTAG_IRLEN_MAX 60 #define JTAG_IRLEN_MAX 60
static int jtag_examine_chain_execute(uint8_t *idcode_buffer, unsigned num_idcode) static int jtag_examine_chain_execute(uint8_t *idcode_buffer, unsigned int num_idcode)
{ {
struct scan_field field = { struct scan_field field = {
.num_bits = num_idcode * 32, .num_bits = num_idcode * 32,
@ -1090,7 +1090,7 @@ static int jtag_examine_chain_execute(uint8_t *idcode_buffer, unsigned num_idcod
}; };
/* initialize to the end of chain ID value */ /* initialize to the end of chain ID value */
for (unsigned i = 0; i < num_idcode; i++) for (unsigned int i = 0; i < num_idcode; i++)
buf_set_u32(idcode_buffer, i * 32, 32, END_OF_CHAIN_FLAG); buf_set_u32(idcode_buffer, i * 32, 32, END_OF_CHAIN_FLAG);
jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value, TAP_DRPAUSE); jtag_add_plain_dr_scan(field.num_bits, field.out_value, field.in_value, TAP_DRPAUSE);
@ -1098,12 +1098,12 @@ static int jtag_examine_chain_execute(uint8_t *idcode_buffer, unsigned num_idcod
return jtag_execute_queue(); return jtag_execute_queue();
} }
static bool jtag_examine_chain_check(uint8_t *idcodes, unsigned count) static bool jtag_examine_chain_check(uint8_t *idcodes, unsigned int count)
{ {
uint8_t zero_check = 0x0; uint8_t zero_check = 0x0;
uint8_t one_check = 0xff; uint8_t one_check = 0xff;
for (unsigned i = 0; i < count * 4; i++) { for (unsigned int i = 0; i < count * 4; i++) {
zero_check |= idcodes[i]; zero_check |= idcodes[i];
one_check &= idcodes[i]; one_check &= idcodes[i];
} }
@ -1158,7 +1158,8 @@ static bool jtag_idcode_is_final(uint32_t idcode)
* with the JTAG chain earlier, gives more helpful/explicit error messages. * with the JTAG chain earlier, gives more helpful/explicit error messages.
* Returns TRUE iff garbage was found. * Returns TRUE iff garbage was found.
*/ */
static bool jtag_examine_chain_end(uint8_t *idcodes, unsigned count, unsigned max) static bool jtag_examine_chain_end(uint8_t *idcodes, unsigned int count,
unsigned int max)
{ {
bool triggered = false; bool triggered = false;
for (; count < max - 31; count += 32) { for (; count < max - 31; count += 32) {
@ -1185,26 +1186,26 @@ static bool jtag_examine_chain_match_tap(const struct jtag_tap *tap)
uint32_t idcode = tap->idcode & mask; uint32_t idcode = tap->idcode & mask;
/* Loop over the expected identification codes and test for a match */ /* Loop over the expected identification codes and test for a match */
for (unsigned ii = 0; ii < tap->expected_ids_cnt; ii++) { for (unsigned int i = 0; i < tap->expected_ids_cnt; i++) {
uint32_t expected = tap->expected_ids[ii] & mask; uint32_t expected = tap->expected_ids[i] & mask;
if (idcode == expected) if (idcode == expected)
return true; return true;
/* treat "-expected-id 0" as a "don't-warn" wildcard */ /* treat "-expected-id 0" as a "don't-warn" wildcard */
if (tap->expected_ids[ii] == 0) if (tap->expected_ids[i] == 0)
return true; return true;
} }
/* If none of the expected ids matched, warn */ /* If none of the expected ids matched, warn */
jtag_examine_chain_display(LOG_LVL_WARNING, "UNEXPECTED", jtag_examine_chain_display(LOG_LVL_WARNING, "UNEXPECTED",
tap->dotted_name, tap->idcode); tap->dotted_name, tap->idcode);
for (unsigned ii = 0; ii < tap->expected_ids_cnt; ii++) { for (unsigned int i = 0; i < tap->expected_ids_cnt; i++) {
char msg[32]; char msg[32];
snprintf(msg, sizeof(msg), "expected %u of %u", ii + 1, tap->expected_ids_cnt); snprintf(msg, sizeof(msg), "expected %u of %u", i + 1, tap->expected_ids_cnt);
jtag_examine_chain_display(LOG_LVL_ERROR, msg, jtag_examine_chain_display(LOG_LVL_ERROR, msg,
tap->dotted_name, tap->expected_ids[ii]); tap->dotted_name, tap->expected_ids[i]);
} }
return false; return false;
} }
@ -1215,7 +1216,7 @@ static bool jtag_examine_chain_match_tap(const struct jtag_tap *tap)
static int jtag_examine_chain(void) static int jtag_examine_chain(void)
{ {
int retval; int retval;
unsigned max_taps = jtag_tap_count(); unsigned int max_taps = jtag_tap_count();
/* Autoprobe up to this many. */ /* Autoprobe up to this many. */
if (max_taps < JTAG_MAX_AUTO_TAPS) if (max_taps < JTAG_MAX_AUTO_TAPS)
@ -1243,9 +1244,9 @@ static int jtag_examine_chain(void)
/* Point at the 1st predefined tap, if any */ /* Point at the 1st predefined tap, if any */
struct jtag_tap *tap = jtag_tap_next_enabled(NULL); struct jtag_tap *tap = jtag_tap_next_enabled(NULL);
unsigned bit_count = 0; unsigned int bit_count = 0;
unsigned autocount = 0; unsigned int autocount = 0;
for (unsigned i = 0; i < max_taps; i++) { for (unsigned int i = 0; i < max_taps; i++) {
assert(bit_count < max_taps * 32); assert(bit_count < max_taps * 32);
uint32_t idcode = buf_get_u32(idcode_buffer, bit_count, 32); uint32_t idcode = buf_get_u32(idcode_buffer, bit_count, 32);
@ -1337,7 +1338,7 @@ static int jtag_validate_ircapture(void)
int retval; int retval;
/* when autoprobing, accommodate huge IR lengths */ /* when autoprobing, accommodate huge IR lengths */
int total_ir_length = 0; unsigned int total_ir_length = 0;
for (tap = jtag_tap_next_enabled(NULL); tap; tap = jtag_tap_next_enabled(tap)) { for (tap = jtag_tap_next_enabled(NULL); tap; tap = jtag_tap_next_enabled(tap)) {
if (tap->ir_length == 0) if (tap->ir_length == 0)
total_ir_length += JTAG_IRLEN_MAX; total_ir_length += JTAG_IRLEN_MAX;
@ -1396,7 +1397,7 @@ static int jtag_validate_ircapture(void)
&& tap->ir_length < JTAG_IRLEN_MAX) { && tap->ir_length < JTAG_IRLEN_MAX) {
tap->ir_length++; tap->ir_length++;
} }
LOG_WARNING("AUTO %s - use \"jtag newtap %s %s -irlen %d " LOG_WARNING("AUTO %s - use \"jtag newtap %s %s -irlen %u "
"-expected-id 0x%08" PRIx32 "\"", "-expected-id 0x%08" PRIx32 "\"",
tap->dotted_name, tap->chip, tap->tapname, tap->ir_length, tap->idcode); tap->dotted_name, tap->chip, tap->tapname, tap->ir_length, tap->idcode);
} }
@ -1445,8 +1446,8 @@ done:
void jtag_tap_init(struct jtag_tap *tap) void jtag_tap_init(struct jtag_tap *tap)
{ {
unsigned ir_len_bits; unsigned int ir_len_bits;
unsigned ir_len_bytes; unsigned int ir_len_bytes;
/* if we're autoprobing, cope with potentially huge ir_length */ /* if we're autoprobing, cope with potentially huge ir_length */
ir_len_bits = tap->ir_length ? tap->ir_length : JTAG_IRLEN_MAX; ir_len_bits = tap->ir_length ? tap->ir_length : JTAG_IRLEN_MAX;
@ -1471,8 +1472,8 @@ void jtag_tap_init(struct jtag_tap *tap)
jtag_register_event_callback(&jtag_reset_callback, tap); jtag_register_event_callback(&jtag_reset_callback, tap);
jtag_tap_add(tap); jtag_tap_add(tap);
LOG_DEBUG("Created Tap: %s @ abs position %d, " LOG_DEBUG("Created Tap: %s @ abs position %u, "
"irlen %d, capture: 0x%x mask: 0x%x", tap->dotted_name, "irlen %u, capture: 0x%x mask: 0x%x", tap->dotted_name,
tap->abs_chain_position, tap->ir_length, tap->abs_chain_position, tap->ir_length,
(unsigned) tap->ir_capture_value, (unsigned) tap->ir_capture_value,
(unsigned) tap->ir_capture_mask); (unsigned) tap->ir_capture_mask);
@ -1749,37 +1750,36 @@ int jtag_get_srst(void)
return jtag_srst == 1; return jtag_srst == 1;
} }
void jtag_set_nsrst_delay(unsigned delay) void jtag_set_nsrst_delay(unsigned int delay)
{ {
adapter_nsrst_delay = delay; adapter_nsrst_delay = delay;
} }
unsigned jtag_get_nsrst_delay(void) unsigned int jtag_get_nsrst_delay(void)
{ {
return adapter_nsrst_delay; return adapter_nsrst_delay;
} }
void jtag_set_ntrst_delay(unsigned delay) void jtag_set_ntrst_delay(unsigned int delay)
{ {
jtag_ntrst_delay = delay; jtag_ntrst_delay = delay;
} }
unsigned jtag_get_ntrst_delay(void) unsigned int jtag_get_ntrst_delay(void)
{ {
return jtag_ntrst_delay; return jtag_ntrst_delay;
} }
void jtag_set_nsrst_assert_width(unsigned int delay)
void jtag_set_nsrst_assert_width(unsigned delay)
{ {
adapter_nsrst_assert_width = delay; adapter_nsrst_assert_width = delay;
} }
unsigned jtag_get_nsrst_assert_width(void) unsigned int jtag_get_nsrst_assert_width(void)
{ {
return adapter_nsrst_assert_width; return adapter_nsrst_assert_width;
} }
void jtag_set_ntrst_assert_width(unsigned delay) void jtag_set_ntrst_assert_width(unsigned int delay)
{ {
jtag_ntrst_assert_width = delay; jtag_ntrst_assert_width = delay;
} }
unsigned jtag_get_ntrst_assert_width(void) unsigned int jtag_get_ntrst_assert_width(void)
{ {
return jtag_ntrst_assert_width; return jtag_ntrst_assert_width;
} }

View File

@ -203,7 +203,7 @@ static void amt_jtagaccel_state_move(void)
tap_set_state(end_state); tap_set_state(end_state);
} }
static void amt_jtagaccel_runtest(int num_cycles) static void amt_jtagaccel_runtest(unsigned int num_cycles)
{ {
int i = 0; int i = 0;
uint8_t aw_scan_tms_5; uint8_t aw_scan_tms_5;

View File

@ -1836,15 +1836,17 @@ static int angie_reset(int trst, int srst)
*/ */
static int angie_queue_pathmove(struct angie *device, struct jtag_command *cmd) static int angie_queue_pathmove(struct angie *device, struct jtag_command *cmd)
{ {
int ret, i, num_states, batch_size, state_count; int ret, state_count;
tap_state_t *path; tap_state_t *path;
uint8_t tms_sequence; uint8_t tms_sequence;
num_states = cmd->cmd.pathmove->num_states; unsigned int num_states = cmd->cmd.pathmove->num_states;
path = cmd->cmd.pathmove->path; path = cmd->cmd.pathmove->path;
state_count = 0; state_count = 0;
while (num_states > 0) { while (num_states > 0) {
unsigned int batch_size;
tms_sequence = 0; tms_sequence = 0;
/* Determine batch size */ /* Determine batch size */
@ -1853,7 +1855,7 @@ static int angie_queue_pathmove(struct angie *device, struct jtag_command *cmd)
else else
batch_size = num_states; batch_size = num_states;
for (i = 0; i < batch_size; i++) { for (unsigned int i = 0; i < batch_size; i++) {
if (tap_state_transition(tap_get_state(), false) == path[state_count]) { if (tap_state_transition(tap_get_state(), false) == path[state_count]) {
/* Append '0' transition: clear bit 'i' in tms_sequence */ /* Append '0' transition: clear bit 'i' in tms_sequence */
buf_set_u32(&tms_sequence, i, 1, 0x0); buf_set_u32(&tms_sequence, i, 1, 0x0);
@ -1908,14 +1910,13 @@ static int angie_queue_sleep(struct angie *device, struct jtag_command *cmd)
static int angie_queue_stableclocks(struct angie *device, struct jtag_command *cmd) static int angie_queue_stableclocks(struct angie *device, struct jtag_command *cmd)
{ {
int ret; int ret;
unsigned int num_cycles;
if (!tap_is_state_stable(tap_get_state())) { if (!tap_is_state_stable(tap_get_state())) {
LOG_ERROR("JTAG_STABLECLOCKS: state not stable"); LOG_ERROR("JTAG_STABLECLOCKS: state not stable");
return ERROR_FAIL; return ERROR_FAIL;
} }
num_cycles = cmd->cmd.stableclocks->num_cycles; unsigned int num_cycles = cmd->cmd.stableclocks->num_cycles;
/* TMS stays either high (Test Logic Reset state) or low (all other states) */ /* TMS stays either high (Test Logic Reset state) or low (all other states) */
if (tap_get_state() == TAP_RESET) if (tap_get_state() == TAP_RESET)

View File

@ -44,8 +44,8 @@ static uint8_t usb_out_buffer[ARMJTAGEW_OUT_BUFFER_SIZE];
/* Queue command functions */ /* Queue command functions */
static void armjtagew_end_state(tap_state_t state); static void armjtagew_end_state(tap_state_t state);
static void armjtagew_state_move(void); static void armjtagew_state_move(void);
static void armjtagew_path_move(int num_states, tap_state_t *path); static void armjtagew_path_move(unsigned int num_states, tap_state_t *path);
static void armjtagew_runtest(int num_cycles); static void armjtagew_runtest(unsigned int num_cycles);
static void armjtagew_scan(bool ir_scan, static void armjtagew_scan(bool ir_scan,
enum scan_type type, enum scan_type type,
uint8_t *buffer, uint8_t *buffer,
@ -95,7 +95,7 @@ static int armjtagew_execute_queue(struct jtag_command *cmd_queue)
while (cmd) { while (cmd) {
switch (cmd->type) { switch (cmd->type) {
case JTAG_RUNTEST: case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %i", LOG_DEBUG_IO("runtest %u cycles, end in %i",
cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->num_cycles,
cmd->cmd.runtest->end_state); cmd->cmd.runtest->end_state);
@ -111,7 +111,7 @@ static int armjtagew_execute_queue(struct jtag_command *cmd_queue)
break; break;
case JTAG_PATHMOVE: case JTAG_PATHMOVE:
LOG_DEBUG_IO("pathmove: %i states, end in %i", LOG_DEBUG_IO("pathmove: %u states, end in %i",
cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->num_states,
cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
@ -279,11 +279,9 @@ static void armjtagew_state_move(void)
tap_set_state(tap_get_end_state()); tap_set_state(tap_get_end_state());
} }
static void armjtagew_path_move(int num_states, tap_state_t *path) static void armjtagew_path_move(unsigned int num_states, tap_state_t *path)
{ {
int i; for (unsigned int i = 0; i < num_states; i++) {
for (i = 0; i < num_states; i++) {
/* /*
* TODO: The ARM-JTAG-EW hardware delays TDI with 3 TCK cycles when in RTCK mode. * TODO: The ARM-JTAG-EW hardware delays TDI with 3 TCK cycles when in RTCK mode.
* Either handle that here, or update the documentation with examples * Either handle that here, or update the documentation with examples
@ -305,10 +303,8 @@ static void armjtagew_path_move(int num_states, tap_state_t *path)
tap_set_end_state(tap_get_state()); tap_set_end_state(tap_get_state());
} }
static void armjtagew_runtest(int num_cycles) static void armjtagew_runtest(unsigned int num_cycles)
{ {
int i;
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();
/* only do a state_move when we're not already in IDLE */ /* only do a state_move when we're not already in IDLE */
@ -318,7 +314,7 @@ static void armjtagew_runtest(int num_cycles)
} }
/* execute num_cycles */ /* execute num_cycles */
for (i = 0; i < num_cycles; i++) for (unsigned int i = 0; i < num_cycles; i++)
armjtagew_tap_append_step(0, 0); armjtagew_tap_append_step(0, 0);
/* finish in end_state */ /* finish in end_state */

View File

@ -33,7 +33,7 @@
* this function checks the current stable state to decide on the value of TMS * this function checks the current stable state to decide on the value of TMS
* to use. * to use.
*/ */
static int bitbang_stableclocks(int num_cycles); static int bitbang_stableclocks(unsigned int num_cycles);
static void bitbang_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk); static void bitbang_swd_write_reg(uint8_t cmd, uint32_t value, uint32_t ap_delay_clk);
@ -95,7 +95,7 @@ static int bitbang_execute_tms(struct jtag_command *cmd)
unsigned num_bits = cmd->cmd.tms->num_bits; unsigned num_bits = cmd->cmd.tms->num_bits;
const uint8_t *bits = cmd->cmd.tms->bits; const uint8_t *bits = cmd->cmd.tms->bits;
LOG_DEBUG_IO("TMS: %d bits", num_bits); LOG_DEBUG_IO("TMS: %u bits", num_bits);
int tms = 0; int tms = 0;
for (unsigned i = 0; i < num_bits; i++) { for (unsigned i = 0; i < num_bits; i++) {
@ -113,7 +113,7 @@ static int bitbang_execute_tms(struct jtag_command *cmd)
static int bitbang_path_move(struct pathmove_command *cmd) static int bitbang_path_move(struct pathmove_command *cmd)
{ {
int num_states = cmd->num_states; unsigned int num_states = cmd->num_states;
int state_count; int state_count;
int tms = 0; int tms = 0;
@ -147,10 +147,8 @@ static int bitbang_path_move(struct pathmove_command *cmd)
return ERROR_OK; return ERROR_OK;
} }
static int bitbang_runtest(int num_cycles) static int bitbang_runtest(unsigned int num_cycles)
{ {
int i;
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();
/* only do a state_move when we're not already in IDLE */ /* only do a state_move when we're not already in IDLE */
@ -161,7 +159,7 @@ static int bitbang_runtest(int num_cycles)
} }
/* execute num_cycles */ /* execute num_cycles */
for (i = 0; i < num_cycles; i++) { for (unsigned int i = 0; i < num_cycles; i++) {
if (bitbang_interface->write(0, 0, 0) != ERROR_OK) if (bitbang_interface->write(0, 0, 0) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
if (bitbang_interface->write(1, 0, 0) != ERROR_OK) if (bitbang_interface->write(1, 0, 0) != ERROR_OK)
@ -179,13 +177,12 @@ static int bitbang_runtest(int num_cycles)
return ERROR_OK; return ERROR_OK;
} }
static int bitbang_stableclocks(int num_cycles) static int bitbang_stableclocks(unsigned int num_cycles)
{ {
int tms = (tap_get_state() == TAP_RESET ? 1 : 0); int tms = (tap_get_state() == TAP_RESET ? 1 : 0);
int i;
/* send num_cycles clocks onto the cable */ /* send num_cycles clocks onto the cable */
for (i = 0; i < num_cycles; i++) { for (unsigned int i = 0; i < num_cycles; i++) {
if (bitbang_interface->write(1, tms, 0) != ERROR_OK) if (bitbang_interface->write(1, tms, 0) != ERROR_OK)
return ERROR_FAIL; return ERROR_FAIL;
if (bitbang_interface->write(0, tms, 0) != ERROR_OK) if (bitbang_interface->write(0, tms, 0) != ERROR_OK)
@ -319,7 +316,7 @@ int bitbang_execute_queue(struct jtag_command *cmd_queue)
while (cmd) { while (cmd) {
switch (cmd->type) { switch (cmd->type) {
case JTAG_RUNTEST: case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %s", LOG_DEBUG_IO("runtest %u cycles, end in %s",
cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->num_cycles,
tap_state_name(cmd->cmd.runtest->end_state)); tap_state_name(cmd->cmd.runtest->end_state));
bitbang_end_state(cmd->cmd.runtest->end_state); bitbang_end_state(cmd->cmd.runtest->end_state);
@ -343,7 +340,7 @@ int bitbang_execute_queue(struct jtag_command *cmd_queue)
return ERROR_FAIL; return ERROR_FAIL;
break; break;
case JTAG_PATHMOVE: case JTAG_PATHMOVE:
LOG_DEBUG_IO("pathmove: %i states, end in %s", LOG_DEBUG_IO("pathmove: %u states, end in %s",
cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->num_states,
tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1])); tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
if (bitbang_path_move(cmd->cmd.pathmove) != ERROR_OK) if (bitbang_path_move(cmd->cmd.pathmove) != ERROR_OK)

View File

@ -18,8 +18,8 @@ struct bitq_interface *bitq_interface; /* low level bit queue interface */
/* state of input queue */ /* state of input queue */
struct bitq_state { struct bitq_state {
struct jtag_command *cmd; /* command currently processed */ struct jtag_command *cmd; /* command currently processed */
int field_idx; /* index of field currently being processed */ unsigned int field_idx; /* index of field currently being processed */
int bit_pos; /* position of bit currently being processed */ unsigned int bit_pos; /* position of bit currently being processed */
int status; /* processing status */ int status; /* processing status */
}; };
static struct bitq_state bitq_in_state; static struct bitq_state bitq_in_state;
@ -108,9 +108,7 @@ static void bitq_state_move(tap_state_t new_state)
static void bitq_path_move(struct pathmove_command *cmd) static void bitq_path_move(struct pathmove_command *cmd)
{ {
int i; for (unsigned int i = 0; i < cmd->num_states; i++) {
for (i = 0; i < cmd->num_states; i++) {
if (tap_state_transition(tap_get_state(), false) == cmd->path[i]) if (tap_state_transition(tap_get_state(), false) == cmd->path[i])
bitq_io(0, 0, 0); bitq_io(0, 0, 0);
else if (tap_state_transition(tap_get_state(), true) == cmd->path[i]) else if (tap_state_transition(tap_get_state(), true) == cmd->path[i])
@ -127,16 +125,14 @@ static void bitq_path_move(struct pathmove_command *cmd)
tap_set_end_state(tap_get_state()); tap_set_end_state(tap_get_state());
} }
static void bitq_runtest(int num_cycles) static void bitq_runtest(unsigned int num_cycles)
{ {
int i;
/* only do a state_move when we're not already in IDLE */ /* only do a state_move when we're not already in IDLE */
if (tap_get_state() != TAP_IDLE) if (tap_get_state() != TAP_IDLE)
bitq_state_move(TAP_IDLE); bitq_state_move(TAP_IDLE);
/* execute num_cycles */ /* execute num_cycles */
for (i = 0; i < num_cycles; i++) for (unsigned int i = 0; i < num_cycles; i++)
bitq_io(0, 0, 0); bitq_io(0, 0, 0);
/* finish in end_state */ /* finish in end_state */
@ -146,7 +142,6 @@ static void bitq_runtest(int num_cycles)
static void bitq_scan_field(struct scan_field *field, int do_pause) static void bitq_scan_field(struct scan_field *field, int do_pause)
{ {
int bit_cnt;
int tdo_req; int tdo_req;
const uint8_t *out_ptr; const uint8_t *out_ptr;
@ -159,7 +154,7 @@ static void bitq_scan_field(struct scan_field *field, int do_pause)
if (!field->out_value) { if (!field->out_value) {
/* just send zeros and request data from TDO */ /* just send zeros and request data from TDO */
for (bit_cnt = field->num_bits; bit_cnt > 1; bit_cnt--) for (unsigned int i = 0; i < (field->num_bits - 1); i++)
bitq_io(0, 0, tdo_req); bitq_io(0, 0, tdo_req);
bitq_io(do_pause, 0, tdo_req); bitq_io(do_pause, 0, tdo_req);
@ -167,7 +162,7 @@ static void bitq_scan_field(struct scan_field *field, int do_pause)
/* send data, and optionally request TDO */ /* send data, and optionally request TDO */
out_mask = 0x01; out_mask = 0x01;
out_ptr = field->out_value; out_ptr = field->out_value;
for (bit_cnt = field->num_bits; bit_cnt > 1; bit_cnt--) { for (unsigned int i = 0; i < (field->num_bits - 1); i++) {
bitq_io(0, ((*out_ptr) & out_mask) != 0, tdo_req); bitq_io(0, ((*out_ptr) & out_mask) != 0, tdo_req);
if (out_mask == 0x80) { if (out_mask == 0x80) {
out_mask = 0x01; out_mask = 0x01;
@ -190,13 +185,12 @@ static void bitq_scan_field(struct scan_field *field, int do_pause)
static void bitq_scan(struct scan_command *cmd) static void bitq_scan(struct scan_command *cmd)
{ {
int i;
if (cmd->ir_scan) if (cmd->ir_scan)
bitq_state_move(TAP_IRSHIFT); bitq_state_move(TAP_IRSHIFT);
else else
bitq_state_move(TAP_DRSHIFT); bitq_state_move(TAP_DRSHIFT);
unsigned int i;
for (i = 0; i < cmd->num_fields - 1; i++) for (i = 0; i < cmd->num_fields - 1; i++)
bitq_scan_field(&cmd->fields[i], 0); bitq_scan_field(&cmd->fields[i], 0);
@ -226,7 +220,7 @@ int bitq_execute_queue(struct jtag_command *cmd_queue)
break; break;
case JTAG_RUNTEST: case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state); LOG_DEBUG_IO("runtest %u cycles, end in %i", cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->end_state);
bitq_end_state(cmd->cmd.runtest->end_state); bitq_end_state(cmd->cmd.runtest->end_state);
bitq_runtest(cmd->cmd.runtest->num_cycles); bitq_runtest(cmd->cmd.runtest->num_cycles);
break; break;
@ -238,7 +232,7 @@ int bitq_execute_queue(struct jtag_command *cmd_queue)
break; break;
case JTAG_PATHMOVE: case JTAG_PATHMOVE:
LOG_DEBUG_IO("pathmove: %i states, end in %i", cmd->cmd.pathmove->num_states, LOG_DEBUG_IO("pathmove: %u states, end in %i", cmd->cmd.pathmove->num_states,
cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
bitq_path_move(cmd->cmd.pathmove); bitq_path_move(cmd->cmd.pathmove);
break; break;

View File

@ -27,11 +27,11 @@ static int buspirate_reset(int trst, int srst);
static void buspirate_end_state(tap_state_t state); static void buspirate_end_state(tap_state_t state);
static void buspirate_state_move(void); static void buspirate_state_move(void);
static void buspirate_path_move(int num_states, tap_state_t *path); static void buspirate_path_move(unsigned int num_states, tap_state_t *path);
static void buspirate_runtest(int num_cycles); static void buspirate_runtest(unsigned int num_cycles);
static void buspirate_scan(bool ir_scan, enum scan_type type, static void buspirate_scan(bool ir_scan, enum scan_type type,
uint8_t *buffer, int scan_size, struct scan_command *command); uint8_t *buffer, int scan_size, struct scan_command *command);
static void buspirate_stableclocks(int num_cycles); static void buspirate_stableclocks(unsigned int num_cycles);
#define CMD_UNKNOWN 0x00 #define CMD_UNKNOWN 0x00
#define CMD_PORT_MODE 0x01 #define CMD_PORT_MODE 0x01
@ -162,7 +162,7 @@ static int buspirate_execute_queue(struct jtag_command *cmd_queue)
while (cmd) { while (cmd) {
switch (cmd->type) { switch (cmd->type) {
case JTAG_RUNTEST: case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %s", LOG_DEBUG_IO("runtest %u cycles, end in %s",
cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->num_cycles,
tap_state_name(cmd->cmd.runtest tap_state_name(cmd->cmd.runtest
->end_state)); ->end_state));
@ -180,7 +180,7 @@ static int buspirate_execute_queue(struct jtag_command *cmd_queue)
buspirate_state_move(); buspirate_state_move();
break; break;
case JTAG_PATHMOVE: case JTAG_PATHMOVE:
LOG_DEBUG_IO("pathmove: %i states, end in %s", LOG_DEBUG_IO("pathmove: %u states, end in %s",
cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->num_states,
tap_state_name(cmd->cmd.pathmove tap_state_name(cmd->cmd.pathmove
->path[cmd->cmd.pathmove ->path[cmd->cmd.pathmove
@ -210,7 +210,7 @@ static int buspirate_execute_queue(struct jtag_command *cmd_queue)
jtag_sleep(cmd->cmd.sleep->us); jtag_sleep(cmd->cmd.sleep->us);
break; break;
case JTAG_STABLECLOCKS: case JTAG_STABLECLOCKS:
LOG_DEBUG_IO("stable clock %i cycles", cmd->cmd.stableclocks->num_cycles); LOG_DEBUG_IO("stable clock %u cycles", cmd->cmd.stableclocks->num_cycles);
buspirate_stableclocks(cmd->cmd.stableclocks->num_cycles); buspirate_stableclocks(cmd->cmd.stableclocks->num_cycles);
break; break;
default: default:
@ -580,11 +580,9 @@ static void buspirate_state_move(void)
tap_set_state(tap_get_end_state()); tap_set_state(tap_get_end_state());
} }
static void buspirate_path_move(int num_states, tap_state_t *path) static void buspirate_path_move(unsigned int num_states, tap_state_t *path)
{ {
int i; for (unsigned int i = 0; i < num_states; i++) {
for (i = 0; i < num_states; i++) {
if (tap_state_transition(tap_get_state(), false) == path[i]) { if (tap_state_transition(tap_get_state(), false) == path[i]) {
buspirate_tap_append(0, 0); buspirate_tap_append(0, 0);
} else if (tap_state_transition(tap_get_state(), true) } else if (tap_state_transition(tap_get_state(), true)
@ -604,10 +602,8 @@ static void buspirate_path_move(int num_states, tap_state_t *path)
tap_set_end_state(tap_get_state()); tap_set_end_state(tap_get_state());
} }
static void buspirate_runtest(int num_cycles) static void buspirate_runtest(unsigned int num_cycles)
{ {
int i;
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();
/* only do a state_move when we're not already in IDLE */ /* only do a state_move when we're not already in IDLE */
@ -616,7 +612,7 @@ static void buspirate_runtest(int num_cycles)
buspirate_state_move(); buspirate_state_move();
} }
for (i = 0; i < num_cycles; i++) for (unsigned int i = 0; i < num_cycles; i++)
buspirate_tap_append(0, 0); buspirate_tap_append(0, 0);
LOG_DEBUG_IO("runtest: cur_state %s end_state %s", LOG_DEBUG_IO("runtest: cur_state %s end_state %s",
@ -658,14 +654,13 @@ static void buspirate_scan(bool ir_scan, enum scan_type type,
buspirate_state_move(); buspirate_state_move();
} }
static void buspirate_stableclocks(int num_cycles) static void buspirate_stableclocks(unsigned int num_cycles)
{ {
int i;
int tms = (tap_get_state() == TAP_RESET ? 1 : 0); int tms = (tap_get_state() == TAP_RESET ? 1 : 0);
buspirate_tap_make_space(0, num_cycles); buspirate_tap_make_space(0, num_cycles);
for (i = 0; i < num_cycles; i++) for (unsigned int i = 0; i < num_cycles; i++)
buspirate_tap_append(tms, 0); buspirate_tap_append(tms, 0);
} }

View File

@ -1752,7 +1752,7 @@ static void cmsis_dap_execute_scan(struct jtag_command *cmd)
LOG_DEBUG("discarding trailing empty field"); LOG_DEBUG("discarding trailing empty field");
} }
if (cmd->cmd.scan->num_fields == 0) { if (!cmd->cmd.scan->num_fields) {
LOG_DEBUG("empty scan, doing nothing"); LOG_DEBUG("empty scan, doing nothing");
return; return;
} }
@ -1772,11 +1772,11 @@ static void cmsis_dap_execute_scan(struct jtag_command *cmd)
cmsis_dap_end_state(cmd->cmd.scan->end_state); cmsis_dap_end_state(cmd->cmd.scan->end_state);
struct scan_field *field = cmd->cmd.scan->fields; struct scan_field *field = cmd->cmd.scan->fields;
unsigned scan_size = 0; unsigned int scan_size = 0;
for (int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) { for (unsigned int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) {
scan_size += field->num_bits; scan_size += field->num_bits;
LOG_DEBUG_IO("%s%s field %d/%d %d bits", LOG_DEBUG_IO("%s%s field %u/%u %u bits",
field->in_value ? "in" : "", field->in_value ? "in" : "",
field->out_value ? "out" : "", field->out_value ? "out" : "",
i, i,
@ -1872,16 +1872,16 @@ static void cmsis_dap_execute_pathmove(struct jtag_command *cmd)
cmsis_dap_pathmove(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path); cmsis_dap_pathmove(cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->path);
} }
static void cmsis_dap_stableclocks(int num_cycles) static void cmsis_dap_stableclocks(unsigned int num_cycles)
{ {
uint8_t tms = tap_get_state() == TAP_RESET; uint8_t tms = tap_get_state() == TAP_RESET;
/* TODO: Perform optimizations? */ /* TODO: Perform optimizations? */
/* Execute num_cycles. */ /* Execute num_cycles. */
for (int i = 0; i < num_cycles; i++) for (unsigned int i = 0; i < num_cycles; i++)
cmsis_dap_add_tms_sequence(&tms, 1); cmsis_dap_add_tms_sequence(&tms, 1);
} }
static void cmsis_dap_runtest(int num_cycles) static void cmsis_dap_runtest(unsigned int num_cycles)
{ {
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();
@ -1901,7 +1901,7 @@ static void cmsis_dap_runtest(int num_cycles)
static void cmsis_dap_execute_runtest(struct jtag_command *cmd) static void cmsis_dap_execute_runtest(struct jtag_command *cmd)
{ {
LOG_DEBUG_IO("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, LOG_DEBUG_IO("runtest %u cycles, end in %i", cmd->cmd.runtest->num_cycles,
cmd->cmd.runtest->end_state); cmd->cmd.runtest->end_state);
cmsis_dap_end_state(cmd->cmd.runtest->end_state); cmsis_dap_end_state(cmd->cmd.runtest->end_state);
@ -1910,13 +1910,13 @@ static void cmsis_dap_execute_runtest(struct jtag_command *cmd)
static void cmsis_dap_execute_stableclocks(struct jtag_command *cmd) static void cmsis_dap_execute_stableclocks(struct jtag_command *cmd)
{ {
LOG_DEBUG_IO("stableclocks %i cycles", cmd->cmd.runtest->num_cycles); LOG_DEBUG_IO("stableclocks %u cycles", cmd->cmd.runtest->num_cycles);
cmsis_dap_stableclocks(cmd->cmd.runtest->num_cycles); cmsis_dap_stableclocks(cmd->cmd.runtest->num_cycles);
} }
static void cmsis_dap_execute_tms(struct jtag_command *cmd) static void cmsis_dap_execute_tms(struct jtag_command *cmd)
{ {
LOG_DEBUG_IO("TMS: %d bits", cmd->cmd.tms->num_bits); LOG_DEBUG_IO("TMS: %u bits", cmd->cmd.tms->num_bits);
cmsis_dap_cmd_dap_swj_sequence(cmd->cmd.tms->num_bits, cmd->cmd.tms->bits); cmsis_dap_cmd_dap_swj_sequence(cmd->cmd.tms->num_bits, cmd->cmd.tms->bits);
} }

View File

@ -259,7 +259,7 @@ int interface_add_tms_seq(unsigned num_bits, const uint8_t *seq, enum tap_state
return ERROR_OK; return ERROR_OK;
} }
int interface_jtag_add_pathmove(int num_states, const tap_state_t *path) int interface_jtag_add_pathmove(unsigned int num_states, const tap_state_t *path)
{ {
/* allocate memory for a new list member */ /* allocate memory for a new list member */
struct jtag_command *cmd = cmd_queue_alloc(sizeof(struct jtag_command)); struct jtag_command *cmd = cmd_queue_alloc(sizeof(struct jtag_command));
@ -272,13 +272,13 @@ int interface_jtag_add_pathmove(int num_states, const tap_state_t *path)
cmd->cmd.pathmove->num_states = num_states; cmd->cmd.pathmove->num_states = num_states;
cmd->cmd.pathmove->path = cmd_queue_alloc(sizeof(tap_state_t) * num_states); cmd->cmd.pathmove->path = cmd_queue_alloc(sizeof(tap_state_t) * num_states);
for (int i = 0; i < num_states; i++) for (unsigned int i = 0; i < num_states; i++)
cmd->cmd.pathmove->path[i] = path[i]; cmd->cmd.pathmove->path[i] = path[i];
return ERROR_OK; return ERROR_OK;
} }
int interface_jtag_add_runtest(int num_cycles, tap_state_t state) int interface_jtag_add_runtest(unsigned int num_cycles, tap_state_t state)
{ {
/* allocate memory for a new list member */ /* allocate memory for a new list member */
struct jtag_command *cmd = cmd_queue_alloc(sizeof(struct jtag_command)); struct jtag_command *cmd = cmd_queue_alloc(sizeof(struct jtag_command));
@ -294,7 +294,7 @@ int interface_jtag_add_runtest(int num_cycles, tap_state_t state)
return ERROR_OK; return ERROR_OK;
} }
int interface_jtag_add_clocks(int num_cycles) int interface_jtag_add_clocks(unsigned int num_cycles)
{ {
/* allocate memory for a new list member */ /* allocate memory for a new list member */
struct jtag_command *cmd = cmd_queue_alloc(sizeof(struct jtag_command)); struct jtag_command *cmd = cmd_queue_alloc(sizeof(struct jtag_command));

View File

@ -657,7 +657,7 @@ static int syncbb_execute_tms(struct jtag_command *cmd)
unsigned num_bits = cmd->cmd.tms->num_bits; unsigned num_bits = cmd->cmd.tms->num_bits;
const uint8_t *bits = cmd->cmd.tms->bits; const uint8_t *bits = cmd->cmd.tms->bits;
LOG_DEBUG_IO("TMS: %d bits", num_bits); LOG_DEBUG_IO("TMS: %u bits", num_bits);
int tms = 0; int tms = 0;
for (unsigned i = 0; i < num_bits; i++) { for (unsigned i = 0; i < num_bits; i++) {
@ -672,7 +672,7 @@ static int syncbb_execute_tms(struct jtag_command *cmd)
static void syncbb_path_move(struct pathmove_command *cmd) static void syncbb_path_move(struct pathmove_command *cmd)
{ {
int num_states = cmd->num_states; unsigned int num_states = cmd->num_states;
int state_count; int state_count;
int tms = 0; int tms = 0;
@ -702,9 +702,8 @@ static void syncbb_path_move(struct pathmove_command *cmd)
tap_set_end_state(tap_get_state()); tap_set_end_state(tap_get_state());
} }
static void syncbb_runtest(int num_cycles) static void syncbb_runtest(unsigned int num_cycles)
{ {
int i;
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();
@ -715,7 +714,7 @@ static void syncbb_runtest(int num_cycles)
} }
/* execute num_cycles */ /* execute num_cycles */
for (i = 0; i < num_cycles; i++) { for (unsigned int i = 0; i < num_cycles; i++) {
ft232r_write(0, 0, 0); ft232r_write(0, 0, 0);
ft232r_write(1, 0, 0); ft232r_write(1, 0, 0);
} }
@ -735,13 +734,12 @@ static void syncbb_runtest(int num_cycles)
* this function checks the current stable state to decide on the value of TMS * this function checks the current stable state to decide on the value of TMS
* to use. * to use.
*/ */
static void syncbb_stableclocks(int num_cycles) static void syncbb_stableclocks(unsigned int num_cycles)
{ {
int tms = (tap_get_state() == TAP_RESET ? 1 : 0); int tms = (tap_get_state() == TAP_RESET ? 1 : 0);
int i;
/* send num_cycles clocks onto the cable */ /* send num_cycles clocks onto the cable */
for (i = 0; i < num_cycles; i++) { for (unsigned int i = 0; i < num_cycles; i++) {
ft232r_write(1, tms, 0); ft232r_write(1, tms, 0);
ft232r_write(0, tms, 0); ft232r_write(0, tms, 0);
} }
@ -832,7 +830,7 @@ static int syncbb_execute_queue(struct jtag_command *cmd_queue)
break; break;
case JTAG_RUNTEST: case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %s", cmd->cmd.runtest->num_cycles, LOG_DEBUG_IO("runtest %u cycles, end in %s", cmd->cmd.runtest->num_cycles,
tap_state_name(cmd->cmd.runtest->end_state)); tap_state_name(cmd->cmd.runtest->end_state));
syncbb_end_state(cmd->cmd.runtest->end_state); syncbb_end_state(cmd->cmd.runtest->end_state);
@ -854,7 +852,7 @@ static int syncbb_execute_queue(struct jtag_command *cmd_queue)
break; break;
case JTAG_PATHMOVE: case JTAG_PATHMOVE:
LOG_DEBUG_IO("pathmove: %i states, end in %s", cmd->cmd.pathmove->num_states, LOG_DEBUG_IO("pathmove: %u states, end in %s", cmd->cmd.pathmove->num_states,
tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1])); tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
syncbb_path_move(cmd->cmd.pathmove); syncbb_path_move(cmd->cmd.pathmove);

View File

@ -383,10 +383,9 @@ static void ftdi_end_state(tap_state_t state)
static void ftdi_execute_runtest(struct jtag_command *cmd) static void ftdi_execute_runtest(struct jtag_command *cmd)
{ {
int i; uint8_t zero = 0;
static const uint8_t zero;
LOG_DEBUG_IO("runtest %i cycles, end in %s", LOG_DEBUG_IO("runtest %u cycles, end in %s",
cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->num_cycles,
tap_state_name(cmd->cmd.runtest->end_state)); tap_state_name(cmd->cmd.runtest->end_state));
@ -394,7 +393,7 @@ static void ftdi_execute_runtest(struct jtag_command *cmd)
move_to_state(TAP_IDLE); move_to_state(TAP_IDLE);
/* TODO: Reuse ftdi_execute_stableclocks */ /* TODO: Reuse ftdi_execute_stableclocks */
i = cmd->cmd.runtest->num_cycles; unsigned int i = cmd->cmd.runtest->num_cycles;
while (i > 0) { while (i > 0) {
/* there are no state transitions in this code, so omit state tracking */ /* there are no state transitions in this code, so omit state tracking */
unsigned this_len = i > 7 ? 7 : i; unsigned this_len = i > 7 ? 7 : i;
@ -407,7 +406,7 @@ static void ftdi_execute_runtest(struct jtag_command *cmd)
if (tap_get_state() != tap_get_end_state()) if (tap_get_state() != tap_get_end_state())
move_to_state(tap_get_end_state()); move_to_state(tap_get_end_state());
LOG_DEBUG_IO("runtest: %i, end in %s", LOG_DEBUG_IO("runtest: %u, end in %s",
cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->num_cycles,
tap_state_name(tap_get_end_state())); tap_state_name(tap_get_end_state()));
} }
@ -430,7 +429,7 @@ static void ftdi_execute_statemove(struct jtag_command *cmd)
*/ */
static void ftdi_execute_tms(struct jtag_command *cmd) static void ftdi_execute_tms(struct jtag_command *cmd)
{ {
LOG_DEBUG_IO("TMS: %d bits", cmd->cmd.tms->num_bits); LOG_DEBUG_IO("TMS: %u bits", cmd->cmd.tms->num_bits);
/* TODO: Missing tap state tracking, also missing from ft2232.c! */ /* TODO: Missing tap state tracking, also missing from ft2232.c! */
DO_CLOCK_TMS_CS_OUT(mpsse_ctx, DO_CLOCK_TMS_CS_OUT(mpsse_ctx,
@ -444,9 +443,9 @@ static void ftdi_execute_tms(struct jtag_command *cmd)
static void ftdi_execute_pathmove(struct jtag_command *cmd) static void ftdi_execute_pathmove(struct jtag_command *cmd)
{ {
tap_state_t *path = cmd->cmd.pathmove->path; tap_state_t *path = cmd->cmd.pathmove->path;
int num_states = cmd->cmd.pathmove->num_states; unsigned int num_states = cmd->cmd.pathmove->num_states;
LOG_DEBUG_IO("pathmove: %i states, current: %s end: %s", num_states, LOG_DEBUG_IO("pathmove: %u states, current: %s end: %s", num_states,
tap_state_name(tap_get_state()), tap_state_name(tap_get_state()),
tap_state_name(path[num_states-1])); tap_state_name(path[num_states-1]));
@ -504,7 +503,7 @@ static void ftdi_execute_scan(struct jtag_command *cmd)
LOG_DEBUG_IO("discarding trailing empty field"); LOG_DEBUG_IO("discarding trailing empty field");
} }
if (cmd->cmd.scan->num_fields == 0) { if (!cmd->cmd.scan->num_fields) {
LOG_DEBUG_IO("empty scan, doing nothing"); LOG_DEBUG_IO("empty scan, doing nothing");
return; return;
} }
@ -522,9 +521,9 @@ static void ftdi_execute_scan(struct jtag_command *cmd)
struct scan_field *field = cmd->cmd.scan->fields; struct scan_field *field = cmd->cmd.scan->fields;
unsigned scan_size = 0; unsigned scan_size = 0;
for (int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) { for (unsigned int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) {
scan_size += field->num_bits; scan_size += field->num_bits;
LOG_DEBUG_IO("%s%s field %d/%d %d bits", LOG_DEBUG_IO("%s%s field %u/%u %u bits",
field->in_value ? "in" : "", field->in_value ? "in" : "",
field->out_value ? "out" : "", field->out_value ? "out" : "",
i, i,
@ -644,7 +643,7 @@ static void ftdi_execute_stableclocks(struct jtag_command *cmd)
/* this is only allowed while in a stable state. A check for a stable /* this is only allowed while in a stable state. A check for a stable
* state was done in jtag_add_clocks() * state was done in jtag_add_clocks()
*/ */
int num_cycles = cmd->cmd.stableclocks->num_cycles; unsigned int num_cycles = cmd->cmd.stableclocks->num_cycles;
/* 7 bits of either ones or zeros. */ /* 7 bits of either ones or zeros. */
uint8_t tms = tap_get_state() == TAP_RESET ? 0x7f : 0x00; uint8_t tms = tap_get_state() == TAP_RESET ? 0x7f : 0x00;
@ -658,7 +657,7 @@ static void ftdi_execute_stableclocks(struct jtag_command *cmd)
num_cycles -= this_len; num_cycles -= this_len;
} }
LOG_DEBUG_IO("clocks %i while in %s", LOG_DEBUG_IO("clocks %u while in %s",
cmd->cmd.stableclocks->num_cycles, cmd->cmd.stableclocks->num_cycles,
tap_state_name(tap_get_state())); tap_state_name(tap_get_state()));
} }

View File

@ -185,10 +185,9 @@ static void gw16012_path_move(struct pathmove_command *cmd)
tap_set_end_state(tap_get_state()); tap_set_end_state(tap_get_state());
} }
static void gw16012_runtest(int num_cycles) static void gw16012_runtest(unsigned int num_cycles)
{ {
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();
int i;
/* only do a state_move when we're not already in IDLE */ /* only do a state_move when we're not already in IDLE */
if (tap_get_state() != TAP_IDLE) { if (tap_get_state() != TAP_IDLE) {
@ -196,7 +195,7 @@ static void gw16012_runtest(int num_cycles)
gw16012_state_move(); gw16012_state_move();
} }
for (i = 0; i < num_cycles; i++) { for (unsigned int i = 0; i < num_cycles; i++) {
gw16012_control(0x0); /* single-bit mode */ gw16012_control(0x0); /* single-bit mode */
gw16012_data(0x0); /* TMS cycle with TMS low */ gw16012_data(0x0); /* TMS cycle with TMS low */
} }
@ -292,7 +291,7 @@ static int gw16012_execute_queue(struct jtag_command *cmd_queue)
gw16012_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst); gw16012_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
break; break;
case JTAG_RUNTEST: case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, LOG_DEBUG_IO("runtest %u cycles, end in %i", cmd->cmd.runtest->num_cycles,
cmd->cmd.runtest->end_state); cmd->cmd.runtest->end_state);
gw16012_end_state(cmd->cmd.runtest->end_state); gw16012_end_state(cmd->cmd.runtest->end_state);
gw16012_runtest(cmd->cmd.runtest->num_cycles); gw16012_runtest(cmd->cmd.runtest->num_cycles);

View File

@ -80,9 +80,9 @@ static struct device_config tmp_config;
/* Queue command functions */ /* Queue command functions */
static void jlink_end_state(tap_state_t state); static void jlink_end_state(tap_state_t state);
static void jlink_state_move(void); static void jlink_state_move(void);
static void jlink_path_move(int num_states, tap_state_t *path); static void jlink_path_move(unsigned int num_states, tap_state_t *path);
static void jlink_stableclocks(int num_cycles); static void jlink_stableclocks(unsigned int num_cycles);
static void jlink_runtest(int num_cycles); static void jlink_runtest(unsigned int num_cycles);
static void jlink_reset(int trst, int srst); static void jlink_reset(int trst, int srst);
static int jlink_reset_safe(int trst, int srst); static int jlink_reset_safe(int trst, int srst);
static int jlink_swd_run_queue(void); static int jlink_swd_run_queue(void);
@ -140,7 +140,7 @@ static void jlink_execute_statemove(struct jtag_command *cmd)
static void jlink_execute_pathmove(struct jtag_command *cmd) static void jlink_execute_pathmove(struct jtag_command *cmd)
{ {
LOG_DEBUG_IO("pathmove: %i states, end in %i", LOG_DEBUG_IO("pathmove: %u states, end in %i",
cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->num_states,
cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
@ -159,7 +159,7 @@ static void jlink_execute_scan(struct jtag_command *cmd)
LOG_DEBUG("discarding trailing empty field"); LOG_DEBUG("discarding trailing empty field");
} }
if (cmd->cmd.scan->num_fields == 0) { if (!cmd->cmd.scan->num_fields) {
LOG_DEBUG("empty scan, doing nothing"); LOG_DEBUG("empty scan, doing nothing");
return; return;
} }
@ -181,9 +181,9 @@ static void jlink_execute_scan(struct jtag_command *cmd)
struct scan_field *field = cmd->cmd.scan->fields; struct scan_field *field = cmd->cmd.scan->fields;
unsigned scan_size = 0; unsigned scan_size = 0;
for (int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) { for (unsigned int i = 0; i < cmd->cmd.scan->num_fields; i++, field++) {
scan_size += field->num_bits; scan_size += field->num_bits;
LOG_DEBUG_IO("%s%s field %d/%d %d bits", LOG_DEBUG_IO("%s%s field %u/%u %u bits",
field->in_value ? "in" : "", field->in_value ? "in" : "",
field->out_value ? "out" : "", field->out_value ? "out" : "",
i, i,
@ -885,12 +885,11 @@ static void jlink_state_move(void)
tap_set_state(tap_get_end_state()); tap_set_state(tap_get_end_state());
} }
static void jlink_path_move(int num_states, tap_state_t *path) static void jlink_path_move(unsigned int num_states, tap_state_t *path)
{ {
int i;
uint8_t tms = 0xff; uint8_t tms = 0xff;
for (i = 0; i < num_states; i++) { for (unsigned int i = 0; i < num_states; i++) {
if (path[i] == tap_state_transition(tap_get_state(), false)) if (path[i] == tap_state_transition(tap_get_state(), false))
jlink_clock_data(NULL, 0, NULL, 0, NULL, 0, 1); jlink_clock_data(NULL, 0, NULL, 0, NULL, 0, 1);
else if (path[i] == tap_state_transition(tap_get_state(), true)) else if (path[i] == tap_state_transition(tap_get_state(), true))
@ -907,17 +906,15 @@ static void jlink_path_move(int num_states, tap_state_t *path)
tap_set_end_state(tap_get_state()); tap_set_end_state(tap_get_state());
} }
static void jlink_stableclocks(int num_cycles) static void jlink_stableclocks(unsigned int num_cycles)
{ {
int i;
uint8_t tms = tap_get_state() == TAP_RESET; uint8_t tms = tap_get_state() == TAP_RESET;
/* Execute num_cycles. */ /* Execute num_cycles. */
for (i = 0; i < num_cycles; i++) for (unsigned int i = 0; i < num_cycles; i++)
jlink_clock_data(NULL, 0, &tms, 0, NULL, 0, 1); jlink_clock_data(NULL, 0, &tms, 0, NULL, 0, 1);
} }
static void jlink_runtest(int num_cycles) static void jlink_runtest(unsigned int num_cycles)
{ {
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();
@ -964,23 +961,18 @@ static int jlink_reset_safe(int trst, int srst)
COMMAND_HANDLER(jlink_usb_command) COMMAND_HANDLER(jlink_usb_command)
{ {
int tmp;
if (CMD_ARGC != 1) if (CMD_ARGC != 1)
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
if (sscanf(CMD_ARGV[0], "%i", &tmp) != 1) { unsigned int tmp;
command_print(CMD, "Invalid USB address: %s", CMD_ARGV[0]); COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], tmp);
return ERROR_COMMAND_ARGUMENT_INVALID;
}
if (tmp < JAYLINK_USB_ADDRESS_0 || tmp > JAYLINK_USB_ADDRESS_3) { if (tmp > JAYLINK_USB_ADDRESS_3) {
command_print(CMD, "Invalid USB address: %s", CMD_ARGV[0]); command_print(CMD, "Invalid USB address: %s", CMD_ARGV[0]);
return ERROR_COMMAND_ARGUMENT_INVALID; return ERROR_COMMAND_ARGUMENT_INVALID;
} }
usb_address = tmp; usb_address = tmp;
use_usb_address = true; use_usb_address = true;
return ERROR_OK; return ERROR_OK;
@ -1038,10 +1030,9 @@ COMMAND_HANDLER(jlink_handle_free_memory_command)
COMMAND_HANDLER(jlink_handle_jlink_jtag_command) COMMAND_HANDLER(jlink_handle_jlink_jtag_command)
{ {
int tmp;
int version;
if (!CMD_ARGC) { if (!CMD_ARGC) {
unsigned int version;
switch (jtag_command_version) { switch (jtag_command_version) {
case JAYLINK_JTAG_VERSION_2: case JAYLINK_JTAG_VERSION_2:
version = 2; version = 2;
@ -1053,12 +1044,10 @@ COMMAND_HANDLER(jlink_handle_jlink_jtag_command)
return ERROR_FAIL; return ERROR_FAIL;
} }
command_print(CMD, "JTAG command version: %i", version); command_print(CMD, "JTAG command version: %u", version);
} else if (CMD_ARGC == 1) { } else if (CMD_ARGC == 1) {
if (sscanf(CMD_ARGV[0], "%i", &tmp) != 1) { uint8_t tmp;
command_print(CMD, "Invalid argument: %s", CMD_ARGV[0]); COMMAND_PARSE_NUMBER(u8, CMD_ARGV[0], tmp);
return ERROR_COMMAND_ARGUMENT_INVALID;
}
switch (tmp) { switch (tmp) {
case 2: case 2:
@ -1080,10 +1069,7 @@ COMMAND_HANDLER(jlink_handle_jlink_jtag_command)
COMMAND_HANDLER(jlink_handle_target_power_command) COMMAND_HANDLER(jlink_handle_target_power_command)
{ {
int ret; if (CMD_ARGC > 1)
int enable;
if (CMD_ARGC != 1)
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
if (!jaylink_has_cap(caps, JAYLINK_DEV_CAP_SET_TARGET_POWER)) { if (!jaylink_has_cap(caps, JAYLINK_DEV_CAP_SET_TARGET_POWER)) {
@ -1092,16 +1078,24 @@ COMMAND_HANDLER(jlink_handle_target_power_command)
return ERROR_OK; return ERROR_OK;
} }
if (!strcmp(CMD_ARGV[0], "on")) { if (!CMD_ARGC) {
enable = true; uint32_t state;
} else if (!strcmp(CMD_ARGV[0], "off")) { int ret = jaylink_get_hardware_info(devh, JAYLINK_HW_INFO_TARGET_POWER,
enable = false; &state);
} else {
command_print(CMD, "Invalid argument: %s", CMD_ARGV[0]); if (ret != JAYLINK_OK) {
command_print(CMD, "Failed to retrieve target power state");
return ERROR_FAIL; return ERROR_FAIL;
} }
ret = jaylink_set_target_power(devh, enable); command_print(CMD, "%d", (bool)state);
return ERROR_OK;
}
bool enable;
COMMAND_PARSE_ON_OFF(CMD_ARGV[0], enable);
int ret = jaylink_set_target_power(devh, enable);
if (ret != JAYLINK_OK) { if (ret != JAYLINK_OK) {
command_print(CMD, "jaylink_set_target_power() failed: %s", command_print(CMD, "jaylink_set_target_power() failed: %s",
@ -1410,8 +1404,6 @@ static int config_trace(bool enabled, enum tpiu_pin_protocol pin_protocol,
COMMAND_HANDLER(jlink_handle_config_usb_address_command) COMMAND_HANDLER(jlink_handle_config_usb_address_command)
{ {
uint8_t tmp;
if (!jaylink_has_cap(caps, JAYLINK_DEV_CAP_READ_CONFIG)) { if (!jaylink_has_cap(caps, JAYLINK_DEV_CAP_READ_CONFIG)) {
command_print(CMD, "Reading configuration is not supported by the " command_print(CMD, "Reading configuration is not supported by the "
"device"); "device");
@ -1421,10 +1413,8 @@ COMMAND_HANDLER(jlink_handle_config_usb_address_command)
if (!CMD_ARGC) { if (!CMD_ARGC) {
show_config_usb_address(CMD); show_config_usb_address(CMD);
} else if (CMD_ARGC == 1) { } else if (CMD_ARGC == 1) {
if (sscanf(CMD_ARGV[0], "%" SCNd8, &tmp) != 1) { uint8_t tmp;
command_print(CMD, "Invalid USB address: %s", CMD_ARGV[0]); COMMAND_PARSE_NUMBER(u8, CMD_ARGV[0], tmp);
return ERROR_COMMAND_ARGUMENT_INVALID;
}
if (tmp > JAYLINK_USB_ADDRESS_3) { if (tmp > JAYLINK_USB_ADDRESS_3) {
command_print(CMD, "Invalid USB address: %u", tmp); command_print(CMD, "Invalid USB address: %u", tmp);
@ -1883,7 +1873,7 @@ static const struct command_registration jlink_subcommand_handlers[] = {
.handler = &jlink_handle_target_power_command, .handler = &jlink_handle_target_power_command,
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.help = "set the target power supply", .help = "set the target power supply",
.usage = "<on|off>" .usage = "[0|1|on|off]"
}, },
{ {
.name = "freemem", .name = "freemem",

View File

@ -163,7 +163,7 @@ out:
return ret; return ret;
} }
static int jtag_dpi_runtest(int cycles) static int jtag_dpi_runtest(unsigned int num_cycles)
{ {
char buf[20]; char buf[20];
uint8_t *data_buf = last_ir_buf, *read_scan; uint8_t *data_buf = last_ir_buf, *read_scan;
@ -189,7 +189,7 @@ static int jtag_dpi_runtest(int cycles)
return ERROR_FAIL; return ERROR_FAIL;
} }
snprintf(buf, sizeof(buf), "ib %d\n", num_bits); snprintf(buf, sizeof(buf), "ib %d\n", num_bits);
while (cycles > 0) { while (num_cycles > 0) {
ret = write_sock(buf, strlen(buf)); ret = write_sock(buf, strlen(buf));
if (ret != ERROR_OK) { if (ret != ERROR_OK) {
LOG_ERROR("write_sock() fail, file %s, line %d", LOG_ERROR("write_sock() fail, file %s, line %d",
@ -209,7 +209,7 @@ static int jtag_dpi_runtest(int cycles)
goto out; goto out;
} }
cycles -= num_bits + 6; num_cycles -= num_bits + 6;
} }
out: out:
@ -217,9 +217,9 @@ out:
return ret; return ret;
} }
static int jtag_dpi_stableclocks(int cycles) static int jtag_dpi_stableclocks(unsigned int num_cycles)
{ {
return jtag_dpi_runtest(cycles); return jtag_dpi_runtest(num_cycles);
} }
static int jtag_dpi_execute_queue(struct jtag_command *cmd_queue) static int jtag_dpi_execute_queue(struct jtag_command *cmd_queue)

View File

@ -254,7 +254,7 @@ static int jtag_vpi_path_move(struct pathmove_command *cmd)
memset(trans, 0, DIV_ROUND_UP(cmd->num_states, 8)); memset(trans, 0, DIV_ROUND_UP(cmd->num_states, 8));
for (int i = 0; i < cmd->num_states; i++) { for (unsigned int i = 0; i < cmd->num_states; i++) {
if (tap_state_transition(tap_get_state(), true) == cmd->path[i]) if (tap_state_transition(tap_get_state(), true) == cmd->path[i])
buf_set_u32(trans, i, 1, 1); buf_set_u32(trans, i, 1, 1);
tap_set_state(cmd->path[i]); tap_set_state(cmd->path[i]);
@ -440,7 +440,7 @@ static int jtag_vpi_scan(struct scan_command *cmd)
return ERROR_OK; return ERROR_OK;
} }
static int jtag_vpi_runtest(int cycles, tap_state_t state) static int jtag_vpi_runtest(unsigned int num_cycles, tap_state_t state)
{ {
int retval; int retval;
@ -448,23 +448,21 @@ static int jtag_vpi_runtest(int cycles, tap_state_t state)
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
retval = jtag_vpi_queue_tdi(NULL, cycles, NO_TAP_SHIFT); retval = jtag_vpi_queue_tdi(NULL, num_cycles, NO_TAP_SHIFT);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
return jtag_vpi_state_move(state); return jtag_vpi_state_move(state);
} }
static int jtag_vpi_stableclocks(int cycles) static int jtag_vpi_stableclocks(unsigned int num_cycles)
{ {
uint8_t tms_bits[4]; uint8_t tms_bits[4];
int cycles_remain = cycles; unsigned int cycles_remain = num_cycles;
int nb_bits; int nb_bits;
int retval; int retval;
const int CYCLES_ONE_BATCH = sizeof(tms_bits) * 8; const int CYCLES_ONE_BATCH = sizeof(tms_bits) * 8;
assert(cycles >= 0);
/* use TMS=1 in TAP RESET state, TMS=0 in all other stable states */ /* use TMS=1 in TAP RESET state, TMS=0 in all other stable states */
memset(&tms_bits, (tap_get_state() == TAP_RESET) ? 0xff : 0x00, sizeof(tms_bits)); memset(&tms_bits, (tap_get_state() == TAP_RESET) ? 0xff : 0x00, sizeof(tms_bits));

View File

@ -283,6 +283,9 @@ static bool open_matching_device(struct mpsse_ctx *ctx, const uint16_t vids[], c
case 0x3300: case 0x3300:
ctx->type = TYPE_FT232HP; ctx->type = TYPE_FT232HP;
break; break;
case 0x3600:
ctx->type = TYPE_FT4232HA;
break;
default: default:
LOG_ERROR("unsupported FTDI chip type: 0x%04x", desc.bcdDevice); LOG_ERROR("unsupported FTDI chip type: 0x%04x", desc.bcdDevice);
goto error; goto error;

View File

@ -30,6 +30,7 @@ enum ftdi_chip_type {
TYPE_FT4232HP, TYPE_FT4232HP,
TYPE_FT233HP, TYPE_FT233HP,
TYPE_FT232HP, TYPE_FT232HP,
TYPE_FT4232HA,
}; };
struct mpsse_ctx; struct mpsse_ctx;

View File

@ -106,8 +106,8 @@ static int opendous_quit(void);
/* Queue command functions */ /* Queue command functions */
static void opendous_end_state(tap_state_t state); static void opendous_end_state(tap_state_t state);
static void opendous_state_move(void); static void opendous_state_move(void);
static void opendous_path_move(int num_states, tap_state_t *path); static void opendous_path_move(unsigned int num_states, tap_state_t *path);
static void opendous_runtest(int num_cycles); static void opendous_runtest(unsigned int num_cycles);
static void opendous_scan(int ir_scan, enum scan_type type, uint8_t *buffer, static void opendous_scan(int ir_scan, enum scan_type type, uint8_t *buffer,
int scan_size, struct scan_command *command); int scan_size, struct scan_command *command);
static void opendous_reset(int trst, int srst); static void opendous_reset(int trst, int srst);
@ -248,7 +248,7 @@ static int opendous_execute_queue(struct jtag_command *cmd_queue)
while (cmd) { while (cmd) {
switch (cmd->type) { switch (cmd->type) {
case JTAG_RUNTEST: case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %i", cmd->cmd.runtest->num_cycles, LOG_DEBUG_IO("runtest %u cycles, end in %i", cmd->cmd.runtest->num_cycles,
cmd->cmd.runtest->end_state); cmd->cmd.runtest->end_state);
if (cmd->cmd.runtest->end_state != -1) if (cmd->cmd.runtest->end_state != -1)
@ -265,7 +265,7 @@ static int opendous_execute_queue(struct jtag_command *cmd_queue)
break; break;
case JTAG_PATHMOVE: case JTAG_PATHMOVE:
LOG_DEBUG_IO("pathmove: %i states, end in %i", LOG_DEBUG_IO("pathmove: %u states, end in %i",
cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->num_states,
cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
@ -419,11 +419,9 @@ void opendous_state_move(void)
tap_set_state(tap_get_end_state()); tap_set_state(tap_get_end_state());
} }
void opendous_path_move(int num_states, tap_state_t *path) void opendous_path_move(unsigned int num_states, tap_state_t *path)
{ {
int i; for (unsigned int i = 0; i < num_states; i++) {
for (i = 0; i < num_states; i++) {
if (path[i] == tap_state_transition(tap_get_state(), false)) if (path[i] == tap_state_transition(tap_get_state(), false))
opendous_tap_append_step(0, 0); opendous_tap_append_step(0, 0);
else if (path[i] == tap_state_transition(tap_get_state(), true)) else if (path[i] == tap_state_transition(tap_get_state(), true))
@ -440,10 +438,8 @@ void opendous_path_move(int num_states, tap_state_t *path)
tap_set_end_state(tap_get_state()); tap_set_end_state(tap_get_state());
} }
void opendous_runtest(int num_cycles) void opendous_runtest(unsigned int num_cycles)
{ {
int i;
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();
/* only do a state_move when we're not already in IDLE */ /* only do a state_move when we're not already in IDLE */
@ -453,7 +449,7 @@ void opendous_runtest(int num_cycles)
} }
/* execute num_cycles */ /* execute num_cycles */
for (i = 0; i < num_cycles; i++) for (unsigned int i = 0; i < num_cycles; i++)
opendous_tap_append_step(0, 0); opendous_tap_append_step(0, 0);
/* finish in end_state */ /* finish in end_state */

View File

@ -760,15 +760,17 @@ static void openjtag_execute_runtest(struct jtag_command *cmd)
if (openjtag_variant != OPENJTAG_VARIANT_CY7C65215 || if (openjtag_variant != OPENJTAG_VARIANT_CY7C65215 ||
cmd->cmd.runtest->num_cycles) { cmd->cmd.runtest->num_cycles) {
uint8_t command; uint8_t command;
int cycles = cmd->cmd.runtest->num_cycles; unsigned int num_cycles = cmd->cmd.runtest->num_cycles;
do { do {
const unsigned int num_cycles_cmd = MIN(num_cycles, 16);
command = 7; command = 7;
command |= (((cycles > 16 ? 16 : cycles) - 1) & 0x0F) << 4; command |= ((num_cycles_cmd - 1) & 0x0F) << 4;
openjtag_add_byte(command); openjtag_add_byte(command);
cycles -= 16; num_cycles -= num_cycles_cmd;
} while (cycles > 0); } while (num_cycles > 0);
} }
tap_set_end_state(end_state); tap_set_end_state(end_state);

View File

@ -381,7 +381,7 @@ static int osbdm_quit(void)
static int osbdm_add_pathmove( static int osbdm_add_pathmove(
struct queue *queue, struct queue *queue,
tap_state_t *path, tap_state_t *path,
int num_states) unsigned int num_states)
{ {
assert(num_states <= 32); assert(num_states <= 32);
@ -392,7 +392,7 @@ static int osbdm_add_pathmove(
} }
uint32_t tms = 0; uint32_t tms = 0;
for (int i = 0; i < num_states; i++) { for (unsigned int i = 0; i < num_states; i++) {
if (tap_state_transition(tap_get_state(), 1) == path[i]) { if (tap_state_transition(tap_get_state(), 1) == path[i]) {
tms |= (1 << i); tms |= (1 << i);
} else if (tap_state_transition(tap_get_state(), 0) == path[i]) { } else if (tap_state_transition(tap_get_state(), 0) == path[i]) {
@ -451,7 +451,7 @@ static int osbdm_add_statemove(
static int osbdm_add_stableclocks( static int osbdm_add_stableclocks(
struct queue *queue, struct queue *queue,
int count) unsigned int count)
{ {
if (!tap_is_state_stable(tap_get_state())) { if (!tap_is_state_stable(tap_get_state())) {
LOG_ERROR("BUG: current state (%s) is not stable", LOG_ERROR("BUG: current state (%s) is not stable",
@ -489,7 +489,7 @@ static int osbdm_add_tms(
static int osbdm_add_scan( static int osbdm_add_scan(
struct queue *queue, struct queue *queue,
struct scan_field *fields, struct scan_field *fields,
int num_fields, unsigned int num_fields,
tap_state_t end_state, tap_state_t end_state,
bool ir_scan) bool ir_scan)
{ {
@ -508,7 +508,7 @@ static int osbdm_add_scan(
/* Add scan */ /* Add scan */
tap_set_end_state(end_state); tap_set_end_state(end_state);
for (int idx = 0; idx < num_fields; idx++) { for (unsigned int idx = 0; idx < num_fields; idx++) {
struct sequence *next = queue_add_tail(queue, fields[idx].num_bits); struct sequence *next = queue_add_tail(queue, fields[idx].num_bits);
if (!next) { if (!next) {
LOG_ERROR("Can't allocate bit sequence"); LOG_ERROR("Can't allocate bit sequence");
@ -536,7 +536,7 @@ static int osbdm_add_scan(
static int osbdm_add_runtest( static int osbdm_add_runtest(
struct queue *queue, struct queue *queue,
int num_cycles, unsigned int num_cycles,
tap_state_t end_state) tap_state_t end_state)
{ {
if (osbdm_add_statemove(queue, TAP_IDLE, 0) != ERROR_OK) if (osbdm_add_statemove(queue, TAP_IDLE, 0) != ERROR_OK)

View File

@ -869,7 +869,7 @@ static void rlink_state_move(void)
static void rlink_path_move(struct pathmove_command *cmd) static void rlink_path_move(struct pathmove_command *cmd)
{ {
int num_states = cmd->num_states; unsigned int num_states = cmd->num_states;
int state_count; int state_count;
int tms = 0; int tms = 0;
@ -896,10 +896,8 @@ static void rlink_path_move(struct pathmove_command *cmd)
tap_set_end_state(tap_get_state()); tap_set_end_state(tap_get_state());
} }
static void rlink_runtest(int num_cycles) static void rlink_runtest(unsigned int num_cycles)
{ {
int i;
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();
/* only do a state_move when we're not already in RTI */ /* only do a state_move when we're not already in RTI */
@ -909,7 +907,7 @@ static void rlink_runtest(int num_cycles)
} }
/* execute num_cycles */ /* execute num_cycles */
for (i = 0; i < num_cycles; i++) for (unsigned int i = 0; i < num_cycles; i++)
tap_state_queue_append(0); tap_state_queue_append(0);
/* finish in end_state */ /* finish in end_state */
@ -1323,7 +1321,7 @@ static int rlink_execute_queue(struct jtag_command *cmd_queue)
rlink_state_move(); rlink_state_move();
break; break;
case JTAG_PATHMOVE: case JTAG_PATHMOVE:
LOG_DEBUG_IO("pathmove: %i states, end in %i", LOG_DEBUG_IO("pathmove: %u states, end in %i",
cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->num_states,
cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
rlink_path_move(cmd->cmd.pathmove); rlink_path_move(cmd->cmd.pathmove);

View File

@ -1701,15 +1701,17 @@ static int ulink_queue_reset(struct ulink *device, struct jtag_command *cmd)
*/ */
static int ulink_queue_pathmove(struct ulink *device, struct jtag_command *cmd) static int ulink_queue_pathmove(struct ulink *device, struct jtag_command *cmd)
{ {
int ret, i, num_states, batch_size, state_count; int ret, state_count;
tap_state_t *path; tap_state_t *path;
uint8_t tms_sequence; uint8_t tms_sequence;
num_states = cmd->cmd.pathmove->num_states; unsigned int num_states = cmd->cmd.pathmove->num_states;
path = cmd->cmd.pathmove->path; path = cmd->cmd.pathmove->path;
state_count = 0; state_count = 0;
while (num_states > 0) { while (num_states > 0) {
unsigned int batch_size;
tms_sequence = 0; tms_sequence = 0;
/* Determine batch size */ /* Determine batch size */
@ -1718,7 +1720,7 @@ static int ulink_queue_pathmove(struct ulink *device, struct jtag_command *cmd)
else else
batch_size = num_states; batch_size = num_states;
for (i = 0; i < batch_size; i++) { for (unsigned int i = 0; i < batch_size; i++) {
if (tap_state_transition(tap_get_state(), false) == path[state_count]) { if (tap_state_transition(tap_get_state(), false) == path[state_count]) {
/* Append '0' transition: clear bit 'i' in tms_sequence */ /* Append '0' transition: clear bit 'i' in tms_sequence */
buf_set_u32(&tms_sequence, i, 1, 0x0); buf_set_u32(&tms_sequence, i, 1, 0x0);
@ -1774,14 +1776,13 @@ static int ulink_queue_sleep(struct ulink *device, struct jtag_command *cmd)
static int ulink_queue_stableclocks(struct ulink *device, struct jtag_command *cmd) static int ulink_queue_stableclocks(struct ulink *device, struct jtag_command *cmd)
{ {
int ret; int ret;
unsigned num_cycles;
if (!tap_is_state_stable(tap_get_state())) { if (!tap_is_state_stable(tap_get_state())) {
LOG_ERROR("JTAG_STABLECLOCKS: state not stable"); LOG_ERROR("JTAG_STABLECLOCKS: state not stable");
return ERROR_FAIL; return ERROR_FAIL;
} }
num_cycles = cmd->cmd.stableclocks->num_cycles; unsigned int num_cycles = cmd->cmd.stableclocks->num_cycles;
/* TMS stays either high (Test Logic Reset state) or low (all other states) */ /* TMS stays either high (Test Logic Reset state) or low (all other states) */
if (tap_get_state() == TAP_RESET) if (tap_get_state() == TAP_RESET)

View File

@ -474,11 +474,9 @@ static void ublast_tms(struct tms_command *cmd)
*/ */
static void ublast_path_move(struct pathmove_command *cmd) static void ublast_path_move(struct pathmove_command *cmd)
{ {
int i; LOG_DEBUG_IO("(num_states=%u, last_state=%d)",
LOG_DEBUG_IO("(num_states=%d, last_state=%d)",
cmd->num_states, cmd->path[cmd->num_states - 1]); cmd->num_states, cmd->path[cmd->num_states - 1]);
for (i = 0; i < cmd->num_states; i++) { for (unsigned int i = 0; i < cmd->num_states; i++) {
if (tap_state_transition(tap_get_state(), false) == cmd->path[i]) if (tap_state_transition(tap_get_state(), false) == cmd->path[i])
ublast_clock_tms(0); ublast_clock_tms(0);
if (tap_state_transition(tap_get_state(), true) == cmd->path[i]) if (tap_state_transition(tap_get_state(), true) == cmd->path[i])
@ -675,19 +673,19 @@ static void ublast_queue_tdi(uint8_t *bits, int nb_bits, enum scan_type scan)
ublast_idle_clock(); ublast_idle_clock();
} }
static void ublast_runtest(int cycles, tap_state_t state) static void ublast_runtest(unsigned int num_cycles, tap_state_t state)
{ {
LOG_DEBUG_IO("%s(cycles=%i, end_state=%d)", __func__, cycles, state); LOG_DEBUG_IO("%s(cycles=%u, end_state=%d)", __func__, num_cycles, state);
ublast_state_move(TAP_IDLE, 0); ublast_state_move(TAP_IDLE, 0);
ublast_queue_tdi(NULL, cycles, SCAN_OUT); ublast_queue_tdi(NULL, num_cycles, SCAN_OUT);
ublast_state_move(state, 0); ublast_state_move(state, 0);
} }
static void ublast_stableclocks(int cycles) static void ublast_stableclocks(unsigned int num_cycles)
{ {
LOG_DEBUG_IO("%s(cycles=%i)", __func__, cycles); LOG_DEBUG_IO("%s(cycles=%u)", __func__, num_cycles);
ublast_queue_tdi(NULL, cycles, SCAN_OUT); ublast_queue_tdi(NULL, num_cycles, SCAN_OUT);
} }
/** /**

View File

@ -37,7 +37,7 @@
static void usbprog_end_state(tap_state_t state); static void usbprog_end_state(tap_state_t state);
static void usbprog_state_move(void); static void usbprog_state_move(void);
static void usbprog_path_move(struct pathmove_command *cmd); static void usbprog_path_move(struct pathmove_command *cmd);
static void usbprog_runtest(int num_cycles); static void usbprog_runtest(unsigned int num_cycles);
static void usbprog_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size); static void usbprog_scan(bool ir_scan, enum scan_type type, uint8_t *buffer, int scan_size);
#define UNKNOWN_COMMAND 0x00 #define UNKNOWN_COMMAND 0x00
@ -101,7 +101,7 @@ static int usbprog_execute_queue(struct jtag_command *cmd_queue)
usbprog_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst); usbprog_reset(cmd->cmd.reset->trst, cmd->cmd.reset->srst);
break; break;
case JTAG_RUNTEST: case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %i", LOG_DEBUG_IO("runtest %u cycles, end in %i",
cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->num_cycles,
cmd->cmd.runtest->end_state); cmd->cmd.runtest->end_state);
usbprog_end_state(cmd->cmd.runtest->end_state); usbprog_end_state(cmd->cmd.runtest->end_state);
@ -113,7 +113,7 @@ static int usbprog_execute_queue(struct jtag_command *cmd_queue)
usbprog_state_move(); usbprog_state_move();
break; break;
case JTAG_PATHMOVE: case JTAG_PATHMOVE:
LOG_DEBUG_IO("pathmove: %i states, end in %i", LOG_DEBUG_IO("pathmove: %u states, end in %i",
cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->num_states,
cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
usbprog_path_move(cmd->cmd.pathmove); usbprog_path_move(cmd->cmd.pathmove);
@ -189,7 +189,7 @@ static void usbprog_state_move(void)
static void usbprog_path_move(struct pathmove_command *cmd) static void usbprog_path_move(struct pathmove_command *cmd)
{ {
int num_states = cmd->num_states; unsigned int num_states = cmd->num_states;
int state_count; int state_count;
/* There may be queued transitions, and before following a specified /* There may be queued transitions, and before following a specified
@ -222,10 +222,8 @@ static void usbprog_path_move(struct pathmove_command *cmd)
tap_set_end_state(tap_get_state()); tap_set_end_state(tap_get_state());
} }
static void usbprog_runtest(int num_cycles) static void usbprog_runtest(unsigned int num_cycles)
{ {
int i;
/* only do a state_move when we're not already in IDLE */ /* only do a state_move when we're not already in IDLE */
if (tap_get_state() != TAP_IDLE) { if (tap_get_state() != TAP_IDLE) {
usbprog_end_state(TAP_IDLE); usbprog_end_state(TAP_IDLE);
@ -241,7 +239,7 @@ static void usbprog_runtest(int num_cycles)
/* LOG_INFO("NUM CYCLES %i",num_cycles); */ /* LOG_INFO("NUM CYCLES %i",num_cycles); */
} }
for (i = 0; i < num_cycles; i++) { for (unsigned int i = 0; i < num_cycles; i++) {
usbprog_write(1, 0, 0); usbprog_write(1, 0, 0);
usbprog_write(0, 0, 0); usbprog_write(0, 0, 0);
} }

View File

@ -931,11 +931,11 @@ static int vdebug_jtag_tms_seq(const uint8_t *tms, int num, uint8_t f_flush)
static int vdebug_jtag_path_move(struct pathmove_command *cmd, uint8_t f_flush) static int vdebug_jtag_path_move(struct pathmove_command *cmd, uint8_t f_flush)
{ {
uint8_t tms[DIV_ROUND_UP(cmd->num_states, 8)]; uint8_t tms[DIV_ROUND_UP(cmd->num_states, 8)];
LOG_DEBUG_IO("path num states %d", cmd->num_states); LOG_DEBUG_IO("path num states %u", cmd->num_states);
memset(tms, 0, DIV_ROUND_UP(cmd->num_states, 8)); memset(tms, 0, DIV_ROUND_UP(cmd->num_states, 8));
for (uint8_t i = 0; i < cmd->num_states; i++) { for (unsigned int i = 0; i < cmd->num_states; i++) {
if (tap_state_transition(tap_get_state(), true) == cmd->path[i]) if (tap_state_transition(tap_get_state(), true) == cmd->path[i])
buf_set_u32(tms, i, 1, 1); buf_set_u32(tms, i, 1, 1);
tap_set_state(cmd->path[i]); tap_set_state(cmd->path[i]);
@ -970,10 +970,10 @@ static int vdebug_jtag_scan(struct scan_command *cmd, uint8_t f_flush)
uint8_t num_pre = tap_get_tms_path_len(cur, state); uint8_t num_pre = tap_get_tms_path_len(cur, state);
uint8_t tms_post = tap_get_tms_path(state, cmd->end_state); uint8_t tms_post = tap_get_tms_path(state, cmd->end_state);
uint8_t num_post = tap_get_tms_path_len(state, cmd->end_state); uint8_t num_post = tap_get_tms_path_len(state, cmd->end_state);
int num_bits = jtag_scan_size(cmd); const unsigned int num_bits = jtag_scan_size(cmd);
LOG_DEBUG_IO("scan len:%d fields:%d ir/!dr:%d state cur:%x end:%x", LOG_DEBUG_IO("scan len:%u fields:%u ir/!dr:%d state cur:%x end:%x",
num_bits, cmd->num_fields, cmd->ir_scan, cur, cmd->end_state); num_bits, cmd->num_fields, cmd->ir_scan, cur, cmd->end_state);
for (int i = 0; i < cmd->num_fields; i++) { for (unsigned int i = 0; i < cmd->num_fields; i++) {
uint8_t cur_num_pre = i == 0 ? num_pre : 0; uint8_t cur_num_pre = i == 0 ? num_pre : 0;
uint8_t cur_tms_pre = i == 0 ? tms_pre : 0; uint8_t cur_tms_pre = i == 0 ? tms_pre : 0;
uint8_t cur_num_post = i == cmd->num_fields - 1 ? num_post : 0; uint8_t cur_num_post = i == cmd->num_fields - 1 ? num_post : 0;
@ -992,24 +992,24 @@ static int vdebug_jtag_scan(struct scan_command *cmd, uint8_t f_flush)
return rc; return rc;
} }
static int vdebug_jtag_runtest(int cycles, tap_state_t state, uint8_t f_flush) static int vdebug_jtag_runtest(unsigned int num_cycles, tap_state_t state, uint8_t f_flush)
{ {
tap_state_t cur = tap_get_state(); tap_state_t cur = tap_get_state();
uint8_t tms_pre = tap_get_tms_path(cur, state); uint8_t tms_pre = tap_get_tms_path(cur, state);
uint8_t num_pre = tap_get_tms_path_len(cur, state); uint8_t num_pre = tap_get_tms_path_len(cur, state);
LOG_DEBUG_IO("idle len:%d state cur:%x end:%x", cycles, cur, state); LOG_DEBUG_IO("idle len:%u state cur:%x end:%x", num_cycles, cur, state);
int rc = vdebug_jtag_shift_tap(vdc.hsocket, pbuf, num_pre, tms_pre, cycles, NULL, 0, 0, NULL, f_flush); int rc = vdebug_jtag_shift_tap(vdc.hsocket, pbuf, num_pre, tms_pre, num_cycles, NULL, 0, 0, NULL, f_flush);
if (cur != state) if (cur != state)
tap_set_state(state); tap_set_state(state);
return rc; return rc;
} }
static int vdebug_jtag_stableclocks(int num, uint8_t f_flush) static int vdebug_jtag_stableclocks(unsigned int num_cycles, uint8_t f_flush)
{ {
LOG_DEBUG("stab len:%d state cur:%x", num, tap_get_state()); LOG_DEBUG("stab len:%u state cur:%x", num_cycles, tap_get_state());
return vdebug_jtag_shift_tap(vdc.hsocket, pbuf, 0, 0, num, NULL, 0, 0, NULL, f_flush); return vdebug_jtag_shift_tap(vdc.hsocket, pbuf, 0, 0, num_cycles, NULL, 0, 0, NULL, f_flush);
} }
static int vdebug_sleep(int us) static int vdebug_sleep(int us)

View File

@ -43,10 +43,10 @@ static struct pending_scan_result
/* Queue command functions */ /* Queue command functions */
static void vsllink_end_state(tap_state_t state); static void vsllink_end_state(tap_state_t state);
static void vsllink_state_move(void); static void vsllink_state_move(void);
static void vsllink_path_move(int num_states, tap_state_t *path); static void vsllink_path_move(unsigned int num_states, tap_state_t *path);
static void vsllink_tms(int num_bits, const uint8_t *bits); static void vsllink_tms(int num_bits, const uint8_t *bits);
static void vsllink_runtest(int num_cycles); static void vsllink_runtest(unsigned int num_cycles);
static void vsllink_stableclocks(int num_cycles, int tms); static void vsllink_stableclocks(unsigned int num_cycles, int tms);
static void vsllink_scan(bool ir_scan, enum scan_type type, static void vsllink_scan(bool ir_scan, enum scan_type type,
uint8_t *buffer, int scan_size, struct scan_command *command); uint8_t *buffer, int scan_size, struct scan_command *command);
static int vsllink_reset(int trst, int srst); static int vsllink_reset(int trst, int srst);
@ -98,7 +98,7 @@ static int vsllink_execute_queue(struct jtag_command *cmd_queue)
while (cmd) { while (cmd) {
switch (cmd->type) { switch (cmd->type) {
case JTAG_RUNTEST: case JTAG_RUNTEST:
LOG_DEBUG_IO("runtest %i cycles, end in %s", LOG_DEBUG_IO("runtest %u cycles, end in %s",
cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->num_cycles,
tap_state_name(cmd->cmd.runtest->end_state)); tap_state_name(cmd->cmd.runtest->end_state));
@ -115,7 +115,7 @@ static int vsllink_execute_queue(struct jtag_command *cmd_queue)
break; break;
case JTAG_PATHMOVE: case JTAG_PATHMOVE:
LOG_DEBUG_IO("pathmove: %i states, end in %s", LOG_DEBUG_IO("pathmove: %u states, end in %s",
cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->num_states,
tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1])); tap_state_name(cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]));
@ -161,7 +161,7 @@ static int vsllink_execute_queue(struct jtag_command *cmd_queue)
break; break;
case JTAG_STABLECLOCKS: case JTAG_STABLECLOCKS:
LOG_DEBUG_IO("add %d clocks", LOG_DEBUG_IO("add %u clocks",
cmd->cmd.stableclocks->num_cycles); cmd->cmd.stableclocks->num_cycles);
switch (tap_get_state()) { switch (tap_get_state()) {
@ -371,9 +371,9 @@ static void vsllink_state_move(void)
tap_set_state(tap_get_end_state()); tap_set_state(tap_get_end_state());
} }
static void vsllink_path_move(int num_states, tap_state_t *path) static void vsllink_path_move(unsigned int num_states, tap_state_t *path)
{ {
for (int i = 0; i < num_states; i++) { for (unsigned int i = 0; i < num_states; i++) {
if (path[i] == tap_state_transition(tap_get_state(), false)) if (path[i] == tap_state_transition(tap_get_state(), false))
vsllink_tap_append_step(0, 0); vsllink_tap_append_step(0, 0);
else if (path[i] == tap_state_transition(tap_get_state(), true)) else if (path[i] == tap_state_transition(tap_get_state(), true))
@ -397,7 +397,7 @@ static void vsllink_tms(int num_bits, const uint8_t *bits)
vsllink_tap_append_step((bits[i / 8] >> (i % 8)) & 1, 0); vsllink_tap_append_step((bits[i / 8] >> (i % 8)) & 1, 0);
} }
static void vsllink_stableclocks(int num_cycles, int tms) static void vsllink_stableclocks(unsigned int num_cycles, int tms)
{ {
while (num_cycles > 0) { while (num_cycles > 0) {
vsllink_tap_append_step(tms, 0); vsllink_tap_append_step(tms, 0);
@ -405,7 +405,7 @@ static void vsllink_stableclocks(int num_cycles, int tms)
} }
} }
static void vsllink_runtest(int num_cycles) static void vsllink_runtest(unsigned int num_cycles)
{ {
tap_state_t saved_end_state = tap_get_end_state(); tap_state_t saved_end_state = tap_get_end_state();

View File

@ -1669,7 +1669,6 @@ static void xds110_execute_tlr_reset(struct jtag_command *cmd)
static void xds110_execute_pathmove(struct jtag_command *cmd) static void xds110_execute_pathmove(struct jtag_command *cmd)
{ {
uint32_t i;
uint32_t num_states; uint32_t num_states;
uint8_t *path; uint8_t *path;
@ -1685,7 +1684,7 @@ static void xds110_execute_pathmove(struct jtag_command *cmd)
} }
/* Convert requested path states into XDS API states */ /* Convert requested path states into XDS API states */
for (i = 0; i < num_states; i++) for (unsigned int i = 0; i < num_states; i++)
path[i] = (uint8_t)xds_jtag_state[cmd->cmd.pathmove->path[i]]; path[i] = (uint8_t)xds_jtag_state[cmd->cmd.pathmove->path[i]];
if (xds110.firmware >= OCD_FIRMWARE_VERSION) { if (xds110.firmware >= OCD_FIRMWARE_VERSION) {
@ -1704,7 +1703,6 @@ static void xds110_execute_pathmove(struct jtag_command *cmd)
static void xds110_queue_scan(struct jtag_command *cmd) static void xds110_queue_scan(struct jtag_command *cmd)
{ {
int i;
uint32_t offset; uint32_t offset;
uint32_t total_fields; uint32_t total_fields;
uint32_t total_bits; uint32_t total_bits;
@ -1715,7 +1713,7 @@ static void xds110_queue_scan(struct jtag_command *cmd)
/* Calculate the total number of bits to scan */ /* Calculate the total number of bits to scan */
total_bits = 0; total_bits = 0;
total_fields = 0; total_fields = 0;
for (i = 0; i < cmd->cmd.scan->num_fields; i++) { for (unsigned int i = 0; i < cmd->cmd.scan->num_fields; i++) {
total_fields++; total_fields++;
total_bits += (uint32_t)cmd->cmd.scan->fields[i].num_bits; total_bits += (uint32_t)cmd->cmd.scan->fields[i].num_bits;
} }
@ -1756,7 +1754,7 @@ static void xds110_queue_scan(struct jtag_command *cmd)
buffer = &xds110.txn_requests[xds110.txn_request_size]; buffer = &xds110.txn_requests[xds110.txn_request_size];
/* Clear data out buffer to default value of all zeros */ /* Clear data out buffer to default value of all zeros */
memset((void *)buffer, 0x00, total_bytes); memset((void *)buffer, 0x00, total_bytes);
for (i = 0; i < cmd->cmd.scan->num_fields; i++) { for (unsigned int i = 0; i < cmd->cmd.scan->num_fields; i++) {
if (cmd->cmd.scan->fields[i].out_value) { if (cmd->cmd.scan->fields[i].out_value) {
/* Copy over data to scan out into request buffer */ /* Copy over data to scan out into request buffer */
bit_copy(buffer, offset, cmd->cmd.scan->fields[i].out_value, 0, bit_copy(buffer, offset, cmd->cmd.scan->fields[i].out_value, 0,
@ -1775,7 +1773,7 @@ static void xds110_queue_scan(struct jtag_command *cmd)
static void xds110_queue_runtest(struct jtag_command *cmd) static void xds110_queue_runtest(struct jtag_command *cmd)
{ {
uint32_t clocks = (uint32_t)cmd->cmd.stableclocks->num_cycles; uint32_t clocks = cmd->cmd.stableclocks->num_cycles;
uint8_t end_state = (uint8_t)xds_jtag_state[cmd->cmd.runtest->end_state]; uint8_t end_state = (uint8_t)xds_jtag_state[cmd->cmd.runtest->end_state];
/* Check if new request would be too large to fit */ /* Check if new request would be too large to fit */
@ -1794,7 +1792,7 @@ static void xds110_queue_runtest(struct jtag_command *cmd)
static void xds110_queue_stableclocks(struct jtag_command *cmd) static void xds110_queue_stableclocks(struct jtag_command *cmd)
{ {
uint32_t clocks = (uint32_t)cmd->cmd.stableclocks->num_cycles; uint32_t clocks = cmd->cmd.stableclocks->num_cycles;
/* Check if new request would be too large to fit */ /* Check if new request would be too large to fit */
if ((xds110.txn_request_size + 1 + sizeof(clocks) + 1) > MAX_DATA_BLOCK) if ((xds110.txn_request_size + 1 + sizeof(clocks) + 1) > MAX_DATA_BLOCK)

View File

@ -128,7 +128,7 @@ static int xlnx_pcie_xvc_execute_stableclocks(struct jtag_command *cmd)
size_t write; size_t write;
int err; int err;
LOG_DEBUG("stableclocks %i cycles", cmd->cmd.runtest->num_cycles); LOG_DEBUG("stableclocks %u cycles", cmd->cmd.runtest->num_cycles);
while (left) { while (left) {
write = MIN(XLNX_XVC_MAX_BITS, left); write = MIN(XLNX_XVC_MAX_BITS, left);
@ -167,7 +167,7 @@ static int xlnx_pcie_xvc_execute_runtest(struct jtag_command *cmd)
{ {
int err = ERROR_OK; int err = ERROR_OK;
LOG_DEBUG("runtest %i cycles, end in %i", LOG_DEBUG("runtest %u cycles, end in %i",
cmd->cmd.runtest->num_cycles, cmd->cmd.runtest->num_cycles,
cmd->cmd.runtest->end_state); cmd->cmd.runtest->end_state);
@ -200,16 +200,15 @@ static int xlnx_pcie_xvc_execute_runtest(struct jtag_command *cmd)
static int xlnx_pcie_xvc_execute_pathmove(struct jtag_command *cmd) static int xlnx_pcie_xvc_execute_pathmove(struct jtag_command *cmd)
{ {
size_t num_states = cmd->cmd.pathmove->num_states; unsigned int num_states = cmd->cmd.pathmove->num_states;
tap_state_t *path = cmd->cmd.pathmove->path; tap_state_t *path = cmd->cmd.pathmove->path;
int err = ERROR_OK; int err = ERROR_OK;
size_t i;
LOG_DEBUG("pathmove: %i states, end in %i", LOG_DEBUG("pathmove: %u states, end in %i",
cmd->cmd.pathmove->num_states, cmd->cmd.pathmove->num_states,
cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]); cmd->cmd.pathmove->path[cmd->cmd.pathmove->num_states - 1]);
for (i = 0; i < num_states; i++) { for (unsigned int i = 0; i < num_states; i++) {
if (path[i] == tap_state_transition(tap_get_state(), false)) { if (path[i] == tap_state_transition(tap_get_state(), false)) {
err = xlnx_pcie_xvc_transact(1, 1, 0, NULL); err = xlnx_pcie_xvc_transact(1, 1, 0, NULL);
} else if (path[i] == tap_state_transition(tap_get_state(), true)) { } else if (path[i] == tap_state_transition(tap_get_state(), true)) {

View File

@ -319,37 +319,37 @@ COMMAND_HANDLER(interface_handle_hla_command)
return ERROR_OK; return ERROR_OK;
} }
static const struct command_registration hl_interface_command_handlers[] = { static const struct command_registration hl_interface_subcommand_handlers[] = {
{ {
.name = "hla_device_desc", .name = "device_desc",
.handler = &hl_interface_handle_device_desc_command, .handler = &hl_interface_handle_device_desc_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "set the device description of the adapter", .help = "set the device description of the adapter",
.usage = "description_string", .usage = "description_string",
}, },
{ {
.name = "hla_layout", .name = "layout",
.handler = &hl_interface_handle_layout_command, .handler = &hl_interface_handle_layout_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "set the layout of the adapter", .help = "set the layout of the adapter",
.usage = "layout_name", .usage = "layout_name",
}, },
{ {
.name = "hla_vid_pid", .name = "vid_pid",
.handler = &hl_interface_handle_vid_pid_command, .handler = &hl_interface_handle_vid_pid_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "the vendor and product ID of the adapter", .help = "the vendor and product ID of the adapter",
.usage = "(vid pid)*", .usage = "(vid pid)*",
}, },
{ {
.name = "hla_stlink_backend", .name = "stlink_backend",
.handler = &hl_interface_handle_stlink_backend_command, .handler = &hl_interface_handle_stlink_backend_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "select which ST-Link backend to use", .help = "select which ST-Link backend to use",
.usage = "usb | tcp [port]", .usage = "usb | tcp [port]",
}, },
{ {
.name = "hla_command", .name = "command",
.handler = &interface_handle_hla_command, .handler = &interface_handle_hla_command,
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.help = "execute a custom adapter-specific command", .help = "execute a custom adapter-specific command",
@ -358,6 +358,17 @@ static const struct command_registration hl_interface_command_handlers[] = {
COMMAND_REGISTRATION_DONE COMMAND_REGISTRATION_DONE
}; };
static const struct command_registration hl_interface_command_handlers[] = {
{
.name = "hla",
.mode = COMMAND_ANY,
.help = "perform hla management",
.chain = hl_interface_subcommand_handlers,
.usage = "",
},
COMMAND_REGISTRATION_DONE
};
struct adapter_driver hl_adapter_driver = { struct adapter_driver hl_adapter_driver = {
.name = "hla", .name = "hla",
.transports = hl_transports, .transports = hl_transports,

View File

@ -86,7 +86,7 @@ extern tap_state_t cmd_queue_cur_state;
*/ */
struct scan_field { struct scan_field {
/** The number of bits this field specifies */ /** The number of bits this field specifies */
int num_bits; unsigned int num_bits;
/** A pointer to value to be scanned into the device */ /** A pointer to value to be scanned into the device */
const uint8_t *out_value; const uint8_t *out_value;
/** A pointer to a 32-bit memory location for data scanned out */ /** A pointer to a 32-bit memory location for data scanned out */
@ -102,12 +102,12 @@ struct jtag_tap {
char *chip; char *chip;
char *tapname; char *tapname;
char *dotted_name; char *dotted_name;
int abs_chain_position; unsigned int abs_chain_position;
/** Is this TAP disabled after JTAG reset? */ /** Is this TAP disabled after JTAG reset? */
bool disabled_after_reset; bool disabled_after_reset;
/** Is this TAP currently enabled? */ /** Is this TAP currently enabled? */
bool enabled; bool enabled;
int ir_length; /**< size of instruction register */ unsigned int ir_length; /**< size of instruction register */
uint32_t ir_capture_value; uint32_t ir_capture_value;
uint8_t *expected; /**< Capture-IR expected value */ uint8_t *expected; /**< Capture-IR expected value */
uint32_t ir_capture_mask; uint32_t ir_capture_mask;
@ -150,10 +150,10 @@ struct jtag_tap *jtag_all_taps(void);
const char *jtag_tap_name(const struct jtag_tap *tap); const char *jtag_tap_name(const struct jtag_tap *tap);
struct jtag_tap *jtag_tap_by_string(const char *dotted_name); struct jtag_tap *jtag_tap_by_string(const char *dotted_name);
struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *obj); struct jtag_tap *jtag_tap_by_jim_obj(Jim_Interp *interp, Jim_Obj *obj);
struct jtag_tap *jtag_tap_by_position(unsigned abs_position); struct jtag_tap *jtag_tap_by_position(unsigned int abs_position);
struct jtag_tap *jtag_tap_next_enabled(struct jtag_tap *p); struct jtag_tap *jtag_tap_next_enabled(struct jtag_tap *p);
unsigned jtag_tap_count_enabled(void); unsigned int jtag_tap_count_enabled(void);
unsigned jtag_tap_count(void); unsigned int jtag_tap_count(void);
/* /*
* - TRST_ASSERTED triggers two sets of callbacks, after operations to * - TRST_ASSERTED triggers two sets of callbacks, after operations to
@ -229,17 +229,17 @@ enum reset_types {
enum reset_types jtag_get_reset_config(void); enum reset_types jtag_get_reset_config(void);
void jtag_set_reset_config(enum reset_types type); void jtag_set_reset_config(enum reset_types type);
void jtag_set_nsrst_delay(unsigned delay); void jtag_set_nsrst_delay(unsigned int delay);
unsigned jtag_get_nsrst_delay(void); unsigned int jtag_get_nsrst_delay(void);
void jtag_set_ntrst_delay(unsigned delay); void jtag_set_ntrst_delay(unsigned int delay);
unsigned jtag_get_ntrst_delay(void); unsigned int jtag_get_ntrst_delay(void);
void jtag_set_nsrst_assert_width(unsigned delay); void jtag_set_nsrst_assert_width(unsigned int delay);
unsigned jtag_get_nsrst_assert_width(void); unsigned int jtag_get_nsrst_assert_width(void);
void jtag_set_ntrst_assert_width(unsigned delay); void jtag_set_ntrst_assert_width(unsigned int delay);
unsigned jtag_get_ntrst_assert_width(void); unsigned int jtag_get_ntrst_assert_width(void);
/** @returns The current state of TRST. */ /** @returns The current state of TRST. */
int jtag_get_trst(void); int jtag_get_trst(void);
@ -436,7 +436,7 @@ void jtag_add_tlr(void);
* - ERROR_JTAG_TRANSITION_INVALID -- The path includes invalid * - ERROR_JTAG_TRANSITION_INVALID -- The path includes invalid
* state transitions. * state transitions.
*/ */
void jtag_add_pathmove(int num_states, const tap_state_t *path); void jtag_add_pathmove(unsigned int num_states, const tap_state_t *path);
/** /**
* jtag_add_statemove() moves from the current state to @a goal_state. * jtag_add_statemove() moves from the current state to @a goal_state.
@ -459,7 +459,7 @@ int jtag_add_statemove(tap_state_t goal_state);
* via TAP_IDLE. * via TAP_IDLE.
* @param endstate The final state. * @param endstate The final state.
*/ */
void jtag_add_runtest(int num_cycles, tap_state_t endstate); void jtag_add_runtest(unsigned int num_cycles, tap_state_t endstate);
/** /**
* A reset of the TAP state machine can be requested. * A reset of the TAP state machine can be requested.
@ -488,14 +488,14 @@ void jtag_add_reset(int req_tlr_or_trst, int srst);
void jtag_add_sleep(uint32_t us); void jtag_add_sleep(uint32_t us);
int jtag_add_tms_seq(unsigned nbits, const uint8_t *seq, enum tap_state t); int jtag_add_tms_seq(unsigned int nbits, const uint8_t *seq, enum tap_state t);
/** /**
* Function jtag_add_clocks * Function jtag_add_clocks
* first checks that the state in which the clocks are to be issued is * first checks that the state in which the clocks are to be issued is
* stable, then queues up num_cycles clocks for transmission. * stable, then queues up num_cycles clocks for transmission.
*/ */
void jtag_add_clocks(int num_cycles); void jtag_add_clocks(unsigned int num_cycles);
/** /**
* For software FIFO implementations, the queued commands can be executed * For software FIFO implementations, the queued commands can be executed
@ -523,7 +523,7 @@ int jtag_execute_queue(void);
void jtag_execute_queue_noclear(void); void jtag_execute_queue_noclear(void);
/** @returns the number of times the scan queue has been flushed */ /** @returns the number of times the scan queue has been flushed */
int jtag_get_flush_queue_count(void); unsigned int jtag_get_flush_queue_count(void);
/** Report Tcl event to all TAPs */ /** Report Tcl event to all TAPs */
void jtag_notify_event(enum jtag_event); void jtag_notify_event(enum jtag_event);

View File

@ -51,8 +51,8 @@ int interface_jtag_add_plain_dr_scan(
tap_state_t endstate); tap_state_t endstate);
int interface_jtag_add_tlr(void); int interface_jtag_add_tlr(void);
int interface_jtag_add_pathmove(int num_states, const tap_state_t *path); int interface_jtag_add_pathmove(unsigned int num_states, const tap_state_t *path);
int interface_jtag_add_runtest(int num_cycles, tap_state_t endstate); int interface_jtag_add_runtest(unsigned int num_cycles, tap_state_t endstate);
int interface_add_tms_seq(unsigned num_bits, int interface_add_tms_seq(unsigned num_bits,
const uint8_t *bits, enum tap_state state); const uint8_t *bits, enum tap_state state);
@ -67,7 +67,7 @@ int interface_add_tms_seq(unsigned num_bits,
*/ */
int interface_jtag_add_reset(int trst, int srst); int interface_jtag_add_reset(int trst, int srst);
int interface_jtag_add_sleep(uint32_t us); int interface_jtag_add_sleep(uint32_t us);
int interface_jtag_add_clocks(int num_cycles); int interface_jtag_add_clocks(unsigned int num_cycles);
int interface_jtag_execute_queue(void); int interface_jtag_execute_queue(void);
/** /**

View File

@ -1126,6 +1126,36 @@ proc "cmsis_dap_usb" {args} {
eval cmsis-dap usb $args eval cmsis-dap usb $args
} }
lappend _telnet_autocomplete_skip "hla_layout"
proc "hla_layout" {layout} {
echo "DEPRECATED! use 'hla layout', not 'hla_layout'"
eval hla layout $layout
}
lappend _telnet_autocomplete_skip "hla_device_desc"
proc "hla_device_desc" {desc} {
echo "DEPRECATED! use 'hla device_desc', not 'hla_device_desc'"
eval hla device_desc $desc
}
lappend _telnet_autocomplete_skip "hla_vid_pid"
proc "hla_vid_pid" {args} {
echo "DEPRECATED! use 'hla vid_pid', not 'hla_vid_pid'"
eval hla vid_pid $args
}
lappend _telnet_autocomplete_skip "hla_command"
proc "hla_command" {command} {
echo "DEPRECATED! use 'hla command', not 'hla_command'"
eval hla command $command
}
lappend _telnet_autocomplete_skip "hla_stlink_backend"
proc "hla_stlink_backend" {args} {
echo "DEPRECATED! use 'hla stlink_backend', not 'hla_stlink_backend'"
eval hla stlink_backend $args
}
lappend _telnet_autocomplete_skip "kitprog_init_acquire_psoc" lappend _telnet_autocomplete_skip "kitprog_init_acquire_psoc"
proc "kitprog_init_acquire_psoc" {} { proc "kitprog_init_acquire_psoc" {} {
echo "DEPRECATED! use 'kitprog init_acquire_psoc', not 'kitprog_init_acquire_psoc'" echo "DEPRECATED! use 'kitprog init_acquire_psoc', not 'kitprog_init_acquire_psoc'"

View File

@ -87,8 +87,11 @@ static COMMAND_HELPER(handle_jtag_command_drscan_fields, struct scan_field *fiel
LOG_ERROR("Out of memory"); LOG_ERROR("Out of memory");
return ERROR_FAIL; return ERROR_FAIL;
} }
fields[field_count].out_value = t; fields[field_count].out_value = t;
str_to_buf(CMD_ARGV[i + 1], strlen(CMD_ARGV[i + 1]), t, bits, 0); int ret = CALL_COMMAND_HANDLER(command_parse_str_to_buf, CMD_ARGV[i + 1], t, bits, 0);
if (ret != ERROR_OK)
return ret;
fields[field_count].in_value = t; fields[field_count].in_value = t;
field_count++; field_count++;
} }
@ -209,8 +212,8 @@ COMMAND_HANDLER(handle_jtag_flush_count)
if (CMD_ARGC != 0) if (CMD_ARGC != 0)
return ERROR_COMMAND_SYNTAX_ERROR; return ERROR_COMMAND_SYNTAX_ERROR;
int count = jtag_get_flush_queue_count(); const unsigned int count = jtag_get_flush_queue_count();
command_print_sameline(CMD, "%d", count); command_print_sameline(CMD, "%u", count);
return ERROR_OK; return ERROR_OK;
} }
@ -445,11 +448,11 @@ static COMMAND_HELPER(handle_jtag_newtap_args, struct jtag_tap *tap)
if (!CMD_ARGC) if (!CMD_ARGC)
return ERROR_COMMAND_ARGUMENT_INVALID; return ERROR_COMMAND_ARGUMENT_INVALID;
COMMAND_PARSE_NUMBER(int, CMD_ARGV[0], tap->ir_length); COMMAND_PARSE_NUMBER(uint, CMD_ARGV[0], tap->ir_length);
CMD_ARGC--; CMD_ARGC--;
CMD_ARGV++; CMD_ARGV++;
if (tap->ir_length > (int)(8 * sizeof(tap->ir_capture_value))) if (tap->ir_length > (8 * sizeof(tap->ir_capture_value)))
LOG_WARNING("%s: huge IR length %d", tap->dotted_name, tap->ir_length); LOG_WARNING("%s: huge IR length %u", tap->dotted_name, tap->ir_length);
break; break;
case NTAP_OPT_IRMASK: case NTAP_OPT_IRMASK:
@ -811,13 +814,13 @@ COMMAND_HANDLER(handle_scan_chain_command)
expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length); expected_mask = buf_get_u32(tap->expected_mask, 0, tap->ir_length);
command_print(CMD, command_print(CMD,
"%2d %-18s %c 0x%08x %s %5d 0x%02x 0x%02x", "%2u %-18s %c 0x%08x %s %5u 0x%02x 0x%02x",
tap->abs_chain_position, tap->abs_chain_position,
tap->dotted_name, tap->dotted_name,
tap->enabled ? 'Y' : 'n', tap->enabled ? 'Y' : 'n',
(unsigned int)(tap->idcode), (unsigned int)(tap->idcode),
expected_id, expected_id,
(unsigned int)(tap->ir_length), tap->ir_length,
(unsigned int)(expected), (unsigned int)(expected),
(unsigned int)(expected_mask)); (unsigned int)(expected_mask));
@ -969,7 +972,7 @@ COMMAND_HANDLER(handle_irscan_command)
if (retval != ERROR_OK) if (retval != ERROR_OK)
goto error_return; goto error_return;
int field_size = tap->ir_length; unsigned int field_size = tap->ir_length;
fields[i].num_bits = field_size; fields[i].num_bits = field_size;
uint8_t *v = calloc(1, DIV_ROUND_UP(field_size, 8)); uint8_t *v = calloc(1, DIV_ROUND_UP(field_size, 8));
if (!v) { if (!v) {

View File

@ -36,7 +36,18 @@ struct target *hwthread_swbp_target(struct rtos *rtos, target_addr_t address,
static inline threadid_t threadid_from_target(const struct target *target) static inline threadid_t threadid_from_target(const struct target *target)
{ {
return target->coreid + 1; if (!target->smp)
return 1;
threadid_t threadid = 1;
struct target_list *head;
foreach_smp_target(head, target->smp_targets) {
if (target == head->target)
return threadid;
++threadid;
}
assert(0 && "Target is not found in it's own SMP group!");
return -1;
} }
const struct rtos_type hwthread_rtos = { const struct rtos_type hwthread_rtos = {
@ -59,14 +70,13 @@ struct hwthread_params {
int dummy_param; int dummy_param;
}; };
static int hwthread_fill_thread(struct rtos *rtos, struct target *curr, int thread_num) static int hwthread_fill_thread(struct rtos *rtos, struct target *curr, int thread_num, threadid_t tid)
{ {
char tmp_str[HW_THREAD_NAME_STR_SIZE]; char tmp_str[HW_THREAD_NAME_STR_SIZE];
threadid_t tid = threadid_from_target(curr);
memset(tmp_str, 0, HW_THREAD_NAME_STR_SIZE); memset(tmp_str, 0, HW_THREAD_NAME_STR_SIZE);
/* thread-id is the core-id of this core inside the SMP group plus 1 */ /* thread-id is the index of this core inside the SMP group plus 1 */
rtos->thread_details[thread_num].threadid = tid; rtos->thread_details[thread_num].threadid = tid;
/* create the thread name */ /* create the thread name */
rtos->thread_details[thread_num].exists = true; rtos->thread_details[thread_num].exists = true;
@ -130,9 +140,8 @@ static int hwthread_update_threads(struct rtos *rtos)
curr->state == TARGET_UNAVAILABLE) curr->state == TARGET_UNAVAILABLE)
continue; continue;
threadid_t tid = threadid_from_target(curr); threadid_t tid = threads_found + 1;
hwthread_fill_thread(rtos, curr, threads_found, tid);
hwthread_fill_thread(rtos, curr, threads_found);
/* find an interesting thread to set as current */ /* find an interesting thread to set as current */
switch (current_reason) { switch (current_reason) {
@ -189,8 +198,8 @@ static int hwthread_update_threads(struct rtos *rtos)
threads_found++; threads_found++;
} }
} else { } else {
hwthread_fill_thread(rtos, target, threads_found); current_thread = 1;
current_thread = threadid_from_target(target); hwthread_fill_thread(rtos, target, threads_found, current_thread);
threads_found++; threads_found++;
} }
@ -213,19 +222,17 @@ static int hwthread_smp_init(struct target *target)
return hwthread_update_threads(target->rtos); return hwthread_update_threads(target->rtos);
} }
static struct target *hwthread_find_thread(struct target *target, int64_t thread_id) static struct target *hwthread_find_thread(struct target *target, threadid_t thread_id)
{ {
/* Find the thread with that thread_id */ /* Find the thread with that thread_id (index in SMP group plus 1)*/
if (!target) if (!(target && target->smp))
return NULL;
if (target->smp) {
struct target_list *head;
foreach_smp_target(head, target->smp_targets) {
if (thread_id == threadid_from_target(head->target))
return head->target;
}
} else if (thread_id == threadid_from_target(target)) {
return target; return target;
struct target_list *head;
threadid_t tid = 1;
foreach_smp_target(head, target->smp_targets) {
if (thread_id == tid)
return head->target;
++tid;
} }
return NULL; return NULL;
} }
@ -304,7 +311,7 @@ static int hwthread_get_thread_reg_value(struct rtos *rtos, int64_t thread_id,
} }
if (!target_was_examined(curr)) { if (!target_was_examined(curr)) {
LOG_ERROR("Target %d hasn't been examined yet.", curr->coreid); LOG_TARGET_ERROR(curr, "Target hasn't been examined yet.");
return ERROR_FAIL; return ERROR_FAIL;
} }
@ -392,9 +399,9 @@ static int hwthread_thread_packet(struct connection *connection, const char *pac
return ERROR_FAIL; return ERROR_FAIL;
} }
target->rtos->current_thread = current_threadid; target->rtos->current_thread = current_threadid;
} else } else if (current_threadid == 0 || current_threadid == -1) {
if (current_threadid == 0 || current_threadid == -1)
target->rtos->current_thread = threadid_from_target(target); target->rtos->current_thread = threadid_from_target(target);
}
target->rtos->current_threadid = current_threadid; target->rtos->current_threadid = current_threadid;

View File

@ -1599,7 +1599,7 @@ static int gdb_read_memory_packet(struct connection *connection,
* cmd = view%20audit-trail&database = gdb&pr = 2395 * cmd = view%20audit-trail&database = gdb&pr = 2395
* *
* For now, the default is to fix up things to make current GDB versions work. * For now, the default is to fix up things to make current GDB versions work.
* This can be overwritten using the gdb_report_data_abort <'enable'|'disable'> command. * This can be overwritten using the "gdb report_data_abort <'enable'|'disable'>" command.
*/ */
memset(buffer, 0, len); memset(buffer, 0, len);
retval = ERROR_OK; retval = ERROR_OK;
@ -4034,7 +4034,7 @@ COMMAND_HANDLER(handle_gdb_sync_command)
if (!current_gdb_connection) { if (!current_gdb_connection) {
command_print(CMD, command_print(CMD,
"gdb_sync command can only be run from within gdb using \"monitor gdb_sync\""); "gdb sync command can only be run from within gdb using \"monitor gdb sync\"");
return ERROR_FAIL; return ERROR_FAIL;
} }
@ -4043,7 +4043,6 @@ COMMAND_HANDLER(handle_gdb_sync_command)
return ERROR_OK; return ERROR_OK;
} }
/* daemon configuration command gdb_port */
COMMAND_HANDLER(handle_gdb_port_command) COMMAND_HANDLER(handle_gdb_port_command)
{ {
int retval = CALL_COMMAND_HANDLER(server_pipe_command, &gdb_port); int retval = CALL_COMMAND_HANDLER(server_pipe_command, &gdb_port);
@ -4090,7 +4089,6 @@ COMMAND_HANDLER(handle_gdb_report_register_access_error)
return ERROR_OK; return ERROR_OK;
} }
/* gdb_breakpoint_override */
COMMAND_HANDLER(handle_gdb_breakpoint_override_command) COMMAND_HANDLER(handle_gdb_breakpoint_override_command)
{ {
if (CMD_ARGC == 0) { if (CMD_ARGC == 0) {
@ -4167,9 +4165,9 @@ out:
return retval; return retval;
} }
static const struct command_registration gdb_command_handlers[] = { static const struct command_registration gdb_subcommand_handlers[] = {
{ {
.name = "gdb_sync", .name = "sync",
.handler = handle_gdb_sync_command, .handler = handle_gdb_sync_command,
.mode = COMMAND_ANY, .mode = COMMAND_ANY,
.help = "next stepi will return immediately allowing " .help = "next stepi will return immediately allowing "
@ -4178,7 +4176,7 @@ static const struct command_registration gdb_command_handlers[] = {
.usage = "" .usage = ""
}, },
{ {
.name = "gdb_port", .name = "port",
.handler = handle_gdb_port_command, .handler = handle_gdb_port_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "Normally gdb listens to a TCP/IP port. Each subsequent GDB " .help = "Normally gdb listens to a TCP/IP port. Each subsequent GDB "
@ -4191,35 +4189,35 @@ static const struct command_registration gdb_command_handlers[] = {
.usage = "[port_num]", .usage = "[port_num]",
}, },
{ {
.name = "gdb_memory_map", .name = "memory_map",
.handler = handle_gdb_memory_map_command, .handler = handle_gdb_memory_map_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "enable or disable memory map", .help = "enable or disable memory map",
.usage = "('enable'|'disable')" .usage = "('enable'|'disable')"
}, },
{ {
.name = "gdb_flash_program", .name = "flash_program",
.handler = handle_gdb_flash_program_command, .handler = handle_gdb_flash_program_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "enable or disable flash program", .help = "enable or disable flash program",
.usage = "('enable'|'disable')" .usage = "('enable'|'disable')"
}, },
{ {
.name = "gdb_report_data_abort", .name = "report_data_abort",
.handler = handle_gdb_report_data_abort_command, .handler = handle_gdb_report_data_abort_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "enable or disable reporting data aborts", .help = "enable or disable reporting data aborts",
.usage = "('enable'|'disable')" .usage = "('enable'|'disable')"
}, },
{ {
.name = "gdb_report_register_access_error", .name = "report_register_access_error",
.handler = handle_gdb_report_register_access_error, .handler = handle_gdb_report_register_access_error,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "enable or disable reporting register access errors", .help = "enable or disable reporting register access errors",
.usage = "('enable'|'disable')" .usage = "('enable'|'disable')"
}, },
{ {
.name = "gdb_breakpoint_override", .name = "breakpoint_override",
.handler = handle_gdb_breakpoint_override_command, .handler = handle_gdb_breakpoint_override_command,
.mode = COMMAND_ANY, .mode = COMMAND_ANY,
.help = "Display or specify type of breakpoint " .help = "Display or specify type of breakpoint "
@ -4227,14 +4225,14 @@ static const struct command_registration gdb_command_handlers[] = {
.usage = "('hard'|'soft'|'disable')" .usage = "('hard'|'soft'|'disable')"
}, },
{ {
.name = "gdb_target_description", .name = "target_description",
.handler = handle_gdb_target_description_command, .handler = handle_gdb_target_description_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "enable or disable target description", .help = "enable or disable target description",
.usage = "('enable'|'disable')" .usage = "('enable'|'disable')"
}, },
{ {
.name = "gdb_save_tdesc", .name = "save_tdesc",
.handler = handle_gdb_save_tdesc_command, .handler = handle_gdb_save_tdesc_command,
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.help = "Save the target description file", .help = "Save the target description file",
@ -4243,6 +4241,17 @@ static const struct command_registration gdb_command_handlers[] = {
COMMAND_REGISTRATION_DONE COMMAND_REGISTRATION_DONE
}; };
static const struct command_registration gdb_command_handlers[] = {
{
.name = "gdb",
.mode = COMMAND_ANY,
.help = "GDB commands",
.chain = gdb_subcommand_handlers,
.usage = "",
},
COMMAND_REGISTRATION_DONE
};
int gdb_register_commands(struct command_context *cmd_ctx) int gdb_register_commands(struct command_context *cmd_ctx)
{ {
gdb_port = strdup("3333"); gdb_port = strdup("3333");

View File

@ -41,3 +41,75 @@ proc _telnet_autocomplete_helper pattern {
return [lsort $cmds] return [lsort $cmds]
} }
lappend _telnet_autocomplete_skip "gdb_sync"
proc "gdb_sync" {} {
echo "DEPRECATED! use 'gdb sync', not 'gdb_sync'"
eval gdb sync
}
lappend _telnet_autocomplete_skip "gdb_port"
proc "gdb_port" {args} {
echo "DEPRECATED! use 'gdb port', not 'gdb_port'"
eval gdb port $args
}
lappend _telnet_autocomplete_skip "gdb_memory_map"
proc "gdb_memory_map" {state} {
echo "DEPRECATED! use 'gdb memory_map', not 'gdb_memory_map'"
eval gdb memory_map $state
}
lappend _telnet_autocomplete_skip "gdb_flash_program"
proc "gdb_flash_program" {state} {
echo "DEPRECATED! use 'gdb flash_program', not 'gdb_flash_program'"
eval gdb flash_program $state
}
lappend _telnet_autocomplete_skip "gdb_report_data_abort"
proc "gdb_report_data_abort" {state} {
echo "DEPRECATED! use 'gdb report_data_abort', not 'gdb_report_data_abort'"
eval gdb report_data_abort $state
}
lappend _telnet_autocomplete_skip "gdb_report_register_access_error"
proc "gdb_report_register_access_error" {state} {
echo "DEPRECATED! use 'gdb report_register_access_error', not 'gdb_report_register_access_error'"
eval gdb report_register_access_error $state
}
lappend _telnet_autocomplete_skip "gdb_breakpoint_override"
proc "gdb_breakpoint_override" {override} {
echo "DEPRECATED! use 'gdb breakpoint_override', not 'gdb_breakpoint_override'"
eval gdb breakpoint_override $override
}
lappend _telnet_autocomplete_skip "gdb_target_description"
proc "gdb_target_description" {state} {
echo "DEPRECATED! use 'gdb target_description', not 'gdb_target_description'"
eval gdb target_description $state
}
lappend _telnet_autocomplete_skip "gdb_save_tdesc"
proc "gdb_save_tdesc" {} {
echo "DEPRECATED! use 'gdb save_tdesc', not 'gdb_save_tdesc'"
eval gdb save_tdesc
}
lappend _telnet_autocomplete_skip "tcl_port"
proc "tcl_port" {args} {
echo "DEPRECATED! use 'tcl port' not 'tcl_port'"
eval tcl port $args
}
lappend _telnet_autocomplete_skip "tcl_notifications"
proc "tcl_notifications" {state} {
echo "DEPRECATED! use 'tcl notifications' not 'tcl_notifications'"
eval tcl notifications $state
}
lappend _telnet_autocomplete_skip "tcl_trace"
proc "tcl_trace" {state} {
echo "DEPRECATED! use 'tcl trace' not 'tcl_trace'"
eval tcl trace $state
}

View File

@ -323,25 +323,25 @@ COMMAND_HANDLER(handle_tcl_trace_command)
} }
} }
static const struct command_registration tcl_command_handlers[] = { static const struct command_registration tcl_subcommand_handlers[] = {
{ {
.name = "tcl_port", .name = "port",
.handler = handle_tcl_port_command, .handler = handle_tcl_port_command,
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "Specify port on which to listen " .help = "Specify port on which to listen "
"for incoming Tcl syntax. " "for incoming Tcl syntax. "
"Read help on 'gdb_port'.", "Read help on 'gdb port'.",
.usage = "[port_num]", .usage = "[port_num]",
}, },
{ {
.name = "tcl_notifications", .name = "notifications",
.handler = handle_tcl_notifications_command, .handler = handle_tcl_notifications_command,
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.help = "Target Notification output", .help = "Target Notification output",
.usage = "[on|off]", .usage = "[on|off]",
}, },
{ {
.name = "tcl_trace", .name = "trace",
.handler = handle_tcl_trace_command, .handler = handle_tcl_trace_command,
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.help = "Target trace output", .help = "Target trace output",
@ -350,6 +350,17 @@ static const struct command_registration tcl_command_handlers[] = {
COMMAND_REGISTRATION_DONE COMMAND_REGISTRATION_DONE
}; };
static const struct command_registration tcl_command_handlers[] = {
{
.name = "tcl",
.mode = COMMAND_ANY,
.help = "tcl command group",
.usage = "",
.chain = tcl_subcommand_handlers,
},
COMMAND_REGISTRATION_DONE
};
int tcl_register_commands(struct command_context *cmd_ctx) int tcl_register_commands(struct command_context *cmd_ctx)
{ {
tcl_port = strdup("6666"); tcl_port = strdup("6666");

View File

@ -982,7 +982,7 @@ static const struct command_registration telnet_command_handlers[] = {
{ {
.name = "exit", .name = "exit",
.handler = handle_exit_command, .handler = handle_exit_command,
.mode = COMMAND_EXEC, .mode = COMMAND_ANY,
.usage = "", .usage = "",
.help = "exit telnet session", .help = "exit telnet session",
}, },
@ -992,7 +992,7 @@ static const struct command_registration telnet_command_handlers[] = {
.mode = COMMAND_CONFIG, .mode = COMMAND_CONFIG,
.help = "Specify port on which to listen " .help = "Specify port on which to listen "
"for incoming telnet connections. " "for incoming telnet connections. "
"Read help on 'gdb_port'.", "Read help on 'gdb port'.",
.usage = "[port_num]", .usage = "[port_num]",
}, },
COMMAND_REGISTRATION_DONE COMMAND_REGISTRATION_DONE

View File

@ -58,11 +58,12 @@ enum arm_arch {
ARM_ARCH_V8M, ARM_ARCH_V8M,
}; };
/** Known ARM implementor IDs */ /** Known ARM implementer IDs */
enum arm_implementor { enum arm_implementer {
ARM_IMPLEMENTOR_ARM = 0x41, ARM_IMPLEMENTER_ARM = 0x41,
ARM_IMPLEMENTOR_INFINEON = 0x49, ARM_IMPLEMENTER_INFINEON = 0x49,
ARM_IMPLEMENTOR_REALTEK = 0x72, ARM_IMPLEMENTER_ARM_CHINA = 0x63,
ARM_IMPLEMENTER_REALTEK = 0x72,
}; };
/** /**

View File

@ -31,10 +31,10 @@ static int avr_assert_reset(struct target *target);
static int avr_deassert_reset(struct target *target); static int avr_deassert_reset(struct target *target);
/* IR and DR functions */ /* IR and DR functions */
static int mcu_write_ir(struct jtag_tap *tap, uint8_t *ir_in, uint8_t *ir_out, int ir_len, int rti); static int mcu_write_ir(struct jtag_tap *tap, uint8_t *ir_in, uint8_t *ir_out, int ir_len);
static int mcu_write_dr(struct jtag_tap *tap, uint8_t *dr_in, uint8_t *dr_out, int dr_len, int rti); static int mcu_write_dr(struct jtag_tap *tap, uint8_t *dr_in, uint8_t *dr_out, int dr_len);
static int mcu_write_ir_u8(struct jtag_tap *tap, uint8_t *ir_in, uint8_t ir_out, int ir_len, int rti); static int mcu_write_ir_u8(struct jtag_tap *tap, uint8_t *ir_in, uint8_t ir_out, int ir_len);
static int mcu_write_dr_u32(struct jtag_tap *tap, uint32_t *ir_in, uint32_t ir_out, int dr_len, int rti); static int mcu_write_dr_u32(struct jtag_tap *tap, uint32_t *ir_in, uint32_t ir_out, int dr_len);
struct target_type avr_target = { struct target_type avr_target = {
.name = "avr", .name = "avr",
@ -137,23 +137,23 @@ static int avr_deassert_reset(struct target *target)
int avr_jtag_senddat(struct jtag_tap *tap, uint32_t *dr_in, uint32_t dr_out, int avr_jtag_senddat(struct jtag_tap *tap, uint32_t *dr_in, uint32_t dr_out,
int len) int len)
{ {
return mcu_write_dr_u32(tap, dr_in, dr_out, len, 1); return mcu_write_dr_u32(tap, dr_in, dr_out, len);
} }
int avr_jtag_sendinstr(struct jtag_tap *tap, uint8_t *ir_in, uint8_t ir_out) int avr_jtag_sendinstr(struct jtag_tap *tap, uint8_t *ir_in, uint8_t ir_out)
{ {
return mcu_write_ir_u8(tap, ir_in, ir_out, AVR_JTAG_INS_LEN, 1); return mcu_write_ir_u8(tap, ir_in, ir_out, AVR_JTAG_INS_LEN);
} }
/* IR and DR functions */ /* IR and DR functions */
static int mcu_write_ir(struct jtag_tap *tap, uint8_t *ir_in, uint8_t *ir_out, static int mcu_write_ir(struct jtag_tap *tap, uint8_t *ir_in, uint8_t *ir_out,
int ir_len, int rti) int ir_len)
{ {
if (!tap) { if (!tap) {
LOG_ERROR("invalid tap"); LOG_ERROR("invalid tap");
return ERROR_FAIL; return ERROR_FAIL;
} }
if (ir_len != tap->ir_length) { if ((unsigned int)ir_len != tap->ir_length) {
LOG_ERROR("invalid ir_len"); LOG_ERROR("invalid ir_len");
return ERROR_FAIL; return ERROR_FAIL;
} }
@ -166,7 +166,7 @@ static int mcu_write_ir(struct jtag_tap *tap, uint8_t *ir_in, uint8_t *ir_out,
} }
static int mcu_write_dr(struct jtag_tap *tap, uint8_t *dr_in, uint8_t *dr_out, static int mcu_write_dr(struct jtag_tap *tap, uint8_t *dr_in, uint8_t *dr_out,
int dr_len, int rti) int dr_len)
{ {
if (!tap) { if (!tap) {
LOG_ERROR("invalid tap"); LOG_ERROR("invalid tap");
@ -181,27 +181,27 @@ static int mcu_write_dr(struct jtag_tap *tap, uint8_t *dr_in, uint8_t *dr_out,
} }
static int mcu_write_ir_u8(struct jtag_tap *tap, uint8_t *ir_in, static int mcu_write_ir_u8(struct jtag_tap *tap, uint8_t *ir_in,
uint8_t ir_out, int ir_len, int rti) uint8_t ir_out, int ir_len)
{ {
if (ir_len > 8) { if (ir_len > 8) {
LOG_ERROR("ir_len overflow, maximum is 8"); LOG_ERROR("ir_len overflow, maximum is 8");
return ERROR_FAIL; return ERROR_FAIL;
} }
mcu_write_ir(tap, ir_in, &ir_out, ir_len, rti); mcu_write_ir(tap, ir_in, &ir_out, ir_len);
return ERROR_OK; return ERROR_OK;
} }
static int mcu_write_dr_u32(struct jtag_tap *tap, uint32_t *dr_in, static int mcu_write_dr_u32(struct jtag_tap *tap, uint32_t *dr_in,
uint32_t dr_out, int dr_len, int rti) uint32_t dr_out, int dr_len)
{ {
if (dr_len > 32) { if (dr_len > 32) {
LOG_ERROR("dr_len overflow, maximum is 32"); LOG_ERROR("dr_len overflow, maximum is 32");
return ERROR_FAIL; return ERROR_FAIL;
} }
mcu_write_dr(tap, (uint8_t *)dr_in, (uint8_t *)&dr_out, dr_len, rti); mcu_write_dr(tap, (uint8_t *)dr_in, (uint8_t *)&dr_out, dr_len);
return ERROR_OK; return ERROR_OK;
} }

View File

@ -99,6 +99,12 @@ static const struct cortex_m_part_info cortex_m_parts[] = {
.arch = ARM_ARCH_V8M, .arch = ARM_ARCH_V8M,
.flags = CORTEX_M_F_HAS_FPV5, .flags = CORTEX_M_F_HAS_FPV5,
}, },
{
.impl_part = CORTEX_M52_PARTNO,
.name = "Cortex-M52",
.arch = ARM_ARCH_V8M,
.flags = CORTEX_M_F_HAS_FPV5,
},
{ {
.impl_part = CORTEX_M55_PARTNO, .impl_part = CORTEX_M55_PARTNO,
.name = "Cortex-M55", .name = "Cortex-M55",
@ -273,7 +279,8 @@ static int cortex_m_fast_read_all_regs(struct target *target)
/* because the DCB_DCRDR is used for the emulated dcc channel /* because the DCB_DCRDR is used for the emulated dcc channel
* we have to save/restore the DCB_DCRDR when used */ * we have to save/restore the DCB_DCRDR when used */
if (target->dbg_msg_enabled) { bool dbg_msg_enabled = target->dbg_msg_enabled;
if (dbg_msg_enabled) {
retval = mem_ap_read_u32(armv7m->debug_ap, DCB_DCRDR, &dcrdr); retval = mem_ap_read_u32(armv7m->debug_ap, DCB_DCRDR, &dcrdr);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
@ -326,7 +333,7 @@ static int cortex_m_fast_read_all_regs(struct target *target)
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
if (target->dbg_msg_enabled) { if (dbg_msg_enabled) {
/* restore DCB_DCRDR - this needs to be in a separate /* restore DCB_DCRDR - this needs to be in a separate
* transaction otherwise the emulated DCC channel breaks */ * transaction otherwise the emulated DCC channel breaks */
retval = mem_ap_write_atomic_u32(armv7m->debug_ap, DCB_DCRDR, dcrdr); retval = mem_ap_write_atomic_u32(armv7m->debug_ap, DCB_DCRDR, dcrdr);
@ -797,6 +804,42 @@ static int cortex_m_examine_exception_reason(struct target *target)
return retval; return retval;
} }
/* Errata 3092511 workaround
* Cortex-M7 can halt in an incorrect address when breakpoint
* and exception occurs simultaneously */
static int cortex_m_erratum_check_breakpoint(struct target *target)
{
struct cortex_m_common *cortex_m = target_to_cm(target);
struct armv7m_common *armv7m = &cortex_m->armv7m;
struct arm *arm = &armv7m->arm;
uint32_t pc = buf_get_u32(arm->pc->value, 0, 32);
/* To reduce the workaround processing cost we assume FPB is in sync
* with OpenOCD breakpoints. If the target app writes to FPB
* OpenOCD will resume after the break set by app */
struct breakpoint *bkpt = breakpoint_find(target, pc);
if (bkpt) {
LOG_TARGET_DEBUG(target, "Erratum 3092511: breakpoint confirmed");
return ERROR_OK;
}
if (pc >= 0xe0000000u)
/* not executable area, do not read instruction @ pc */
return ERROR_OK;
uint16_t insn;
int retval = target_read_u16(target, pc, &insn);
if (retval != ERROR_OK)
return ERROR_OK; /* do not propagate the error, just avoid workaround */
if ((insn & 0xff00) == (ARMV5_T_BKPT(0) & 0xff00)) {
LOG_TARGET_DEBUG(target, "Erratum 3092511: breakpoint embedded in code confirmed");
return ERROR_OK;
}
LOG_TARGET_DEBUG(target, "Erratum 3092511: breakpoint not found, proceed with resume");
return ERROR_TARGET_HALTED_DO_RESUME;
}
static int cortex_m_debug_entry(struct target *target) static int cortex_m_debug_entry(struct target *target)
{ {
uint32_t xpsr; uint32_t xpsr;
@ -883,6 +926,17 @@ static int cortex_m_debug_entry(struct target *target)
secure_state ? "Secure" : "Non-Secure", secure_state ? "Secure" : "Non-Secure",
target_state_name(target)); target_state_name(target));
/* Errata 3092511 workaround
* Cortex-M7 can halt in an incorrect address when breakpoint
* and exception occurs simultaneously */
if (cortex_m->incorrect_halt_erratum
&& armv7m->exception_number
&& cortex_m->nvic_dfsr == (DFSR_BKPT | DFSR_HALTED)) {
retval = cortex_m_erratum_check_breakpoint(target);
if (retval != ERROR_OK)
return retval;
}
if (armv7m->post_debug_entry) { if (armv7m->post_debug_entry) {
retval = armv7m->post_debug_entry(target); retval = armv7m->post_debug_entry(target);
if (retval != ERROR_OK) if (retval != ERROR_OK)
@ -960,6 +1014,28 @@ static int cortex_m_poll_one(struct target *target)
if ((prev_target_state == TARGET_RUNNING) || (prev_target_state == TARGET_RESET)) { if ((prev_target_state == TARGET_RUNNING) || (prev_target_state == TARGET_RESET)) {
retval = cortex_m_debug_entry(target); retval = cortex_m_debug_entry(target);
/* Errata 3092511 workaround
* Cortex-M7 can halt in an incorrect address when breakpoint
* and exception occurs simultaneously */
if (retval == ERROR_TARGET_HALTED_DO_RESUME) {
struct arm *arm = &armv7m->arm;
LOG_TARGET_INFO(target, "Resuming after incorrect halt @ PC 0x%08" PRIx32
", ARM Cortex-M7 erratum 3092511",
buf_get_u32(arm->pc->value, 0, 32));
/* We don't need to restore registers, just restart the core */
cortex_m_set_maskints_for_run(target);
retval = cortex_m_write_debug_halt_mask(target, 0, C_HALT);
if (retval != ERROR_OK)
return retval;
target->debug_reason = DBG_REASON_NOTHALTED;
/* registers are now invalid */
register_cache_invalidate(armv7m->arm.core_cache);
target->state = TARGET_RUNNING;
return ERROR_OK;
}
/* arm_semihosting needs to know registers, don't run if debug entry returned error */ /* arm_semihosting needs to know registers, don't run if debug entry returned error */
if (retval == ERROR_OK && arm_semihosting(target, &retval) != 0) if (retval == ERROR_OK && arm_semihosting(target, &retval) != 0)
return retval; return retval;
@ -1582,7 +1658,7 @@ static int cortex_m_step(struct target *target, int current,
cortex_m->dcb_dhcsr, cortex_m->nvic_icsr); cortex_m->dcb_dhcsr, cortex_m->nvic_icsr);
retval = cortex_m_debug_entry(target); retval = cortex_m_debug_entry(target);
if (retval != ERROR_OK) if (retval != ERROR_OK && retval != ERROR_TARGET_HALTED_DO_RESUME)
return retval; return retval;
target_call_event_callbacks(target, TARGET_EVENT_HALTED); target_call_event_callbacks(target, TARGET_EVENT_HALTED);
@ -2537,8 +2613,8 @@ int cortex_m_examine(struct target *target)
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
/* Inspect implementor/part to look for recognized cores */ /* Inspect implementer/part to look for recognized cores */
unsigned int impl_part = cpuid & (ARM_CPUID_IMPLEMENTOR_MASK | ARM_CPUID_PARTNO_MASK); unsigned int impl_part = cpuid & (ARM_CPUID_IMPLEMENTER_MASK | ARM_CPUID_PARTNO_MASK);
for (unsigned int n = 0; n < ARRAY_SIZE(cortex_m_parts); n++) { for (unsigned int n = 0; n < ARRAY_SIZE(cortex_m_parts); n++) {
if (impl_part == cortex_m_parts[n].impl_part) { if (impl_part == cortex_m_parts[n].impl_part) {
@ -2560,14 +2636,22 @@ int cortex_m_examine(struct target *target)
(uint8_t)((cpuid >> 0) & 0xf)); (uint8_t)((cpuid >> 0) & 0xf));
cortex_m->maskints_erratum = false; cortex_m->maskints_erratum = false;
cortex_m->incorrect_halt_erratum = false;
if (impl_part == CORTEX_M7_PARTNO) { if (impl_part == CORTEX_M7_PARTNO) {
uint8_t rev, patch; uint8_t rev, patch;
rev = (cpuid >> 20) & 0xf; rev = (cpuid >> 20) & 0xf;
patch = (cpuid >> 0) & 0xf; patch = (cpuid >> 0) & 0xf;
if ((rev == 0) && (patch < 2)) { if ((rev == 0) && (patch < 2)) {
LOG_TARGET_WARNING(target, "Silicon bug: single stepping may enter pending exception handler!"); LOG_TARGET_WARNING(target, "Erratum 702596: single stepping may enter pending exception handler!");
cortex_m->maskints_erratum = true; cortex_m->maskints_erratum = true;
} }
/* TODO: add revision check when a Cortex-M7 revision with fixed 3092511 is out */
LOG_TARGET_WARNING(target, "Erratum 3092511: Cortex-M7 can halt in an incorrect address when breakpoint and exception occurs simultaneously");
cortex_m->incorrect_halt_erratum = true;
if (armv7m->is_hla_target)
LOG_WARNING("No erratum 3092511 workaround on hla adapter");
else
LOG_INFO("The erratum 3092511 workaround will resume after an incorrect halt");
} }
LOG_TARGET_DEBUG(target, "cpuid: 0x%8.8" PRIx32 "", cpuid); LOG_TARGET_DEBUG(target, "cpuid: 0x%8.8" PRIx32 "", cpuid);

View File

@ -31,35 +31,36 @@
#define CPUID 0xE000ED00 #define CPUID 0xE000ED00
#define ARM_CPUID_IMPLEMENTOR_POS 24 #define ARM_CPUID_IMPLEMENTER_POS 24
#define ARM_CPUID_IMPLEMENTOR_MASK (0xFF << ARM_CPUID_IMPLEMENTOR_POS) #define ARM_CPUID_IMPLEMENTER_MASK (0xFF << ARM_CPUID_IMPLEMENTER_POS)
#define ARM_CPUID_PARTNO_POS 4 #define ARM_CPUID_PARTNO_POS 4
#define ARM_CPUID_PARTNO_MASK (0xFFF << ARM_CPUID_PARTNO_POS) #define ARM_CPUID_PARTNO_MASK (0xFFF << ARM_CPUID_PARTNO_POS)
#define ARM_MAKE_CPUID(impl, partno) ((((impl) << ARM_CPUID_IMPLEMENTOR_POS) & ARM_CPUID_IMPLEMENTOR_MASK) | \ #define ARM_MAKE_CPUID(impl, partno) ((((impl) << ARM_CPUID_IMPLEMENTER_POS) & ARM_CPUID_IMPLEMENTER_MASK) | \
(((partno) << ARM_CPUID_PARTNO_POS) & ARM_CPUID_PARTNO_MASK)) (((partno) << ARM_CPUID_PARTNO_POS) & ARM_CPUID_PARTNO_MASK))
/** Known Arm Cortex masked CPU Ids /** Known Arm Cortex masked CPU Ids
* This includes the implementor and part number, but _not_ the revision or * This includes the implementer and part number, but _not_ the revision or
* patch fields. * patch fields.
*/ */
enum cortex_m_impl_part { enum cortex_m_impl_part {
CORTEX_M_PARTNO_INVALID, CORTEX_M_PARTNO_INVALID,
STAR_MC1_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0x132), /* FIXME - confirm implementor! */ STAR_MC1_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM_CHINA, 0x132),
CORTEX_M0_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xC20), CORTEX_M0_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xC20),
CORTEX_M1_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xC21), CORTEX_M1_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xC21),
CORTEX_M3_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xC23), CORTEX_M3_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xC23),
CORTEX_M4_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xC24), CORTEX_M4_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xC24),
CORTEX_M7_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xC27), CORTEX_M7_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xC27),
CORTEX_M0P_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xC60), CORTEX_M0P_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xC60),
CORTEX_M23_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xD20), CORTEX_M23_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xD20),
CORTEX_M33_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xD21), CORTEX_M33_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xD21),
CORTEX_M35P_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xD31), CORTEX_M35P_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xD31),
CORTEX_M55_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xD22), CORTEX_M52_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM_CHINA, 0xD24),
CORTEX_M85_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_ARM, 0xD23), CORTEX_M55_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xD22),
INFINEON_SLX2_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_INFINEON, 0xDB0), CORTEX_M85_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_ARM, 0xD23),
REALTEK_M200_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_REALTEK, 0xd20), INFINEON_SLX2_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_INFINEON, 0xDB0),
REALTEK_M300_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTOR_REALTEK, 0xd22), REALTEK_M200_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_REALTEK, 0xd20),
REALTEK_M300_PARTNO = ARM_MAKE_CPUID(ARM_IMPLEMENTER_REALTEK, 0xd22),
}; };
/* Relevant Cortex-M flags, used in struct cortex_m_part_info.flags */ /* Relevant Cortex-M flags, used in struct cortex_m_part_info.flags */
@ -256,6 +257,10 @@ struct cortex_m_common {
/* Whether this target has the erratum that makes C_MASKINTS not apply to /* Whether this target has the erratum that makes C_MASKINTS not apply to
* already pending interrupts */ * already pending interrupts */
bool maskints_erratum; bool maskints_erratum;
/* Errata 3092511 Cortex-M7 can halt in an incorrect address when breakpoint
* and exception occurs simultaneously */
bool incorrect_halt_erratum;
}; };
static inline bool is_cortex_m_or_hla(const struct cortex_m_common *cortex_m) static inline bool is_cortex_m_or_hla(const struct cortex_m_common *cortex_m)

View File

@ -483,7 +483,7 @@ static int esirisc_add_breakpoint(struct target *target, struct breakpoint *brea
* The default linker scripts provided by the eSi-RISC toolchain do * The default linker scripts provided by the eSi-RISC toolchain do
* not specify attributes on memory regions, which results in * not specify attributes on memory regions, which results in
* incorrect application of software breakpoints by GDB. Targets * incorrect application of software breakpoints by GDB. Targets
* must be configured with `gdb_breakpoint_override hard` as * must be configured with `gdb breakpoint_override hard` as
* software breakpoints are not supported. * software breakpoints are not supported.
*/ */
if (breakpoint->type != BKPT_HARD) if (breakpoint->type != BKPT_HARD)

View File

@ -58,11 +58,12 @@ static int esirisc_jtag_get_padding(void)
return padding; return padding;
} }
static int esirisc_jtag_count_bits(int num_fields, struct scan_field *fields) static int esirisc_jtag_count_bits(unsigned int num_fields,
struct scan_field *fields)
{ {
int bit_count = 0; int bit_count = 0;
for (int i = 0; i < num_fields; ++i) for (unsigned int i = 0; i < num_fields; ++i)
bit_count += fields[i].num_bits; bit_count += fields[i].num_bits;
return bit_count; return bit_count;

View File

@ -224,10 +224,10 @@ static int irscan(struct target *t, uint8_t *out,
if (ir_len != t->tap->ir_length) { if (ir_len != t->tap->ir_length) {
retval = ERROR_FAIL; retval = ERROR_FAIL;
if (t->tap->enabled) if (t->tap->enabled)
LOG_ERROR("%s tap enabled but tap irlen=%d", LOG_ERROR("%s tap enabled but tap irlen=%u",
__func__, t->tap->ir_length); __func__, t->tap->ir_length);
else else
LOG_ERROR("%s tap not enabled and irlen=%d", LOG_ERROR("%s tap not enabled and irlen=%u",
__func__, t->tap->ir_length); __func__, t->tap->ir_length);
return retval; return retval;
} }

View File

@ -376,7 +376,7 @@ static void dump_field(const struct scan_field *field)
log_printf_lf(LOG_LVL_DEBUG, log_printf_lf(LOG_LVL_DEBUG,
__FILE__, __LINE__, "scan", __FILE__, __LINE__, "scan",
"%db %s %c%c:%08x @%02x -> %s %c%c:%08x @%02x", "%ub %s %c%c:%08x @%02x -> %s %c%c:%08x @%02x",
field->num_bits, field->num_bits,
op_string[out_op], out_interrupt, out_haltnot, out_data, op_string[out_op], out_interrupt, out_haltnot, out_data,
out_address, out_address,

View File

@ -112,7 +112,7 @@ typedef enum {
typedef struct { typedef struct {
struct list_head list; struct list_head list;
int abs_chain_position; unsigned int abs_chain_position;
/* The base address to access this DM on DMI */ /* The base address to access this DM on DMI */
uint32_t base; uint32_t base;
/* The number of harts connected to this DM. */ /* The number of harts connected to this DM. */
@ -220,7 +220,7 @@ static dm013_info_t *get_dm(struct target *target)
if (info->dm) if (info->dm)
return info->dm; return info->dm;
int abs_chain_position = target->tap->abs_chain_position; unsigned int abs_chain_position = target->tap->abs_chain_position;
dm013_info_t *entry; dm013_info_t *entry;
dm013_info_t *dm = NULL; dm013_info_t *dm = NULL;

View File

@ -3125,11 +3125,18 @@ COMMAND_HANDLER(handle_reg_command)
/* set register value */ /* set register value */
if (CMD_ARGC == 2) { if (CMD_ARGC == 2) {
uint8_t *buf = malloc(DIV_ROUND_UP(reg->size, 8)); uint8_t *buf = malloc(DIV_ROUND_UP(reg->size, 8));
if (!buf) if (!buf) {
LOG_ERROR("Failed to allocate memory");
return ERROR_FAIL; return ERROR_FAIL;
str_to_buf(CMD_ARGV[1], strlen(CMD_ARGV[1]), buf, reg->size, 0); }
int retval = reg->type->set(reg, buf); int retval = CALL_COMMAND_HANDLER(command_parse_str_to_buf, CMD_ARGV[1], buf, reg->size, 0);
if (retval != ERROR_OK) {
free(buf);
return retval;
}
retval = reg->type->set(reg, buf);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
LOG_ERROR("Could not write to register '%s'", reg->name); LOG_ERROR("Could not write to register '%s'", reg->name);
} else { } else {
@ -3898,7 +3905,7 @@ static int handle_bp_command_list(struct command_invocation *cmd)
while (breakpoint) { while (breakpoint) {
if (breakpoint->type == BKPT_SOFT) { if (breakpoint->type == BKPT_SOFT) {
char *buf = buf_to_hex_str(breakpoint->orig_instr, char *buf = buf_to_hex_str(breakpoint->orig_instr,
breakpoint->length); breakpoint->length * 8);
command_print(cmd, "Software breakpoint(IVA): addr=" TARGET_ADDR_FMT ", len=0x%x, orig_instr=0x%s", command_print(cmd, "Software breakpoint(IVA): addr=" TARGET_ADDR_FMT ", len=0x%x, orig_instr=0x%s",
breakpoint->address, breakpoint->address,
breakpoint->length, breakpoint->length,
@ -4772,63 +4779,64 @@ static int target_jim_get_reg(Jim_Interp *interp, int argc,
return JIM_OK; return JIM_OK;
} }
static int target_jim_set_reg(Jim_Interp *interp, int argc, COMMAND_HANDLER(handle_set_reg_command)
Jim_Obj * const *argv)
{ {
if (argc != 2) { if (CMD_ARGC != 1)
Jim_WrongNumArgs(interp, 1, argv, "dict"); return ERROR_COMMAND_SYNTAX_ERROR;
return JIM_ERR;
}
int tmp; int tmp;
#if JIM_VERSION >= 80 #if JIM_VERSION >= 80
Jim_Obj **dict = Jim_DictPairs(interp, argv[1], &tmp); Jim_Obj **dict = Jim_DictPairs(CMD_CTX->interp, CMD_JIMTCL_ARGV[0], &tmp);
if (!dict) if (!dict)
return JIM_ERR; return ERROR_FAIL;
#else #else
Jim_Obj **dict; Jim_Obj **dict;
int ret = Jim_DictPairs(interp, argv[1], &dict, &tmp); int ret = Jim_DictPairs(CMD_CTX->interp, CMD_JIMTCL_ARGV[0], &dict, &tmp);
if (ret != JIM_OK) if (ret != JIM_OK)
return ret; return ERROR_FAIL;
#endif #endif
const unsigned int length = tmp; const unsigned int length = tmp;
struct command_context *cmd_ctx = current_command_context(interp);
assert(cmd_ctx); const struct target *target = get_current_target(CMD_CTX);
const struct target *target = get_current_target(cmd_ctx); assert(target);
for (unsigned int i = 0; i < length; i += 2) { for (unsigned int i = 0; i < length; i += 2) {
const char *reg_name = Jim_String(dict[i]); const char *reg_name = Jim_String(dict[i]);
const char *reg_value = Jim_String(dict[i + 1]); const char *reg_value = Jim_String(dict[i + 1]);
struct reg *reg = register_get_by_name(target->reg_cache, reg_name, struct reg *reg = register_get_by_name(target->reg_cache, reg_name, false);
false);
if (!reg || !reg->exist) { if (!reg || !reg->exist) {
Jim_SetResultFormatted(interp, "unknown register '%s'", reg_name); command_print(CMD, "unknown register '%s'", reg_name);
return JIM_ERR; return ERROR_FAIL;
} }
uint8_t *buf = malloc(DIV_ROUND_UP(reg->size, 8)); uint8_t *buf = malloc(DIV_ROUND_UP(reg->size, 8));
if (!buf) { if (!buf) {
LOG_ERROR("Failed to allocate memory"); LOG_ERROR("Failed to allocate memory");
return JIM_ERR; return ERROR_FAIL;
} }
str_to_buf(reg_value, strlen(reg_value), buf, reg->size, 0); int retval = CALL_COMMAND_HANDLER(command_parse_str_to_buf,
int retval = reg->type->set(reg, buf); reg_value, buf, reg->size, 0);
if (retval != ERROR_OK) {
free(buf);
return retval;
}
retval = reg->type->set(reg, buf);
free(buf); free(buf);
if (retval != ERROR_OK) { if (retval != ERROR_OK) {
Jim_SetResultFormatted(interp, "failed to set '%s' to register '%s'", command_print(CMD, "failed to set '%s' to register '%s'",
reg_value, reg_name); reg_value, reg_name);
return JIM_ERR; return retval;
} }
} }
return JIM_OK; return ERROR_OK;
} }
/** /**
@ -5568,7 +5576,7 @@ static const struct command_registration target_instance_command_handlers[] = {
{ {
.name = "set_reg", .name = "set_reg",
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.jim_handler = target_jim_set_reg, .handler = handle_set_reg_command,
.help = "Set target register values", .help = "Set target register values",
.usage = "dict", .usage = "dict",
}, },
@ -5789,7 +5797,7 @@ static int target_create(struct jim_getopt_info *goi)
} }
target->dbgmsg = NULL; target->dbgmsg = NULL;
target->dbg_msg_enabled = 0; target->dbg_msg_enabled = false;
target->endianness = TARGET_ENDIAN_UNKNOWN; target->endianness = TARGET_ENDIAN_UNKNOWN;
@ -6703,7 +6711,7 @@ static const struct command_registration target_exec_command_handlers[] = {
{ {
.name = "set_reg", .name = "set_reg",
.mode = COMMAND_EXEC, .mode = COMMAND_EXEC,
.jim_handler = target_jim_set_reg, .handler = handle_set_reg_command,
.help = "Set target register values", .help = "Set target register values",
.usage = "dict", .usage = "dict",
}, },

View File

@ -163,7 +163,7 @@ struct target {
struct watchpoint *watchpoints; /* list of watchpoints */ struct watchpoint *watchpoints; /* list of watchpoints */
struct trace *trace_info; /* generic trace information */ struct trace *trace_info; /* generic trace information */
struct debug_msg_receiver *dbgmsg; /* list of debug message receivers */ struct debug_msg_receiver *dbgmsg; /* list of debug message receivers */
uint32_t dbg_msg_enabled; /* debug message status */ bool dbg_msg_enabled; /* debug message status */
void *arch_info; /* architecture specific information */ void *arch_info; /* architecture specific information */
void *private_config; /* pointer to target specific config data (for jim_configure hook) */ void *private_config; /* pointer to target specific config data (for jim_configure hook) */
struct target *next; /* next target in list */ struct target *next; /* next target in list */
@ -805,6 +805,7 @@ int target_profiling_default(struct target *target, uint32_t *samples, uint32_t
#define ERROR_TARGET_ALGO_EXIT (-313) #define ERROR_TARGET_ALGO_EXIT (-313)
#define ERROR_TARGET_SIZE_NOT_SUPPORTED (-314) #define ERROR_TARGET_SIZE_NOT_SUPPORTED (-314)
#define ERROR_TARGET_PACKING_NOT_SUPPORTED (-315) #define ERROR_TARGET_PACKING_NOT_SUPPORTED (-315)
#define ERROR_TARGET_HALTED_DO_RESUME (-316) /* used to workaround incorrect debug halt */
extern bool get_target_reset_nag(void); extern bool get_target_reset_nag(void);

View File

@ -164,7 +164,7 @@ static int add_debug_msg_receiver(struct command_context *cmd_ctx, struct target
(*p)->next = NULL; (*p)->next = NULL;
/* enable callback */ /* enable callback */
target->dbg_msg_enabled = 1; target->dbg_msg_enabled = true;
return ERROR_OK; return ERROR_OK;
} }
@ -225,7 +225,7 @@ int delete_debug_msg_receiver(struct command_context *cmd_ctx, struct target *ta
free(c); free(c);
if (!*p) { if (!*p) {
/* disable callback */ /* disable callback */
target->dbg_msg_enabled = 0; target->dbg_msg_enabled = false;
} }
return ERROR_OK; return ERROR_OK;
} else } else

View File

@ -3966,10 +3966,10 @@ COMMAND_HELPER(xtensa_cmd_xtreg_do, struct xtensa *xtensa)
rptr->type = XT_REG_OTHER; rptr->type = XT_REG_OTHER;
} }
/* Register flags */ /* Register flags: includes intsetN, intclearN for LX8 */
if ((strcmp(rptr->name, "mmid") == 0) || (strcmp(rptr->name, "eraccess") == 0) || if ((strcmp(rptr->name, "mmid") == 0) || (strcmp(rptr->name, "eraccess") == 0) ||
(strcmp(rptr->name, "ddr") == 0) || (strcmp(rptr->name, "intset") == 0) || (strcmp(rptr->name, "ddr") == 0) || (strncmp(rptr->name, "intset", 6) == 0) ||
(strcmp(rptr->name, "intclear") == 0)) (strncmp(rptr->name, "intclear", 8) == 0) || (strcmp(rptr->name, "mesrclr") == 0))
rptr->flags = XT_REGF_NOREAD; rptr->flags = XT_REGF_NOREAD;
else else
rptr->flags = 0; rptr->flags = 0;

View File

@ -103,7 +103,7 @@ static int xtensa_chip_target_create(struct target *target, Jim_Interp *interp)
LOG_DEBUG("DAP: ap_num %" PRId64 " DAP %p\n", pc->ap_num, pc->dap); LOG_DEBUG("DAP: ap_num %" PRId64 " DAP %p\n", pc->ap_num, pc->dap);
} else { } else {
xtensa_chip_dm_cfg.tap = target->tap; xtensa_chip_dm_cfg.tap = target->tap;
LOG_DEBUG("JTAG: %s:%s pos %d", target->tap->chip, target->tap->tapname, LOG_DEBUG("JTAG: %s:%s pos %u", target->tap->chip, target->tap->tapname,
target->tap->abs_chain_position); target->tap->abs_chain_position);
} }

View File

@ -278,7 +278,6 @@ COMMAND_HANDLER(handle_transport_select)
if (session) { if (session) {
if (!strcmp(session->name, CMD_ARGV[0])) { if (!strcmp(session->name, CMD_ARGV[0])) {
LOG_WARNING("Transport \"%s\" was already selected", session->name); LOG_WARNING("Transport \"%s\" was already selected", session->name);
command_print(CMD, "%s", session->name);
return ERROR_OK; return ERROR_OK;
} }
command_print(CMD, "Can't change session's transport after the initial selection was made"); command_print(CMD, "Can't change session's transport after the initial selection was made");
@ -301,7 +300,6 @@ COMMAND_HANDLER(handle_transport_select)
int retval = transport_select(CMD_CTX, CMD_ARGV[0]); int retval = transport_select(CMD_CTX, CMD_ARGV[0]);
if (retval != ERROR_OK) if (retval != ERROR_OK)
return retval; return retval;
command_print(CMD, "%s", session->name);
return ERROR_OK; return ERROR_OK;
} }
} }

View File

@ -50,7 +50,7 @@ reset init
# setup to debug u-boot in flash # setup to debug u-boot in flash
proc uboot_debug {} { proc uboot_debug {} {
gdb_breakpoint_override hard gdb breakpoint_override hard
xscale vector_catch 0xFF xscale vector_catch 0xFF
xscale vector_table low 1 0xe59ff018 xscale vector_table low 1 0xe59ff018

View File

@ -43,7 +43,7 @@ proc read_register {register} {
proc at91sam9g20_reset_start { } { proc at91sam9g20_reset_start { } {
# Make sure that the the jtag is running slow, since there are a number of different ways the board # Make sure that the jtag is running slow, since there are a number of different ways the board
# can be configured coming into this state that can cause communication problems with the jtag # can be configured coming into this state that can cause communication problems with the jtag
# adapter. Also since this call can be made following a "reset init" where fast memory accesses # adapter. Also since this call can be made following a "reset init" where fast memory accesses
# are enabled, need to temporarily shut this down so that the RSTC_MR register can be written at slower # are enabled, need to temporarily shut this down so that the RSTC_MR register can be written at slower
@ -202,7 +202,7 @@ proc at91sam9g20_reset_init { } {
mww 0xffffea00 0x3 mww 0xffffea00 0x3
mww 0x20000000 0 mww 0x20000000 0
# Signal normal mode using the SDRAMC_MR register and follow with a zero value write the the starting # Signal normal mode using the SDRAMC_MR register and follow with a zero value write the starting
# memory location for the SDRAM. # memory location for the SDRAM.
mww 0xffffea00 0x0 mww 0xffffea00 0x0

View File

@ -128,7 +128,7 @@ reset_config trst_and_srst
# GDB Setup # GDB Setup
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
gdb_breakpoint_override hard gdb breakpoint_override hard
#------------------------------------------------ #------------------------------------------------
# ARM SPECIFIC # ARM SPECIFIC

View File

@ -95,7 +95,7 @@ adapter srst delay 100
jtag_ntrst_delay 100 jtag_ntrst_delay 100
reset_config trst_and_srst reset_config trst_and_srst
gdb_breakpoint_override hard gdb breakpoint_override hard
targets targets
nand device $_CHIPNAME.flash s3c6400 $_CHIPNAME.cpu nand device $_CHIPNAME.flash s3c6400 $_CHIPNAME.cpu

View File

@ -27,7 +27,7 @@ $_TARGETNAME configure -event reset-init {
# 0x00003800 - 0x07 << FLASHCTL_WST2_S # 0x00003800 - 0x07 << FLASHCTL_WST2_S
# FLASHCTL_AC_8M 0x00060000 - Size of flash # FLASHCTL_AC_8M 0x00060000 - Size of flash
# FLASHCTL_E 0x00080000 - Flash bank enable (added) # FLASHCTL_E 0x00080000 - Flash bank enable (added)
# FLASHCTL_WP 0x04000000 - write protect. If used, CFI mode wont work!! # FLASHCTL_WP 0x04000000 - write protect. If used, CFI mode won't work!!
# FLASHCTL_MWx16 0x10000000 - 16bit mode. Do not use it!! # FLASHCTL_MWx16 0x10000000 - 16bit mode. Do not use it!!
# FLASHCTL_MWx8 0x00000000 - 8bit mode. # FLASHCTL_MWx8 0x00000000 - 8bit mode.
mww 0xb8400000 0x000d3ce1 mww 0xb8400000 0x000d3ce1

View File

@ -22,7 +22,7 @@ poll_period 1
adapter speed 3000 adapter speed 3000
# Enable the target description feature # Enable the target description feature
gdb_target_description enable gdb target_description enable
# Add a new register in the cpu register list. This register will be # Add a new register in the cpu register list. This register will be
# included in the generated target descriptor file. # included in the generated target descriptor file.

View File

@ -0,0 +1,22 @@
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com/
#
# Texas Instruments AM62A7
# Link: https://www.ti.com/product/AM62A7
#
# This configuration file is used as a self hosted debug configuration that
# works on every AM62A7 platform based on firewall configuration permitted
# in the system.
#
# In this system openOCD runs on one of the CPUs inside AM62A7 and provides
# network ports that can then be used to debug the microcontrollers on the
# SoC - either self hosted IDE OR remotely.
# We are using dmem, which uses dapdirect_swd transport
adapter driver dmem
if { ![info exists SOC] } {
set SOC am62a7
}
source [find target/ti_k3.cfg]

View File

@ -0,0 +1,22 @@
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com/
#
# Texas Instruments am62p
# Link: https://www.ti.com/product/AM62P
#
# This configuration file is used as a self hosted debug configuration that
# works on every AM62P platform based on firewall configuration permitted
# in the system.
#
# In this system openOCD runs on one of the CPUs inside AM62P and provides
# network ports that can then be used to debug the microcontrollers on the
# SoC - either self hosted IDE OR remotely.
# We are using dmem, which uses dapdirect_swd transport
adapter driver dmem
if { ![info exists SOC] } {
set SOC am62p
}
source [find target/ti_k3.cfg]

View File

@ -0,0 +1,23 @@
# SPDX-License-Identifier: GPL-2.0-or-later
# Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com/
#
# Texas Instruments J722S/AM67/TDA4VEN
# Link: https://www.ti.com/product/AM67
# Link: https://www.ti.com/product/TDA4VEN-Q1
#
# This configuration file is used as a self hosted debug configuration that
# works on every J722S platform based on firewall configuration permitted
# in the system.
#
# In this system openOCD runs on one of the CPUs inside J722S and provides
# network ports that can then be used to debug the microcontrollers on the
# SoC - either self hosted IDE OR remotely.
# We are using dmem, which uses dapdirect_swd transport
adapter driver dmem
if { ![info exists SOC] } {
set SOC j722s
}
source [find target/ti_k3.cfg]

View File

@ -5,9 +5,9 @@
# #
adapter driver hla adapter driver hla
hla_layout nulink hla layout nulink
hla_device_desc "Nu-Link" hla device_desc "Nu-Link"
hla_vid_pid 0x0416 0x511b 0x0416 0x511c 0x0416 0x511d 0x0416 0x5200 0x0416 0x5201 hla vid_pid 0x0416 0x511b 0x0416 0x511c 0x0416 0x511d 0x0416 0x5200 0x0416 0x5201
# Only swd is supported # Only swd is supported
transport select hla_swd transport select hla_swd

View File

@ -19,8 +19,7 @@ proc read_file { name } {
} }
set pcie_aspm [read_file /sys/module/pcie_aspm/parameters/policy] set pcie_aspm [read_file /sys/module/pcie_aspm/parameters/policy]
# escaping [ ] characters in string match pattern does not work in Jim-Tcl if {![string match {*\[performance\]*} $pcie_aspm]} {
if {![string match "*<performance>*" [string map { "\[" < "\]" > } $pcie_aspm]]} {
echo "Warn : Switch PCIe power saving off or the first couple of pulses gets clocked as fast as 20 MHz" echo "Warn : Switch PCIe power saving off or the first couple of pulses gets clocked as fast as 20 MHz"
echo "Warn : Issue 'echo performance | sudo tee /sys/module/pcie_aspm/parameters/policy'" echo "Warn : Issue 'echo performance | sudo tee /sys/module/pcie_aspm/parameters/policy'"
} }

View File

@ -6,9 +6,9 @@
# #
adapter driver hla adapter driver hla
hla_layout stlink hla layout stlink
hla_device_desc "ST-LINK" hla device_desc "ST-LINK"
hla_vid_pid 0x0483 0x3744 0x0483 0x3748 0x0483 0x374b 0x0483 0x374d 0x0483 0x374e 0x0483 0x374f 0x0483 0x3752 0x0483 0x3753 0x0483 0x3754 0x0483 0x3755 0x0483 0x3757 hla vid_pid 0x0483 0x3744 0x0483 0x3748 0x0483 0x374b 0x0483 0x374d 0x0483 0x374e 0x0483 0x374f 0x0483 0x3752 0x0483 0x3753 0x0483 0x3754 0x0483 0x3755 0x0483 0x3757
# Optionally specify the serial number of ST-LINK/V2 usb device. ST-LINK/V2 # Optionally specify the serial number of ST-LINK/V2 usb device. ST-LINK/V2
# devices seem to have serial numbers with unreadable characters. ST-LINK/V2 # devices seem to have serial numbers with unreadable characters. ST-LINK/V2

View File

@ -10,8 +10,8 @@
# #
adapter driver hla adapter driver hla
hla_layout ti-icdi hla layout ti-icdi
hla_vid_pid 0x1cbe 0x00fd hla vid_pid 0x1cbe 0x00fd
# Optionally specify the serial number of TI-ICDI devices, for when using # Optionally specify the serial number of TI-ICDI devices, for when using
# multiple devices. Serial numbers can be obtained using lsusb -v # multiple devices. Serial numbers can be obtained using lsusb -v

View File

@ -22,9 +22,9 @@ vdebug server $_VDEBUGHOST:$_VDEBUGPORT
# example config listen on all interfaces, disable tcl/telnet server # example config listen on all interfaces, disable tcl/telnet server
bindto 0.0.0.0 bindto 0.0.0.0
#gdb_port 3333 #gdb port 3333
#telnet_port disabled #telnet_port disabled
tcl_port disabled tcl port disabled
# transaction batching: 0 - no batching, 1 - (default) wr, 2 - rw # transaction batching: 0 - no batching, 1 - (default) wr, 2 - rw
vdebug batching 1 vdebug batching 1

View File

@ -28,7 +28,7 @@
# UART2_TX PB0 Per default disabled # UART2_TX PB0 Per default disabled
# UART2_RX PB1 Per default disabled # UART2_RX PB1 Per default disabled
# #
# JTAG is enabled by default after power on on listed JTAG_* pins. So far the # JTAG is enabled by default after power-on on listed JTAG_* pins. So far the
# boot sequence is: # boot sequence is:
# Time Action # Time Action
# 0000ms Power ON # 0000ms Power ON

View File

@ -8,7 +8,7 @@
# #
# Configure defaults for target # Configure defaults for target
# Can be overriden in board configuration file # Can be overridden in board configuration file
# #
if { [info exists CHIPNAME] } { if { [info exists CHIPNAME] } {

60
tcl/target/bl702.cfg Normal file
View File

@ -0,0 +1,60 @@
# SPDX-License-Identifier: GPL-2.0-or-later
#
# Bouffalo Labs BL702, BL704 and BL706 target
#
# https://en.bouffalolab.com/product/?type=detail&id=8
#
# Default JTAG pins: (if not changed by eFuse configuration)
# TMS - GPIO0
# TDI - GPIO1
# TCK - GPIO2
# TDO - GPIO9
#
source [find mem_helper.tcl]
transport select jtag
if { [info exists CHIPNAME] } {
set _CHIPNAME $CHIPNAME
} else {
set _CHIPNAME bl702
}
jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x20000e05
set _TARGETNAME $_CHIPNAME.cpu
target create $_TARGETNAME riscv -chain-position $_TARGETNAME
riscv set_mem_access sysbus
$_TARGETNAME configure -work-area-phys 0x22020000 -work-area-size 0x10000 -work-area-backup 1
# Internal RC ticks on 32 MHz, so this speed should be safe to use.
adapter speed 4000
$_TARGETNAME configure -event reset-assert-pre {
halt
# Switch clock to internal RC32M
# In HBN_GLB, set ROOT_CLK_SEL = 0
mmw 0x4000f030 0x0 0x00000003
# Wait for clock switch
sleep 10
# GLB_REG_BCLK_DIS_FALSE
mww 0x40000ffc 0x0
# HCLK is RC32M, so BCLK/HCLK doesn't need divider
# In GLB_CLK_CFG0, set BCLK_DIV = 0 and HCLK_DIV = 0
mmw 0x40000000 0x0 0x00FFFF00
# Wait for clock to stabilize
sleep 10
# Do reset
# In GLB_SWRST_CFG2, clear CTRL_SYS_RESET, CTRL_CPU_RESET and CTRL_PWRON_RESET
mmw 0x40000018 0x0 0x00000007
# In GLB_SWRST_CFG2, set CTRL_SYS_RESET, CTRL_CPU_RESET and CTRL_PWRON_RESET to 1
mmw 0x40000018 0x6 0x0
}

View File

@ -35,4 +35,4 @@ reset_config none
# The default linker scripts provided by the eSi-RISC toolchain do not # The default linker scripts provided by the eSi-RISC toolchain do not
# specify attributes on memory regions, which results in incorrect # specify attributes on memory regions, which results in incorrect
# application of software breakpoints by GDB. # application of software breakpoints by GDB.
gdb_breakpoint_override hard gdb breakpoint_override hard

View File

@ -200,7 +200,7 @@ proc configure_esp_xtensa_default_settings { } {
$_TARGETNAME_0 xtensa smpbreak BreakIn BreakOut $_TARGETNAME_0 xtensa smpbreak BreakIn BreakOut
} }
gdb_breakpoint_override hard gdb breakpoint_override hard
if { [info exists _FLASH_VOLTAGE] } { if { [info exists _FLASH_VOLTAGE] } {
$_TARGETNAME_0 $_CHIPNAME flashbootstrap $_FLASH_VOLTAGE $_TARGETNAME_0 $_CHIPNAME flashbootstrap $_FLASH_VOLTAGE

View File

@ -6,7 +6,7 @@
# #
# Utilities for TI ICEpick-C/D used in most TI SoCs # Utilities for TI ICEpick-C/D used in most TI SoCs
# Details about the ICEPick are available in the the TRM for each SoC # Details about the ICEPick are available in the TRM for each SoC
# and http://processors.wiki.ti.com/index.php/ICEPICK # and http://processors.wiki.ti.com/index.php/ICEPICK
# create "constants" # create "constants"

View File

@ -128,4 +128,4 @@ $_CHIPNAME.m30 configure -event reset-assert { }
$_CHIPNAME.m31 configure -event reset-assert { } $_CHIPNAME.m31 configure -event reset-assert { }
# Soft breakpoints don't currently work due to broken cache handling # Soft breakpoints don't currently work due to broken cache handling
gdb_breakpoint_override hard gdb breakpoint_override hard

View File

@ -128,4 +128,4 @@ $_CHIPNAME.m30 configure -event reset-assert { }
$_CHIPNAME.m31 configure -event reset-assert { } $_CHIPNAME.m31 configure -event reset-assert { }
# Soft breakpoints don't currently work due to broken cache handling # Soft breakpoints don't currently work due to broken cache handling
gdb_breakpoint_override hard gdb breakpoint_override hard

View File

@ -64,5 +64,5 @@ arm7_9 dcc_downloads enable
etm config $_TARGETNAME 16 normal full etb etm config $_TARGETNAME 16 normal full etb
etb config $_TARGETNAME $_CHIPNAME.etb etb config $_TARGETNAME $_CHIPNAME.etb
gdb_breakpoint_override hard gdb breakpoint_override hard
arm7_9 dbgrq enable arm7_9 dbgrq enable

View File

@ -113,7 +113,7 @@ proc psoc6_deassert_post { target } {
} }
if { $_ENABLE_CM0 } { if { $_ENABLE_CM0 } {
target create ${TARGET}.cm0 cortex_m -dap $_CHIPNAME.dap -ap-num 1 -coreid 0 target create ${TARGET}.cm0 cortex_m -dap $_CHIPNAME.dap -ap-num 1
${TARGET}.cm0 configure -work-area-phys $_WORKAREAADDR_CM0 -work-area-size $_WORKAREASIZE_CM0 -work-area-backup 0 ${TARGET}.cm0 configure -work-area-phys $_WORKAREAADDR_CM0 -work-area-size $_WORKAREASIZE_CM0 -work-area-backup 0
flash bank main_flash_cm0 psoc6 0x10000000 0 0 0 ${TARGET}.cm0 flash bank main_flash_cm0 psoc6 0x10000000 0 0 0 ${TARGET}.cm0
@ -128,7 +128,7 @@ if { $_ENABLE_CM0 } {
} }
if { $_ENABLE_CM4 } { if { $_ENABLE_CM4 } {
target create ${TARGET}.cm4 cortex_m -dap $_CHIPNAME.dap -ap-num 2 -coreid 1 target create ${TARGET}.cm4 cortex_m -dap $_CHIPNAME.dap -ap-num 2
${TARGET}.cm4 configure -work-area-phys $_WORKAREAADDR_CM4 -work-area-size $_WORKAREASIZE_CM4 -work-area-backup 0 ${TARGET}.cm4 configure -work-area-phys $_WORKAREAADDR_CM4 -work-area-size $_WORKAREASIZE_CM4 -work-area-backup 0
flash bank main_flash_cm4 psoc6 0x10000000 0 0 0 ${TARGET}.cm4 flash bank main_flash_cm4 psoc6 0x10000000 0 0 0 ${TARGET}.cm4

View File

@ -96,7 +96,7 @@ if { $_USE_CORE == 1 } {
set _FLASH_TARGET $_TARGETNAME_0 set _FLASH_TARGET $_TARGETNAME_0
} }
# Backup the work area. The flash probe runs an algorithm on the target CPU. # Backup the work area. The flash probe runs an algorithm on the target CPU.
# The flash is probed during gdb connect if gdb_memory_map is enabled (by default). # The flash is probed during gdb connect if gdb memory_map is enabled (by default).
$_FLASH_TARGET configure -work-area-phys 0x20010000 -work-area-size $_WORKAREASIZE -work-area-backup 1 $_FLASH_TARGET configure -work-area-phys 0x20010000 -work-area-size $_WORKAREASIZE -work-area-backup 1
set _FLASHNAME $_CHIPNAME.flash set _FLASHNAME $_CHIPNAME.flash
flash bank $_FLASHNAME rp2040_flash 0x10000000 0 0 0 $_FLASH_TARGET flash bank $_FLASHNAME rp2040_flash 0x10000000 0 0 0 $_FLASH_TARGET

View File

@ -209,6 +209,16 @@ switch $_soc {
# Sysctrl power-ap unlock offsets # Sysctrl power-ap unlock offsets
set _sysctrl_ap_unlock_offsets {0xf0 0x78} set _sysctrl_ap_unlock_offsets {0xf0 0x78}
# Setup DMEM access descriptions
# DAPBUS (Debugger) description
set _dmem_base_address 0x740002000
set _dmem_ap_address_offset 0x100
set _dmem_max_aps 10
# Emulated AP description
set _dmem_emu_base_address 0x760000000
set _dmem_emu_base_address_map_to 0x1d500000
set _dmem_emu_ap_list 1
# Overrides for am62p # Overrides for am62p
if { "$_soc" == "am62p" } { if { "$_soc" == "am62p" } {
set _K3_DAP_TAPID 0x0bb9d02f set _K3_DAP_TAPID 0x0bb9d02f

Some files were not shown because too many files have changed in this diff Show More