You can subscribe to this list here.
| 2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(75) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2009 |
Jan
(70) |
Feb
(20) |
Mar
(52) |
Apr
(149) |
May
(387) |
Jun
(466) |
Jul
(133) |
Aug
(87) |
Sep
(122) |
Oct
(140) |
Nov
(185) |
Dec
(105) |
| 2010 |
Jan
(85) |
Feb
(45) |
Mar
(75) |
Apr
(17) |
May
(41) |
Jun
(52) |
Jul
(33) |
Aug
(29) |
Sep
(36) |
Oct
(15) |
Nov
(26) |
Dec
(34) |
| 2011 |
Jan
(26) |
Feb
(25) |
Mar
(26) |
Apr
(29) |
May
(20) |
Jun
(27) |
Jul
(15) |
Aug
(32) |
Sep
(13) |
Oct
(64) |
Nov
(60) |
Dec
(10) |
| 2012 |
Jan
(64) |
Feb
(63) |
Mar
(39) |
Apr
(43) |
May
(54) |
Jun
(11) |
Jul
(30) |
Aug
(45) |
Sep
(11) |
Oct
(70) |
Nov
(24) |
Dec
(23) |
| 2013 |
Jan
(17) |
Feb
(8) |
Mar
(35) |
Apr
(40) |
May
(20) |
Jun
(24) |
Jul
(36) |
Aug
(25) |
Sep
(42) |
Oct
(40) |
Nov
(9) |
Dec
(21) |
| 2014 |
Jan
(29) |
Feb
(24) |
Mar
(60) |
Apr
(22) |
May
(22) |
Jun
(46) |
Jul
(11) |
Aug
(23) |
Sep
(26) |
Oct
(10) |
Nov
(14) |
Dec
(2) |
| 2015 |
Jan
(28) |
Feb
(47) |
Mar
(33) |
Apr
(58) |
May
(5) |
Jun
(1) |
Jul
|
Aug
(8) |
Sep
(12) |
Oct
(25) |
Nov
(58) |
Dec
(21) |
| 2016 |
Jan
(12) |
Feb
(40) |
Mar
(2) |
Apr
(1) |
May
(67) |
Jun
(2) |
Jul
(5) |
Aug
(36) |
Sep
|
Oct
(24) |
Nov
(17) |
Dec
(50) |
| 2017 |
Jan
(14) |
Feb
(16) |
Mar
(2) |
Apr
(35) |
May
(14) |
Jun
(16) |
Jul
(3) |
Aug
(3) |
Sep
|
Oct
(19) |
Nov
|
Dec
(16) |
| 2018 |
Jan
(55) |
Feb
(11) |
Mar
(34) |
Apr
(14) |
May
(4) |
Jun
(20) |
Jul
(39) |
Aug
(16) |
Sep
(17) |
Oct
(16) |
Nov
(20) |
Dec
(30) |
| 2019 |
Jan
(29) |
Feb
(24) |
Mar
(37) |
Apr
(26) |
May
(19) |
Jun
(21) |
Jul
(2) |
Aug
(3) |
Sep
(9) |
Oct
(12) |
Nov
(12) |
Dec
(12) |
| 2020 |
Jan
(47) |
Feb
(36) |
Mar
(54) |
Apr
(44) |
May
(37) |
Jun
(19) |
Jul
(32) |
Aug
(13) |
Sep
(16) |
Oct
(24) |
Nov
(32) |
Dec
(11) |
| 2021 |
Jan
(14) |
Feb
(5) |
Mar
(40) |
Apr
(32) |
May
(42) |
Jun
(31) |
Jul
(29) |
Aug
(47) |
Sep
(38) |
Oct
(17) |
Nov
(74) |
Dec
(33) |
| 2022 |
Jan
(11) |
Feb
(15) |
Mar
(40) |
Apr
(21) |
May
(39) |
Jun
(44) |
Jul
(19) |
Aug
(46) |
Sep
(79) |
Oct
(35) |
Nov
(21) |
Dec
(15) |
| 2023 |
Jan
(56) |
Feb
(13) |
Mar
(43) |
Apr
(28) |
May
(60) |
Jun
(15) |
Jul
(29) |
Aug
(28) |
Sep
(32) |
Oct
(21) |
Nov
(42) |
Dec
(39) |
| 2024 |
Jan
(35) |
Feb
(17) |
Mar
(28) |
Apr
(7) |
May
(14) |
Jun
(35) |
Jul
(30) |
Aug
(35) |
Sep
(30) |
Oct
(28) |
Nov
(38) |
Dec
(18) |
| 2025 |
Jan
(21) |
Feb
(28) |
Mar
(36) |
Apr
(35) |
May
(34) |
Jun
(58) |
Jul
(9) |
Aug
(54) |
Sep
(47) |
Oct
(15) |
Nov
(44) |
Dec
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:34:13
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 639b7432b81b8851155ab0d539c74ac183bb9bfa (commit)
from fdd76c899f423c09e4fb4311387eeebfc215650e (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 639b7432b81b8851155ab0d539c74ac183bb9bfa
Author: Marc Schink <de...@za...>
Date: Fri Dec 13 07:34:38 2024 +0000
tcl/board: Add config for NUCLEO-U083RC
Tested with NUCLEO-U083RC development board.
Change-Id: I5e7ed1a9a19dbab70ee3155f92d67874c33b1ac2
Signed-off-by: Marc Schink <de...@za...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8649
Tested-by: jenkins
Reviewed-by: Antonio Borneo <bor...@gm...>
diff --git a/tcl/board/st/nucleo-u083rc.cfg b/tcl/board/st/nucleo-u083rc.cfg
new file mode 100644
index 000000000..7b878adbc
--- /dev/null
+++ b/tcl/board/st/nucleo-u083rc.cfg
@@ -0,0 +1,12 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+# NUCLEO-U083RC
+# https://www.st.com/en/evaluation-tools/nucleo-u083rc.html
+
+source [find interface/stlink.cfg]
+
+transport select dapdirect_swd
+
+source [find target/stm32u0x.cfg]
+
+reset_config srst_only
-----------------------------------------------------------------------
Summary of changes:
tcl/board/{st_nucleo_c0.cfg => st/nucleo-u083rc.cfg} | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
copy tcl/board/{st_nucleo_c0.cfg => st/nucleo-u083rc.cfg} (55%)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:33:10
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via fdd76c899f423c09e4fb4311387eeebfc215650e (commit)
via d8a2f6dbcf5f0554def22d02f503fb242a604f84 (commit)
from 420f637cab324541230fbff0dea447cf40df3b0f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit fdd76c899f423c09e4fb4311387eeebfc215650e
Author: R. Diez <rdi...@rd...>
Date: Thu Apr 10 20:57:49 2025 +0200
configure.ac: show the sysfsgpio adapter in the config summary
Also enable this adapter by default (auto).
Change-Id: I43b9f1a1873b381d015114da57efc1d78e6e7780
Signed-off-by: R. Diez <rdi...@rd...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8834
Tested-by: jenkins
Reviewed-by: Antonio Borneo <bor...@gm...>
diff --git a/configure.ac b/configure.ac
index 5c516efd1..9db378702 100644
--- a/configure.ac
+++ b/configure.ac
@@ -164,6 +164,9 @@ m4_define([LIBFTDI_USB1_ADAPTERS],
m4_define([LIBGPIOD_ADAPTERS],
[[[linuxgpiod], [Linux GPIO bitbang through libgpiod], [LINUXGPIOD]]])
+m4_define([SYSFSGPIO_ADAPTER],
+ [[[sysfsgpio], [Linux GPIO bitbang through sysfs], [SYSFSGPIO]]])
+
m4_define([REMOTE_BITBANG_ADAPTER],
[[[remote_bitbang], [Remote Bitbang driver], [REMOTE_BITBANG]]])
@@ -315,6 +318,7 @@ AC_ARG_ADAPTERS([
LIBFTDI_ADAPTERS,
LIBFTDI_USB1_ADAPTERS,
LIBGPIOD_ADAPTERS,
+ SYSFSGPIO_ADAPTER,
REMOTE_BITBANG_ADAPTER,
LINUXSPIDEV_ADAPTER,
SERIAL_PORT_ADAPTERS,
@@ -379,10 +383,6 @@ AC_ARG_ENABLE([gw16012],
AS_HELP_STRING([--enable-gw16012], [Enable building support for the Gateworks GW16012 JTAG Programmer]),
[build_gw16012=$enableval], [build_gw16012=no])
-AC_ARG_ENABLE([sysfsgpio],
- AS_HELP_STRING([--enable-sysfsgpio], [Enable building support for programming driven via sysfs gpios.]),
- [build_sysfsgpio=$enableval], [build_sysfsgpio=no])
-
can_build_rshim=no
AS_CASE([$host_os],
@@ -391,10 +391,6 @@ AS_CASE([$host_os],
can_build_rshim=yes
],
[
- AS_IF([test "x$build_sysfsgpio" = "xyes"], [
- AC_MSG_ERROR([sysfsgpio is only available on linux])
- ])
-
AS_CASE([$host_os], [freebsd*], [
can_build_rshim=yes
],
@@ -604,13 +600,6 @@ AS_IF([test "x$use_internal_jimtcl" = "xyes"], [
])
])
-AS_IF([test "x$build_sysfsgpio" = "xyes"], [
- build_bitbang=yes
- AC_DEFINE([BUILD_SYSFSGPIO], [1], [1 if you want the SysfsGPIO driver.])
-], [
- AC_DEFINE([BUILD_SYSFSGPIO], [0], [0 if you don't want SysfsGPIO driver.])
-])
-
PKG_CHECK_MODULES([LIBUSB1], [libusb-1.0], [
use_libusb1=yes
AC_DEFINE([HAVE_LIBUSB1], [1], [Define if you have libusb-1.x])
@@ -702,6 +691,7 @@ PROCESS_ADAPTERS([HIDAPI_USB1_ADAPTERS], ["x$use_hidapi" = "xyes" -a "x$use_libu
PROCESS_ADAPTERS([LIBFTDI_ADAPTERS], ["x$use_libftdi" = "xyes"], [libftdi])
PROCESS_ADAPTERS([LIBFTDI_USB1_ADAPTERS], ["x$use_libftdi" = "xyes" -a "x$use_libusb1" = "xyes"], [libftdi and libusb-1.x])
PROCESS_ADAPTERS([LIBGPIOD_ADAPTERS], ["x$use_libgpiod" = "xyes"], [Linux libgpiod])
+PROCESS_ADAPTERS([SYSFSGPIO_ADAPTER], ["x$is_linux" = "xyes"], [Linux sysfs])
PROCESS_ADAPTERS([REMOTE_BITBANG_ADAPTER], [true], [unused])
PROCESS_ADAPTERS([LIBJAYLINK_ADAPTERS], ["x$use_internal_libjaylink" = "xyes" -o "x$use_libjaylink" = "xyes"], [libjaylink-0.2])
PROCESS_ADAPTERS([PCIE_ADAPTERS], ["x$is_linux" = "xyes"], [Linux build])
@@ -720,6 +710,10 @@ AS_IF([test "x$enable_linuxgpiod" != "xno"], [
build_bitbang=yes
])
+AS_IF([test "x$enable_sysfsgpio" != "xno"], [
+ build_bitbang=yes
+])
+
AS_IF([test "x$enable_remote_bitbang" != "xno"], [
build_bitbang=yes
])
@@ -767,7 +761,6 @@ AM_CONDITIONAL([AM335XGPIO], [test "x$build_am335xgpio" = "xyes"])
AM_CONDITIONAL([BITBANG], [test "x$build_bitbang" = "xyes"])
AM_CONDITIONAL([USB_BLASTER_DRIVER], [test "x$enable_usb_blaster" != "xno" -o "x$enable_usb_blaster_2" != "xno"])
AM_CONDITIONAL([GW16012], [test "x$build_gw16012" = "xyes"])
-AM_CONDITIONAL([SYSFSGPIO], [test "x$build_sysfsgpio" = "xyes"])
AM_CONDITIONAL([USE_LIBUSB1], [test "x$use_libusb1" = "xyes"])
AM_CONDITIONAL([IS_CYGWIN], [test "x$is_cygwin" = "xyes"])
AM_CONDITIONAL([IS_MINGW], [test "x$is_mingw" = "xyes"])
@@ -864,6 +857,7 @@ m4_foreach([adapter], [USB1_ADAPTERS,
HIDAPI_ADAPTERS, HIDAPI_USB1_ADAPTERS, LIBFTDI_ADAPTERS,
LIBFTDI_USB1_ADAPTERS,
LIBGPIOD_ADAPTERS,
+ SYSFSGPIO_ADAPTER,
REMOTE_BITBANG_ADAPTER,
LIBJAYLINK_ADAPTERS, PCIE_ADAPTERS, SERIAL_PORT_ADAPTERS,
LINUXSPIDEV_ADAPTER,
commit d8a2f6dbcf5f0554def22d02f503fb242a604f84
Author: R. Diez <rdi...@rd...>
Date: Fri Apr 11 15:30:22 2025 +0200
configure.ac: show the Amontec JTAG-Accelerator driver in the config summary
Also enable this driver by default (auto).
Change-Id: I7f592dd697c6ee150a81e151ff2333447cd9130d
Signed-off-by: R. Diez <rdi...@rd...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8835
Tested-by: jenkins
Reviewed-by: zapb <de...@za...>
Reviewed-by: Antonio Borneo <bor...@gm...>
diff --git a/configure.ac b/configure.ac
index 84ca03bf0..5c516efd1 100644
--- a/configure.ac
+++ b/configure.ac
@@ -190,6 +190,9 @@ m4_define([JTAG_VPI_ADAPTER],
m4_define([RSHIM_ADAPTER],
[[[rshim], [BlueField SoC via rshim], [RSHIM]]])
+m4_define([AMTJTAGACCEL_ADAPTER],
+ [[[amtjtagaccel], [Amontec JTAG-Accelerator driver], [AMTJTAGACCEL]]])
+
# The word 'Adapter' in "Dummy Adapter" below must begin with a capital letter
# because there is an M4 macro called 'adapter'.
m4_define([DUMMY_ADAPTER],
@@ -320,6 +323,7 @@ AC_ARG_ADAPTERS([
JTAG_DPI_ADAPTER,
JTAG_VPI_ADAPTER,
RSHIM_ADAPTER,
+ AMTJTAGACCEL_ADAPTER,
PCIE_ADAPTERS,
LIBJAYLINK_ADAPTERS
],[auto])
@@ -338,10 +342,6 @@ AC_ARG_ENABLE([parport_giveio],
[Enable use of giveio for parport (for CygWin only)]),
[parport_use_giveio=$enableval], [parport_use_giveio=])
-AC_ARG_ENABLE([amtjtagaccel],
- AS_HELP_STRING([--enable-amtjtagaccel], [Enable building the Amontec JTAG-Accelerator driver]),
- [build_amtjtagaccel=$enableval], [build_amtjtagaccel=no])
-
AS_CASE(["${host_cpu}"],
[arm*|aarch64], [
AC_ARG_ENABLE([bcm2835gpio],
@@ -576,12 +576,6 @@ AS_IF([test "x$parport_use_giveio" = "xyes"], [
AC_DEFINE([PARPORT_USE_GIVEIO], [0], [0 if you don't want parport to use giveio.])
])
-AS_IF([test "x$build_amtjtagaccel" = "xyes"], [
- AC_DEFINE([BUILD_AMTJTAGACCEL], [1], [1 if you want the Amontec JTAG-Accelerator driver.])
-], [
- AC_DEFINE([BUILD_AMTJTAGACCEL], [0], [0 if you don't want the Amontec JTAG-Accelerator driver.])
-])
-
AS_IF([test "x$build_gw16012" = "xyes"], [
AC_DEFINE([BUILD_GW16012], [1], [1 if you want the Gateworks GW16012 driver.])
], [
@@ -719,6 +713,7 @@ PROCESS_ADAPTERS([JTAG_DPI_ADAPTER], [true], [unused])
PROCESS_ADAPTERS([JTAG_VPI_ADAPTER], [true], [unused])
PROCESS_ADAPTERS([RSHIM_ADAPTER], ["x$can_build_rshim" = "xyes"],
[internal error: validation should happen beforehand])
+PROCESS_ADAPTERS([AMTJTAGACCEL_ADAPTER], [true], [unused])
PROCESS_ADAPTERS([DUMMY_ADAPTER], [true], [unused])
AS_IF([test "x$enable_linuxgpiod" != "xno"], [
@@ -771,7 +766,6 @@ AM_CONDITIONAL([IMX_GPIO], [test "x$build_imx_gpio" = "xyes"])
AM_CONDITIONAL([AM335XGPIO], [test "x$build_am335xgpio" = "xyes"])
AM_CONDITIONAL([BITBANG], [test "x$build_bitbang" = "xyes"])
AM_CONDITIONAL([USB_BLASTER_DRIVER], [test "x$enable_usb_blaster" != "xno" -o "x$enable_usb_blaster_2" != "xno"])
-AM_CONDITIONAL([AMTJTAGACCEL], [test "x$build_amtjtagaccel" = "xyes"])
AM_CONDITIONAL([GW16012], [test "x$build_gw16012" = "xyes"])
AM_CONDITIONAL([SYSFSGPIO], [test "x$build_sysfsgpio" = "xyes"])
AM_CONDITIONAL([USE_LIBUSB1], [test "x$use_libusb1" = "xyes"])
@@ -877,6 +871,7 @@ m4_foreach([adapter], [USB1_ADAPTERS,
JTAG_DPI_ADAPTER,
JTAG_VPI_ADAPTER,
RSHIM_ADAPTER,
+ AMTJTAGACCEL_ADAPTER,
DUMMY_ADAPTER,
OPTIONAL_LIBRARIES,
COVERAGE],
-----------------------------------------------------------------------
Summary of changes:
configure.ac | 43 ++++++++++++++++---------------------------
1 file changed, 16 insertions(+), 27 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:30:25
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 420f637cab324541230fbff0dea447cf40df3b0f (commit)
from ad53fe659b46657ddf16a08f8dc4f4d0c5df8901 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 420f637cab324541230fbff0dea447cf40df3b0f
Author: Antonio Borneo <bor...@gm...>
Date: Mon Dec 23 20:20:08 2024 +0100
stlink: simplify the use of deprecated HLA transport
Commit 34ec5536c0ba ("stlink: deprecate HLA support") makes hard
to use the still functional HLA transport with the stlink listed
in board config files.
Now that the prefixes 'hla_' and 'dapdirect_' has been dropped
from the transport name, allow overriding the transport by using
the 'stlink-hla' script in front of the board file, e.g.:
openocd -f interface/stlink-hla.cfg -f board/st_nucleo_f4.cfg
Revert the documentation changes of the change above.
Improve the documentation to explain how to use the compatibility
HLA mode.
Improve the error message in stlink driver to guide the user to
update the stlink firmware and to use the compatibility HLA mode.
Change-Id: I5d0bc7954511692cebe024bda2aaa72767b97681
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8679
Tested-by: jenkins
diff --git a/doc/openocd.texi b/doc/openocd.texi
index f557a55fe..cbe5e86da 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -2497,7 +2497,7 @@ This command is only available if your libusb1 is at least version 1.0.16.
Specifies the @var{serial_string} of the adapter to use.
If this command is not specified, serial strings are not checked.
Only the following adapter drivers use the serial string from this command:
-arm-jtag-ew, cmsis_dap, esp_usb_jtag, ft232r, ftdi, hla (ti-icdi), jlink, kitprog, opendus,
+arm-jtag-ew, cmsis_dap, esp_usb_jtag, ft232r, ftdi, hla (stlink, ti-icdi), jlink, kitprog, opendus,
openjtag, osbdm, presto, rlink, st-link, usb_blaster (ublast2), usbprog, vsllink, xds110.
@end deffn
@@ -3205,16 +3205,19 @@ that OpenOCD would normally use to access the target.
Currently supported adapters include the STMicroelectronics ST-LINK, TI ICDI
and Nuvoton Nu-Link.
+
ST-LINK firmware version >= V2.J21.S4 recommended due to issues with earlier
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
version reported is V2.J21.S4.
+The ST-LINK firmware update utility is available for download from
+@url{https://www.st.com/en/development-tools/stsw-link007.html, ST website}.
@deffn {Config Command} {hla device_desc} description
Currently Not Supported.
@end deffn
-@deffn {Config Command} {hla layout} (@option{icdi}|@option{nulink})
+@deffn {Config Command} {hla layout} (@option{stlink}|@option{icdi}|@option{nulink})
Specifies the adapter layout to use.
@end deffn
@@ -3222,6 +3225,15 @@ Specifies the adapter layout to use.
Pairs of vendor IDs and product IDs of the device.
@end deffn
+@deffn {Config Command} {hla stlink_backend} (usb | tcp [port])
+@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).
+
+@emph{Note:} ST-Link TCP server is a binary application provided by ST
+available from @url{https://www.st.com/en/development-tools/st-link-server.html,
+ST-LINK server software module}.
+@end deffn
+
@deffn {Command} {hla command} command
Execute a custom adapter-specific command. The @var{command} string is
passed as is to the underlying adapter layout handler.
@@ -3236,6 +3248,11 @@ directly access the arm ADIv5 DAP.
The older API that requires HLA transport is deprecated and will be dropped
from OpenOCD. In mean time it's still available by using @file{interface/stlink-hla.cfg}.
+The HLA interface file can be put as first command line argument to
+force using is in place of the default DAP API.
+@example
+openocd -f interface/stlink-hla.cfg -f board/st_nucleo_f4.cfg
+@end example
The new API provide access to multiple AP on the same DAP, but the
maximum number of the AP port is limited by the specific firmware version
diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index e018f71cd..5ee1f8526 100644
--- a/src/jtag/drivers/stlink_usb.c
+++ b/src/jtag/drivers/stlink_usb.c
@@ -5143,7 +5143,12 @@ static int stlink_dap_init(void)
if ((mode != STLINK_MODE_DEBUG_SWIM) &&
!(stlink_dap_handle->version.flags & STLINK_F_HAS_DAP_REG)) {
- LOG_ERROR("ST-Link version does not support DAP direct transport");
+ LOG_ERROR("The firmware in the ST-Link adapter only supports deprecated HLA.");
+ LOG_ERROR("Please consider updating the ST-Link firmware with a version");
+ LOG_ERROR("newer that V2J24 (2015), available for downloading on ST website:");
+ LOG_ERROR(" https://www.st.com/en/development-tools/stsw-link007.html");
+ LOG_ERROR("In mean time, you can re-run OpenOCD for ST-Link HLA as:");
+ LOG_ERROR(" openocd -f interface/stlink-hla.cfg ...");
return ERROR_FAIL;
}
return ERROR_OK;
diff --git a/tcl/interface/stlink.cfg b/tcl/interface/stlink.cfg
index 962d192ec..48c565661 100644
--- a/tcl/interface/stlink.cfg
+++ b/tcl/interface/stlink.cfg
@@ -10,6 +10,12 @@
# SWIM transport is natively supported
#
+if { [adapter name] == "hla" } {
+ # Deprecated HLA adapter driver already selected.
+ # Quit silently, as the ST-LINK driver already complains.
+ return
+}
+
adapter driver st-link
st-link vid_pid 0x0483 0x3744 0x0483 0x3748 0x0483 0x374b 0x0483 0x374d 0x0483 0x374e 0x0483 0x374f 0x0483 0x3752 0x0483 0x3753 0x0483 0x3754 0x0483 0x3755 0x0483 0x3757
-----------------------------------------------------------------------
Summary of changes:
doc/openocd.texi | 21 +++++++++++++++++++--
src/jtag/drivers/stlink_usb.c | 7 ++++++-
tcl/interface/stlink.cfg | 6 ++++++
3 files changed, 31 insertions(+), 3 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:29:57
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via ad53fe659b46657ddf16a08f8dc4f4d0c5df8901 (commit)
from c1c4d489df4bbbc2902c0e4ef744157994f1b22a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit ad53fe659b46657ddf16a08f8dc4f4d0c5df8901
Author: Antonio Borneo <bor...@gm...>
Date: Mon Dec 23 18:10:10 2024 +0100
tcl: convert transport select to jtag and swd
Convert every transport select command:
- hla_swd -> swd
- dapdirect_swd -> swd
- hla_jtag -> jtag
- dapdirect_jtag -> jtag
Change-Id: I81971e06f7aefd21a570a4e098cf3822a775464b
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8678
Reviewed-by: zapb <de...@za...>
Tested-by: jenkins
diff --git a/tcl/board/ek-lm4f120xl.cfg b/tcl/board/ek-lm4f120xl.cfg
index db8b2010b..44b1b1ea1 100644
--- a/tcl/board/ek-lm4f120xl.cfg
+++ b/tcl/board/ek-lm4f120xl.cfg
@@ -12,7 +12,7 @@
#
source [find interface/ti-icdi.cfg]
-transport select hla_jtag
+transport select jtag
set WORKAREASIZE 0x8000
set CHIPNAME lm4f120h5qr
diff --git a/tcl/board/ek-lm4f232.cfg b/tcl/board/ek-lm4f232.cfg
index 89b2c3ce8..bb7f9ea5b 100644
--- a/tcl/board/ek-lm4f232.cfg
+++ b/tcl/board/ek-lm4f232.cfg
@@ -12,7 +12,7 @@
#
source [find interface/ti-icdi.cfg]
-transport select hla_jtag
+transport select jtag
set WORKAREASIZE 0x8000
set CHIPNAME lm4f23x
diff --git a/tcl/board/st_b-l475e-iot01a.cfg b/tcl/board/st_b-l475e-iot01a.cfg
index 3f3db125c..5bdbdb4a2 100644
--- a/tcl/board/st_b-l475e-iot01a.cfg
+++ b/tcl/board/st_b-l475e-iot01a.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 96KB
set WORKAREASIZE 0x18000
diff --git a/tcl/board/st_nucleo_f0.cfg b/tcl/board/st_nucleo_f0.cfg
index 00c131fd6..4d8071127 100644
--- a/tcl/board/st_nucleo_f0.cfg
+++ b/tcl/board/st_nucleo_f0.cfg
@@ -10,7 +10,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32f0x.cfg]
diff --git a/tcl/board/st_nucleo_f103rb.cfg b/tcl/board/st_nucleo_f103rb.cfg
index 892bdda99..1b440ed9e 100644
--- a/tcl/board/st_nucleo_f103rb.cfg
+++ b/tcl/board/st_nucleo_f103rb.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32f1x.cfg]
diff --git a/tcl/board/st_nucleo_f3.cfg b/tcl/board/st_nucleo_f3.cfg
index 38f49e3d5..8ff57eece 100644
--- a/tcl/board/st_nucleo_f3.cfg
+++ b/tcl/board/st_nucleo_f3.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32f3x.cfg]
diff --git a/tcl/board/st_nucleo_f4.cfg b/tcl/board/st_nucleo_f4.cfg
index 7617a1758..574417c96 100644
--- a/tcl/board/st_nucleo_f4.cfg
+++ b/tcl/board/st_nucleo_f4.cfg
@@ -8,7 +8,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32f4x.cfg]
diff --git a/tcl/board/st_nucleo_f7.cfg b/tcl/board/st_nucleo_f7.cfg
index 41f8b2129..eaf79669c 100644
--- a/tcl/board/st_nucleo_f7.cfg
+++ b/tcl/board/st_nucleo_f7.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32f7x.cfg]
diff --git a/tcl/board/st_nucleo_g0.cfg b/tcl/board/st_nucleo_g0.cfg
index f22a7e397..c68d3d0e5 100644
--- a/tcl/board/st_nucleo_g0.cfg
+++ b/tcl/board/st_nucleo_g0.cfg
@@ -12,7 +12,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32g0x.cfg]
diff --git a/tcl/board/st_nucleo_g4.cfg b/tcl/board/st_nucleo_g4.cfg
index 309f7a4c8..3debdc381 100644
--- a/tcl/board/st_nucleo_g4.cfg
+++ b/tcl/board/st_nucleo_g4.cfg
@@ -12,7 +12,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32g4x.cfg]
diff --git a/tcl/board/st_nucleo_h743zi.cfg b/tcl/board/st_nucleo_h743zi.cfg
index be2d42fb8..a996d744b 100644
--- a/tcl/board/st_nucleo_h743zi.cfg
+++ b/tcl/board/st_nucleo_h743zi.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32h7x_dual_bank.cfg]
diff --git a/tcl/board/st_nucleo_h745zi.cfg b/tcl/board/st_nucleo_h745zi.cfg
index 84865f422..697d1972a 100644
--- a/tcl/board/st_nucleo_h745zi.cfg
+++ b/tcl/board/st_nucleo_h745zi.cfg
@@ -3,7 +3,7 @@
# This is an ST NUCLEO-H745ZI-Q board with single STM32H745ZITx chip.
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# STM32H745xx devices are dual core (Cortex-M7 and Cortex-M4)
set DUAL_CORE 1
diff --git a/tcl/board/st_nucleo_l073rz.cfg b/tcl/board/st_nucleo_l073rz.cfg
index 317c86e21..d1a2e0768 100644
--- a/tcl/board/st_nucleo_l073rz.cfg
+++ b/tcl/board/st_nucleo_l073rz.cfg
@@ -4,7 +4,7 @@
# http://www.st.com/en/evaluation-tools/nucleo-l073rz.html
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set WORKAREASIZE 0x2000
diff --git a/tcl/board/st_nucleo_l1.cfg b/tcl/board/st_nucleo_l1.cfg
index d7474d0fe..0ffc71dfe 100644
--- a/tcl/board/st_nucleo_l1.cfg
+++ b/tcl/board/st_nucleo_l1.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32l1x_dual_bank.cfg]
diff --git a/tcl/board/st_nucleo_l4.cfg b/tcl/board/st_nucleo_l4.cfg
index b0a75afe0..dad3cc4b9 100644
--- a/tcl/board/st_nucleo_l4.cfg
+++ b/tcl/board/st_nucleo_l4.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32l4x.cfg]
diff --git a/tcl/board/st_nucleo_l5.cfg b/tcl/board/st_nucleo_l5.cfg
index 626914aa7..f3cb680c2 100644
--- a/tcl/board/st_nucleo_l5.cfg
+++ b/tcl/board/st_nucleo_l5.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32l5x.cfg]
diff --git a/tcl/board/st_nucleo_wb55.cfg b/tcl/board/st_nucleo_wb55.cfg
index ab7307c68..79ddb1ccd 100644
--- a/tcl/board/st_nucleo_wb55.cfg
+++ b/tcl/board/st_nucleo_wb55.cfg
@@ -6,7 +6,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32wbx.cfg]
diff --git a/tcl/board/stm320518_eval_stlink.cfg b/tcl/board/stm320518_eval_stlink.cfg
index 997bb4af9..8f4652eff 100644
--- a/tcl/board/stm320518_eval_stlink.cfg
+++ b/tcl/board/stm320518_eval_stlink.cfg
@@ -8,7 +8,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 8KB
set WORKAREASIZE 0x2000
diff --git a/tcl/board/stm3220g_eval_stlink.cfg b/tcl/board/stm3220g_eval_stlink.cfg
index 4233d04f1..d212bbc29 100644
--- a/tcl/board/stm3220g_eval_stlink.cfg
+++ b/tcl/board/stm3220g_eval_stlink.cfg
@@ -8,7 +8,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm3241g_eval_stlink.cfg b/tcl/board/stm3241g_eval_stlink.cfg
index 3bccd2866..e1ab2026b 100644
--- a/tcl/board/stm3241g_eval_stlink.cfg
+++ b/tcl/board/stm3241g_eval_stlink.cfg
@@ -8,7 +8,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm32429i_eval_stlink.cfg b/tcl/board/stm32429i_eval_stlink.cfg
index 7d04aa7f3..ec7e10c43 100644
--- a/tcl/board/stm32429i_eval_stlink.cfg
+++ b/tcl/board/stm32429i_eval_stlink.cfg
@@ -8,7 +8,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm32439i_eval_stlink.cfg b/tcl/board/stm32439i_eval_stlink.cfg
index b9ea084df..bac64c81a 100644
--- a/tcl/board/stm32439i_eval_stlink.cfg
+++ b/tcl/board/stm32439i_eval_stlink.cfg
@@ -8,7 +8,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm32f0discovery.cfg b/tcl/board/stm32f0discovery.cfg
index 398ecc103..9a8e92153 100644
--- a/tcl/board/stm32f0discovery.cfg
+++ b/tcl/board/stm32f0discovery.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set WORKAREASIZE 0x2000
source [find target/stm32f0x.cfg]
diff --git a/tcl/board/stm32f3discovery.cfg b/tcl/board/stm32f3discovery.cfg
index 73c349a6e..661082acf 100644
--- a/tcl/board/stm32f3discovery.cfg
+++ b/tcl/board/stm32f3discovery.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32f3x.cfg]
diff --git a/tcl/board/stm32f412g-disco.cfg b/tcl/board/stm32f412g-disco.cfg
index 30a9537f0..e27806291 100644
--- a/tcl/board/stm32f412g-disco.cfg
+++ b/tcl/board/stm32f412g-disco.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm32f413h-disco.cfg b/tcl/board/stm32f413h-disco.cfg
index c82d0d434..9a72c121c 100644
--- a/tcl/board/stm32f413h-disco.cfg
+++ b/tcl/board/stm32f413h-disco.cfg
@@ -10,7 +10,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm32f429disc1.cfg b/tcl/board/stm32f429disc1.cfg
index 0a8e7ef4e..a5646c9ec 100644
--- a/tcl/board/stm32f429disc1.cfg
+++ b/tcl/board/stm32f429disc1.cfg
@@ -7,7 +7,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32f4x.cfg]
diff --git a/tcl/board/stm32f429discovery.cfg b/tcl/board/stm32f429discovery.cfg
index 865602ab6..735254e7f 100644
--- a/tcl/board/stm32f429discovery.cfg
+++ b/tcl/board/stm32f429discovery.cfg
@@ -7,7 +7,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm32f469discovery.cfg b/tcl/board/stm32f469discovery.cfg
index c9acbbbd0..7d3992906 100644
--- a/tcl/board/stm32f469discovery.cfg
+++ b/tcl/board/stm32f469discovery.cfg
@@ -7,7 +7,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm32f469i-disco.cfg b/tcl/board/stm32f469i-disco.cfg
index 63c42c64e..45ec9a269 100644
--- a/tcl/board/stm32f469i-disco.cfg
+++ b/tcl/board/stm32f469i-disco.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm32f4discovery.cfg b/tcl/board/stm32f4discovery.cfg
index d96e2dbd3..73ede7ed7 100644
--- a/tcl/board/stm32f4discovery.cfg
+++ b/tcl/board/stm32f4discovery.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 64KB
set WORKAREASIZE 0x10000
diff --git a/tcl/board/stm32f723e-disco.cfg b/tcl/board/stm32f723e-disco.cfg
index 020795620..8acefff4c 100644
--- a/tcl/board/stm32f723e-disco.cfg
+++ b/tcl/board/stm32f723e-disco.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 128KB
set WORKAREASIZE 0x20000
diff --git a/tcl/board/stm32f746g-disco.cfg b/tcl/board/stm32f746g-disco.cfg
index 75ff4ec1e..04ed72cc5 100644
--- a/tcl/board/stm32f746g-disco.cfg
+++ b/tcl/board/stm32f746g-disco.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 256KB
set WORKAREASIZE 0x40000
diff --git a/tcl/board/stm32f769i-disco.cfg b/tcl/board/stm32f769i-disco.cfg
index cd6383a70..89e197c52 100644
--- a/tcl/board/stm32f769i-disco.cfg
+++ b/tcl/board/stm32f769i-disco.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 256KB
set WORKAREASIZE 0x40000
diff --git a/tcl/board/stm32f7discovery.cfg b/tcl/board/stm32f7discovery.cfg
index 6fd6c64b3..3f3bceb84 100644
--- a/tcl/board/stm32f7discovery.cfg
+++ b/tcl/board/stm32f7discovery.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK/V2-1
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 256KB
set WORKAREASIZE 0x40000
diff --git a/tcl/board/stm32h735g-disco.cfg b/tcl/board/stm32h735g-disco.cfg
index 327a36418..e839c7a54 100644
--- a/tcl/board/stm32h735g-disco.cfg
+++ b/tcl/board/stm32h735g-disco.cfg
@@ -7,7 +7,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set CHIPNAME stm32h735igk6
diff --git a/tcl/board/stm32h745i-disco.cfg b/tcl/board/stm32h745i-disco.cfg
index 9da1daefc..700f141d2 100644
--- a/tcl/board/stm32h745i-disco.cfg
+++ b/tcl/board/stm32h745i-disco.cfg
@@ -7,7 +7,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set CHIPNAME stm32h745xih6
diff --git a/tcl/board/stm32h747i-disco.cfg b/tcl/board/stm32h747i-disco.cfg
index 7f8eda8c4..e95ad8a12 100644
--- a/tcl/board/stm32h747i-disco.cfg
+++ b/tcl/board/stm32h747i-disco.cfg
@@ -7,7 +7,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set CHIPNAME stm32h747xih6
diff --git a/tcl/board/stm32h750b-disco.cfg b/tcl/board/stm32h750b-disco.cfg
index 8b254f21f..8f0f15b53 100644
--- a/tcl/board/stm32h750b-disco.cfg
+++ b/tcl/board/stm32h750b-disco.cfg
@@ -7,7 +7,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set CHIPNAME stm32h750xbh6
diff --git a/tcl/board/stm32h7b3i-disco.cfg b/tcl/board/stm32h7b3i-disco.cfg
index df0d0a6f2..de009570f 100644
--- a/tcl/board/stm32h7b3i-disco.cfg
+++ b/tcl/board/stm32h7b3i-disco.cfg
@@ -7,7 +7,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set CHIPNAME stm32h7b3lih6q
diff --git a/tcl/board/stm32h7x3i_eval.cfg b/tcl/board/stm32h7x3i_eval.cfg
index 508f10d5d..1880bb871 100644
--- a/tcl/board/stm32h7x3i_eval.cfg
+++ b/tcl/board/stm32h7x3i_eval.cfg
@@ -8,7 +8,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32h7x_dual_bank.cfg]
diff --git a/tcl/board/stm32l0discovery.cfg b/tcl/board/stm32l0discovery.cfg
index 59aed3405..06d02ed02 100644
--- a/tcl/board/stm32l0discovery.cfg
+++ b/tcl/board/stm32l0discovery.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set WORKAREASIZE 0x2000
source [find target/stm32l0.cfg]
diff --git a/tcl/board/stm32l476g-disco.cfg b/tcl/board/stm32l476g-disco.cfg
index fe33ffefb..e3d4de3c0 100644
--- a/tcl/board/stm32l476g-disco.cfg
+++ b/tcl/board/stm32l476g-disco.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 96KB
set WORKAREASIZE 0x18000
diff --git a/tcl/board/stm32l496g-disco.cfg b/tcl/board/stm32l496g-disco.cfg
index 823fa6e38..a715bb058 100644
--- a/tcl/board/stm32l496g-disco.cfg
+++ b/tcl/board/stm32l496g-disco.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 96KB
set WORKAREASIZE 0x18000
diff --git a/tcl/board/stm32l4discovery.cfg b/tcl/board/stm32l4discovery.cfg
index 64a456b61..7f724f9bd 100644
--- a/tcl/board/stm32l4discovery.cfg
+++ b/tcl/board/stm32l4discovery.cfg
@@ -8,7 +8,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32l4x.cfg]
diff --git a/tcl/board/stm32l4p5g-disco.cfg b/tcl/board/stm32l4p5g-disco.cfg
index 33bb9a766..86c05a18d 100644
--- a/tcl/board/stm32l4p5g-disco.cfg
+++ b/tcl/board/stm32l4p5g-disco.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 96KB
set WORKAREASIZE 0x18000
diff --git a/tcl/board/stm32l4r9i-disco.cfg b/tcl/board/stm32l4r9i-disco.cfg
index cbb86669f..de23cc1ae 100644
--- a/tcl/board/stm32l4r9i-disco.cfg
+++ b/tcl/board/stm32l4r9i-disco.cfg
@@ -6,7 +6,7 @@
# This is for using the onboard STLINK
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
# increase working area to 96KB
set WORKAREASIZE 0x18000
diff --git a/tcl/board/stm32ldiscovery.cfg b/tcl/board/stm32ldiscovery.cfg
index e39b52295..38b8a8bd0 100644
--- a/tcl/board/stm32ldiscovery.cfg
+++ b/tcl/board/stm32ldiscovery.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set WORKAREASIZE 0x4000
source [find target/stm32l1.cfg]
diff --git a/tcl/board/stm32mp13x_dk.cfg b/tcl/board/stm32mp13x_dk.cfg
index 08377ca76..8ece24844 100644
--- a/tcl/board/stm32mp13x_dk.cfg
+++ b/tcl/board/stm32mp13x_dk.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32mp13x.cfg]
diff --git a/tcl/board/stm32mp15x_dk2.cfg b/tcl/board/stm32mp15x_dk2.cfg
index 0e71e05ee..ba1c7f78a 100644
--- a/tcl/board/stm32mp15x_dk2.cfg
+++ b/tcl/board/stm32mp15x_dk2.cfg
@@ -6,7 +6,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
source [find target/stm32mp15x.cfg]
diff --git a/tcl/board/stm32vldiscovery.cfg b/tcl/board/stm32vldiscovery.cfg
index 57852bfd4..d79c62ea4 100644
--- a/tcl/board/stm32vldiscovery.cfg
+++ b/tcl/board/stm32vldiscovery.cfg
@@ -5,7 +5,7 @@
source [find interface/stlink.cfg]
-transport select dapdirect_swd
+transport select swd
set WORKAREASIZE 0x2000
source [find target/stm32f1x.cfg]
diff --git a/tcl/board/ti_dk-tm4c129.cfg b/tcl/board/ti_dk-tm4c129.cfg
index d8210e32d..e0574fa87 100644
--- a/tcl/board/ti_dk-tm4c129.cfg
+++ b/tcl/board/ti_dk-tm4c129.cfg
@@ -8,7 +8,7 @@
source [find interface/ti-icdi.cfg]
-transport select hla_jtag
+transport select jtag
set WORKAREASIZE 0x8000
set CHIPNAME tm4c129xnczad
diff --git a/tcl/board/ti_ek-tm4c123gxl.cfg b/tcl/board/ti_ek-tm4c123gxl.cfg
index 91390fa82..7b8fc267f 100644
--- a/tcl/board/ti_ek-tm4c123gxl.cfg
+++ b/tcl/board/ti_ek-tm4c123gxl.cfg
@@ -8,7 +8,7 @@
source [find interface/ti-icdi.cfg]
-transport select hla_jtag
+transport select jtag
set WORKAREASIZE 0x8000
set CHIPNAME tm4c123gh6pm
diff --git a/tcl/board/ti_ek-tm4c1294xl.cfg b/tcl/board/ti_ek-tm4c1294xl.cfg
index 63612c686..8cceb49c9 100644
--- a/tcl/board/ti_ek-tm4c1294xl.cfg
+++ b/tcl/board/ti_ek-tm4c1294xl.cfg
@@ -8,7 +8,7 @@
source [find interface/ti-icdi.cfg]
-transport select hla_jtag
+transport select jtag
set WORKAREASIZE 0x8000
set CHIPNAME tm4c1294ncpdt
diff --git a/tcl/board/vd_a53x2_dap.cfg b/tcl/board/vd_a53x2_dap.cfg
index bcf8b4409..3251afd06 100644
--- a/tcl/board/vd_a53x2_dap.cfg
+++ b/tcl/board/vd_a53x2_dap.cfg
@@ -13,7 +13,7 @@ set DBGBASE {0x80810000 0x80910000}
set CTIBASE {0x80820000 0x80920000}
# vdebug select transport
-transport select dapdirect_swd
+transport select swd
# JTAG reset config, frequency and reset delay
adapter speed 50000
diff --git a/tcl/board/vd_a75x4_dap.cfg b/tcl/board/vd_a75x4_dap.cfg
index 5c2a2efe8..2f4406b03 100644
--- a/tcl/board/vd_a75x4_dap.cfg
+++ b/tcl/board/vd_a75x4_dap.cfg
@@ -13,7 +13,7 @@ set DBGBASE {0x01010000 0x01110000 0x01210000 0x01310000}
set CTIBASE {0x01020000 0x01120000 0x01220000 0x01320000}
# vdebug select transport
-transport select dapdirect_swd
+transport select swd
# JTAG reset config, frequency and reset delay
adapter speed 200000
diff --git a/tcl/board/vd_m4_dap.cfg b/tcl/board/vd_m4_dap.cfg
index 5d3605aa3..f56334e83 100644
--- a/tcl/board/vd_m4_dap.cfg
+++ b/tcl/board/vd_m4_dap.cfg
@@ -9,7 +9,7 @@ set MEMSTART 0x00000000
set MEMSIZE 0x10000
# vdebug select transport
-transport select dapdirect_swd
+transport select swd
adapter speed 25000
adapter srst delay 5
diff --git a/tcl/interface/nulink.cfg b/tcl/interface/nulink.cfg
index 48dc20e24..be68347e7 100644
--- a/tcl/interface/nulink.cfg
+++ b/tcl/interface/nulink.cfg
@@ -10,4 +10,4 @@ hla device_desc "Nu-Link"
hla vid_pid 0x0416 0x511b 0x0416 0x511c 0x0416 0x511d 0x0416 0x5200 0x0416 0x5201
# Only swd is supported
-transport select hla_swd
+transport select swd
diff --git a/tcl/interface/rshim.cfg b/tcl/interface/rshim.cfg
index 1d5da593e..327212f68 100644
--- a/tcl/interface/rshim.cfg
+++ b/tcl/interface/rshim.cfg
@@ -5,4 +5,4 @@
#
adapter driver rshim
-transport select dapdirect_swd
+transport select swd
diff --git a/tcl/interface/stlink.cfg b/tcl/interface/stlink.cfg
index 99c81c180..962d192ec 100644
--- a/tcl/interface/stlink.cfg
+++ b/tcl/interface/stlink.cfg
@@ -13,8 +13,8 @@
adapter driver st-link
st-link vid_pid 0x0483 0x3744 0x0483 0x3748 0x0483 0x374b 0x0483 0x374d 0x0483 0x374e 0x0483 0x374f 0x0483 0x3752 0x0483 0x3753 0x0483 0x3754 0x0483 0x3755 0x0483 0x3757
-# transport select dapdirect_jtag
-# transport select dapdirect_swd
+# transport select jtag
+# transport select swd
# transport select swim
# Optionally specify the serial number of usb device
-----------------------------------------------------------------------
Summary of changes:
tcl/board/ek-lm4f120xl.cfg | 2 +-
tcl/board/ek-lm4f232.cfg | 2 +-
tcl/board/st_b-l475e-iot01a.cfg | 2 +-
tcl/board/st_nucleo_f0.cfg | 2 +-
tcl/board/st_nucleo_f103rb.cfg | 2 +-
tcl/board/st_nucleo_f3.cfg | 2 +-
tcl/board/st_nucleo_f4.cfg | 2 +-
tcl/board/st_nucleo_f7.cfg | 2 +-
tcl/board/st_nucleo_g0.cfg | 2 +-
tcl/board/st_nucleo_g4.cfg | 2 +-
tcl/board/st_nucleo_h743zi.cfg | 2 +-
tcl/board/st_nucleo_h745zi.cfg | 2 +-
tcl/board/st_nucleo_l073rz.cfg | 2 +-
tcl/board/st_nucleo_l1.cfg | 2 +-
tcl/board/st_nucleo_l4.cfg | 2 +-
tcl/board/st_nucleo_l5.cfg | 2 +-
tcl/board/st_nucleo_wb55.cfg | 2 +-
tcl/board/stm320518_eval_stlink.cfg | 2 +-
tcl/board/stm3220g_eval_stlink.cfg | 2 +-
tcl/board/stm3241g_eval_stlink.cfg | 2 +-
tcl/board/stm32429i_eval_stlink.cfg | 2 +-
tcl/board/stm32439i_eval_stlink.cfg | 2 +-
tcl/board/stm32f0discovery.cfg | 2 +-
tcl/board/stm32f3discovery.cfg | 2 +-
tcl/board/stm32f412g-disco.cfg | 2 +-
tcl/board/stm32f413h-disco.cfg | 2 +-
tcl/board/stm32f429disc1.cfg | 2 +-
tcl/board/stm32f429discovery.cfg | 2 +-
tcl/board/stm32f469discovery.cfg | 2 +-
tcl/board/stm32f469i-disco.cfg | 2 +-
tcl/board/stm32f4discovery.cfg | 2 +-
tcl/board/stm32f723e-disco.cfg | 2 +-
tcl/board/stm32f746g-disco.cfg | 2 +-
tcl/board/stm32f769i-disco.cfg | 2 +-
tcl/board/stm32f7discovery.cfg | 2 +-
tcl/board/stm32h735g-disco.cfg | 2 +-
tcl/board/stm32h745i-disco.cfg | 2 +-
tcl/board/stm32h747i-disco.cfg | 2 +-
tcl/board/stm32h750b-disco.cfg | 2 +-
tcl/board/stm32h7b3i-disco.cfg | 2 +-
tcl/board/stm32h7x3i_eval.cfg | 2 +-
tcl/board/stm32l0discovery.cfg | 2 +-
tcl/board/stm32l476g-disco.cfg | 2 +-
tcl/board/stm32l496g-disco.cfg | 2 +-
tcl/board/stm32l4discovery.cfg | 2 +-
tcl/board/stm32l4p5g-disco.cfg | 2 +-
tcl/board/stm32l4r9i-disco.cfg | 2 +-
tcl/board/stm32ldiscovery.cfg | 2 +-
tcl/board/stm32mp13x_dk.cfg | 2 +-
tcl/board/stm32mp15x_dk2.cfg | 2 +-
tcl/board/stm32vldiscovery.cfg | 2 +-
tcl/board/ti_dk-tm4c129.cfg | 2 +-
tcl/board/ti_ek-tm4c123gxl.cfg | 2 +-
tcl/board/ti_ek-tm4c1294xl.cfg | 2 +-
tcl/board/vd_a53x2_dap.cfg | 2 +-
tcl/board/vd_a75x4_dap.cfg | 2 +-
tcl/board/vd_m4_dap.cfg | 2 +-
tcl/interface/nulink.cfg | 2 +-
tcl/interface/rshim.cfg | 2 +-
tcl/interface/stlink.cfg | 4 ++--
60 files changed, 61 insertions(+), 61 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:29:11
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via c1c4d489df4bbbc2902c0e4ef744157994f1b22a (commit)
from 98c09dc257739440f25f5cd23ca9bbd495e5742a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit c1c4d489df4bbbc2902c0e4ef744157994f1b22a
Author: Antonio Borneo <bor...@gm...>
Date: Wed Feb 12 16:30:46 2025 +0100
transport: allow transport name jtag/swd for hla and dapdirect
The transport used on adapter's wires is either 'jtag' or 'swd'
but, depending on the adapter, in the command 'transport select'
we have to use either 'jtag' or 'swd' or the similar 'hla_jtag',
'hla_swd', 'dapdirect_jtag' or 'dapdirect_swd'.
This becomes cumbersome when we just want to change adapter and we
get forced to modify the 'transport select' command too.
There is no reason for an adapter driver to support two of the
similar transports. In fact 'dapdirect' one is a superset of the
'hla', and the native 'jtag' or 'swd' is a superset of the
'dapdirect' one.
While the adapter could support more than one similar transports,
its adapter driver should only support the most complete of these
similar transports.
Modify the 'transport select' code to accept 'jtag' or 'swd' for
the 'dapdirect' and the 'hla' adapters too.
Issue a deprecated message for the old 'dapdirect' and 'hla'
transport names.
In command 'transport list', print only the transport names that
can be selected through 'transport select' skipping information
about 'dapdirect' and 'hla' versions and avoid duplicated entries.
This improvement was listed in the TODO file. Update it!
Change-Id: I626b50e7a94c141c042eab388cd1ffe77eb864c2
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8677
Tested-by: jenkins
diff --git a/README b/README
index fba758cfe..d9cc8f3eb 100644
--- a/README
+++ b/README
@@ -42,7 +42,7 @@ openocd -f interface/ftdi/jtagkey2.cfg -c "transport select jtag" \
```
```
-openocd -f interface/stlink.cfg -c "transport select hla_swd" \
+openocd -f interface/stlink.cfg -c "transport select swd" \
-f target/stm32l0.cfg
```
diff --git a/TODO b/TODO
index e4dded0ce..239b358f5 100644
--- a/TODO
+++ b/TODO
@@ -60,8 +60,6 @@ changes pending in gerrit.
to replicate it in the drivers, apart in case the driver sets TRST
independently
- add .hla_ops to "adapter"
-- HLA is a API level (.hla_ops). Transport should simply be {jtag,swd},
- not {hla_jtag,hla_swd}.
@subsection thelistadapterjtagcore JTAG Core
diff --git a/doc/openocd.texi b/doc/openocd.texi
index d85812824..f557a55fe 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -3783,10 +3783,8 @@ JTAG supports both debugging and boundary scan testing.
Flash programming support is built on top of debug support.
JTAG transport is selected with the command @command{transport select
-jtag}. Unless your adapter uses either @ref{hla_interface,the hla interface
-driver} (in which case the command is @command{transport select hla_jtag})
-or @ref{st_link_dap_interface,the st-link interface driver} (in which case
-the command is @command{transport select dapdirect_jtag}).
+jtag}. This command has to be used also for @ref{hla_interface,the hla interface
+driver} and @ref{st_link_dap_interface,the st-link interface driver}.
@subsection SWD Transport
@cindex SWD
@@ -3799,10 +3797,8 @@ Flash programming support is built on top of debug support.
(Some processors support both JTAG and SWD.)
SWD transport is selected with the command @command{transport select
-swd}. Unless your adapter uses either @ref{hla_interface,the hla interface
-driver} (in which case the command is @command{transport select hla_swd})
-or @ref{st_link_dap_interface,the st-link interface driver} (in which case
-the command is @command{transport select dapdirect_swd}).
+swd}. This command has to be used also for @ref{hla_interface,the hla interface
+driver} and @ref{st_link_dap_interface,the st-link interface driver}.
@deffn {Config Command} {swd newdap} ...
Declares a single DAP which uses SWD transport.
@@ -10889,7 +10885,7 @@ baud with our custom divisor to get 12MHz)
@item OpenOCD invocation line:
@example
openocd -f interface/stlink.cfg \
--c "transport select dapdirect_swd" \
+-c "transport select swd" \
-f target/stm32l1.cfg \
-c "stm32l1.tpiu configure -protocol uart" \
-c "stm32l1.tpiu configure -traceclk 24000000 -pin-freq 12000000" \
diff --git a/src/transport/transport.c b/src/transport/transport.c
index 755e21054..ab5be490f 100644
--- a/src/transport/transport.c
+++ b/src/transport/transport.c
@@ -49,14 +49,16 @@ extern struct command_context *global_cmd_ctx;
static const struct {
unsigned int id;
const char *name;
+ const char *full_name;
+ const char *deprecated_name;
} transport_names[] = {
- { TRANSPORT_JTAG, "jtag", },
- { TRANSPORT_SWD, "swd", },
- { TRANSPORT_HLA_JTAG, "hla_jtag", },
- { TRANSPORT_HLA_SWD, "hla_swd", },
- { TRANSPORT_DAPDIRECT_JTAG, "dapdirect_jtag", },
- { TRANSPORT_DAPDIRECT_SWD, "dapdirect_swd", },
- { TRANSPORT_SWIM, "swim", },
+ { TRANSPORT_JTAG, "jtag", "jtag", NULL, },
+ { TRANSPORT_SWD, "swd", "swd", NULL, },
+ { TRANSPORT_HLA_JTAG, "jtag", "jtag (hla)", "hla_jtag", },
+ { TRANSPORT_HLA_SWD, "swd", "swd (hla)", "hla_swd", },
+ { TRANSPORT_DAPDIRECT_JTAG, "jtag", "jtag (dapdirect)", "dapdirect_jtag", },
+ { TRANSPORT_DAPDIRECT_SWD, "swd", "swd (dapdirect)", "dapdirect_swd", },
+ { TRANSPORT_SWIM, "swim", "swim", NULL, },
};
/** List of transports registered in OpenOCD, alphabetically sorted per name. */
@@ -90,18 +92,36 @@ const char *transport_name(unsigned int id)
return NULL;
}
+static const char *transport_full_name(unsigned int id)
+{
+ for (unsigned int i = 0; i < ARRAY_SIZE(transport_names); i++)
+ if (id == transport_names[i].id)
+ return transport_names[i].full_name;
+
+ return NULL;
+}
+
+static const char *transport_deprecated_name(unsigned int id)
+{
+ for (unsigned int i = 0; i < ARRAY_SIZE(transport_names); i++)
+ if (id == transport_names[i].id)
+ return transport_names[i].deprecated_name;
+
+ return NULL;
+}
+
static bool is_transport_id_valid(unsigned int id)
{
return (id != 0) && ((id & ~TRANSPORT_VALID_MASK) == 0) && IS_PWR_OF_2(id);
}
-static int transport_select(struct command_context *ctx, const char *name)
+static int transport_select(struct command_context *ctx, unsigned int transport_id)
{
/* name may only identify a known transport;
* caller guarantees session's transport isn't yet set.*/
struct transport *t;
list_for_each_entry(t, &transport_list, lh) {
- if (!strcmp(transport_name(t->id), name)) {
+ if (t->id == transport_id) {
int retval = t->select(ctx);
/* select() registers commands specific to this
* transport, and may also reset the link, e.g.
@@ -110,12 +130,14 @@ static int transport_select(struct command_context *ctx, const char *name)
if (retval == ERROR_OK)
session = t;
else
- LOG_ERROR("Error selecting '%s' as transport", name);
+ LOG_ERROR("Error selecting '%s' as transport",
+ transport_full_name(transport_id));
return retval;
}
}
- LOG_ERROR("No transport named '%s' is available.", name);
+ LOG_ERROR("No transport named '%s' is available.",
+ transport_full_name(transport_id));
return ERROR_FAIL;
}
@@ -165,7 +187,7 @@ int allow_transports(struct command_context *ctx, unsigned int transport_ids,
if (IS_PWR_OF_2(transport_ids)) {
LOG_DEBUG("only one transport option; autoselecting '%s'", transport_name(transport_ids));
transport_single_is_autoselected = true;
- return transport_select(ctx, transport_name(transport_ids));
+ return transport_select(ctx, transport_ids);
}
return ERROR_OK;
@@ -205,7 +227,7 @@ int transport_register(struct transport *new_transport)
if (!new_transport->select || !new_transport->init)
LOG_ERROR("invalid transport %s",
- transport_name(new_transport->id));
+ transport_full_name(new_transport->id));
/* splice this into the list, sorted in alphabetic order */
list_for_each_entry(t, &transport_list, lh) {
@@ -216,7 +238,7 @@ int transport_register(struct transport *new_transport)
list_add_tail(&new_transport->lh, &t->lh);
LOG_DEBUG("register '%s' (ID %d)",
- transport_name(new_transport->id), new_transport->id);
+ transport_full_name(new_transport->id), new_transport->id);
return ERROR_OK;
}
@@ -238,7 +260,7 @@ const char *get_current_transport_name(void)
if (!session || !is_transport_id_valid(session->id))
NULL;
- return transport_name(session->id);
+ return transport_full_name(session->id);
}
/*-----------------------------------------------------------------------*/
@@ -257,7 +279,7 @@ COMMAND_HANDLER(handle_transport_init)
LOG_ERROR("Transports available:");
for (unsigned int i = BIT(0); i & TRANSPORT_VALID_MASK; i <<= 1) {
if (i & allowed_transports)
- LOG_ERROR("%s", transport_name(i));
+ LOG_ERROR("%s", transport_full_name(i));
}
return ERROR_FAIL;
}
@@ -265,7 +287,7 @@ COMMAND_HANDLER(handle_transport_init)
if (transport_single_is_autoselected)
LOG_WARNING("DEPRECATED: auto-selecting transport \"%s\". "
"Use 'transport select %s' to suppress this message.",
- transport_name(session->id), transport_name(session->id));
+ transport_full_name(session->id), transport_name(session->id));
return session->init(CMD_CTX);
}
@@ -278,8 +300,14 @@ COMMAND_HANDLER(handle_transport_list)
command_print(CMD, "The following transports are available:");
struct transport *t;
- list_for_each_entry(t, &transport_list, lh)
- command_print(CMD, "\t%s", transport_name(t->id));
+ const char *prev_name = NULL;
+ /* list is sorted, don't print duplicated transport names */
+ list_for_each_entry(t, &transport_list, lh) {
+ const char *name = transport_name(t->id);
+ if (!prev_name || strcmp(prev_name, name))
+ command_print(CMD, "\t%s", name);
+ prev_name = name;
+ }
return ERROR_OK;
}
@@ -304,19 +332,21 @@ COMMAND_HANDLER(handle_transport_select)
}
LOG_WARNING("DEPRECATED: auto-selecting transport \"%s\". "
"Use 'transport select %s' to suppress this message.",
- transport_name(preferred_transport),
+ transport_full_name(preferred_transport),
transport_name(preferred_transport));
- int retval = transport_select(CMD_CTX, transport_name(preferred_transport));
+ int retval = transport_select(CMD_CTX, preferred_transport);
if (retval != ERROR_OK)
return retval;
}
- command_print(CMD, "%s", transport_name(session->id));
+ command_print(CMD, "%s", transport_full_name(session->id));
return ERROR_OK;
}
/* assign transport */
if (session) {
- if (!strcmp(transport_name(session->id), CMD_ARGV[0])) {
+ if (!strcmp(transport_name(session->id), CMD_ARGV[0])
+ || (transport_deprecated_name(session->id)
+ && !strcmp(transport_deprecated_name(session->id), CMD_ARGV[0]))) {
if (transport_single_is_autoselected) {
/* Nothing to do, but also nothing to complain */
transport_single_is_autoselected = false;
@@ -341,12 +371,17 @@ COMMAND_HANDLER(handle_transport_select)
}
for (unsigned int i = BIT(0); i & TRANSPORT_VALID_MASK; i <<= 1) {
- if ((i & allowed_transports)
- && !strcmp(transport_name(i), CMD_ARGV[0])) {
- int retval = transport_select(CMD_CTX, CMD_ARGV[0]);
- if (retval != ERROR_OK)
- return retval;
- return ERROR_OK;
+ if (!(i & allowed_transports))
+ continue;
+
+ if (!strcmp(transport_name(i), CMD_ARGV[0]))
+ return transport_select(CMD_CTX, i);
+
+ if (transport_deprecated_name(i)
+ && !strcmp(transport_deprecated_name(i), CMD_ARGV[0])) {
+ LOG_WARNING("DEPRECATED! use 'transport select %s', not 'transport select %s'",
+ transport_name(i), transport_deprecated_name(i));
+ return transport_select(CMD_CTX, i);
}
}
-----------------------------------------------------------------------
Summary of changes:
README | 2 +-
TODO | 2 -
doc/openocd.texi | 14 +++----
src/transport/transport.c | 93 ++++++++++++++++++++++++++++++++---------------
4 files changed, 70 insertions(+), 41 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:28:25
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 98c09dc257739440f25f5cd23ca9bbd495e5742a (commit)
from 9643379d30fee381e92200ef9ed0caaeae580dad (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 98c09dc257739440f25f5cd23ca9bbd495e5742a
Author: Antonio Borneo <bor...@gm...>
Date: Tue Dec 31 17:01:41 2024 +0100
transport: store the transports sorted by alphabetic name order
While this operation has no real interest so far, it will be used
later to avoid listing twice protocols with the same name.
Change-Id: I59f3634830f94dc992d28863cf29d5d869726918
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8685
Tested-by: jenkins
Reviewed-by: zapb <de...@za...>
diff --git a/src/transport/transport.c b/src/transport/transport.c
index 8a210fe94..755e21054 100644
--- a/src/transport/transport.c
+++ b/src/transport/transport.c
@@ -59,7 +59,7 @@ static const struct {
{ TRANSPORT_SWIM, "swim", },
};
-/** List of transports registered in OpenOCD. */
+/** List of transports registered in OpenOCD, alphabetically sorted per name. */
static OOCD_LIST_HEAD(transport_list);
/**
@@ -207,8 +207,14 @@ int transport_register(struct transport *new_transport)
LOG_ERROR("invalid transport %s",
transport_name(new_transport->id));
- /* splice this into the list */
- list_add(&new_transport->lh, &transport_list);
+ /* splice this into the list, sorted in alphabetic order */
+ list_for_each_entry(t, &transport_list, lh) {
+ if (strcmp(transport_name(t->id),
+ transport_name(new_transport->id)) >= 0)
+ break;
+ }
+ list_add_tail(&new_transport->lh, &t->lh);
+
LOG_DEBUG("register '%s' (ID %d)",
transport_name(new_transport->id), new_transport->id);
-----------------------------------------------------------------------
Summary of changes:
src/transport/transport.c | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:27:42
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 9643379d30fee381e92200ef9ed0caaeae580dad (commit)
via 8485eb141554851d6cfcf6faf47c5934d13bf040 (commit)
from a500b2ce67eb80870dfbd5d73118e822ac99ef88 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 9643379d30fee381e92200ef9ed0caaeae580dad
Author: Antonio Borneo <bor...@gm...>
Date: Tue Dec 31 16:29:46 2024 +0100
transport: use helper/list.h for the list of transports
No behavioral change, just use the list's helpers.
Change-Id: I69712648ef77689bfe6acc4811adad7293fb9009
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8684
Reviewed-by: zapb <de...@za...>
Tested-by: jenkins
diff --git a/src/transport/transport.c b/src/transport/transport.c
index 59f76ad31..8a210fe94 100644
--- a/src/transport/transport.c
+++ b/src/transport/transport.c
@@ -32,6 +32,7 @@
#include <helper/align.h>
#include <helper/bits.h>
+#include <helper/list.h>
#include <helper/log.h>
#include <helper/replacements.h>
#include <transport/transport.h>
@@ -59,7 +60,7 @@ static const struct {
};
/** List of transports registered in OpenOCD. */
-static struct transport *transport_list;
+static OOCD_LIST_HEAD(transport_list);
/**
* Bitmask of transport IDs which the currently selected debug adapter supports.
@@ -98,7 +99,8 @@ static int transport_select(struct command_context *ctx, const char *name)
{
/* name may only identify a known transport;
* caller guarantees session's transport isn't yet set.*/
- for (struct transport *t = transport_list; t; t = t->next) {
+ struct transport *t;
+ list_for_each_entry(t, &transport_list, lh) {
if (!strcmp(transport_name(t->id), name)) {
int retval = t->select(ctx);
/* select() registers commands specific to this
@@ -193,7 +195,7 @@ int transport_register(struct transport *new_transport)
return ERROR_FAIL;
}
- for (t = transport_list; t; t = t->next) {
+ list_for_each_entry(t, &transport_list, lh) {
if (t->id == new_transport->id) {
LOG_ERROR("transport '%s' already registered",
transport_name(t->id));
@@ -206,8 +208,7 @@ int transport_register(struct transport *new_transport)
transport_name(new_transport->id));
/* splice this into the list */
- new_transport->next = transport_list;
- transport_list = new_transport;
+ list_add(&new_transport->lh, &transport_list);
LOG_DEBUG("register '%s' (ID %d)",
transport_name(new_transport->id), new_transport->id);
@@ -270,7 +271,8 @@ COMMAND_HANDLER(handle_transport_list)
command_print(CMD, "The following transports are available:");
- for (struct transport *t = transport_list; t; t = t->next)
+ struct transport *t;
+ list_for_each_entry(t, &transport_list, lh)
command_print(CMD, "\t%s", transport_name(t->id));
return ERROR_OK;
diff --git a/src/transport/transport.h b/src/transport/transport.h
index f6f0f4f4d..5445bcf3b 100644
--- a/src/transport/transport.h
+++ b/src/transport/transport.h
@@ -14,6 +14,7 @@
#include "helper/bits.h"
#include "helper/command.h"
+#include "helper/list.h"
#define TRANSPORT_JTAG BIT(0)
#define TRANSPORT_SWD BIT(1)
@@ -84,9 +85,9 @@ struct transport {
int (*override_target)(const char **targetname);
/**
- * Transports are stored in a singly linked list.
+ * Transports are stored in a linked list.
*/
- struct transport *next;
+ struct list_head lh;
};
int transport_register(struct transport *new_transport);
commit 8485eb141554851d6cfcf6faf47c5934d13bf040
Author: Antonio Borneo <bor...@gm...>
Date: Sun Dec 22 23:59:19 2024 +0100
transport: validate the transport id's from the driver
Verify that it contains only valid transports.
While JTAG and SWD are the more permissive transports, the
respective 'dapdirect' versions are slightly limited, and the
respective 'hla' versions are even more limited.
A driver should not provide two version of the same transport.
Verify that only one JTAG and only one SWD transport is present.
Verify that the preferred transport is valid too.
Change-Id: Iace2f881dd65fc763e81b33e6a7113961a7008af
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8676
Tested-by: jenkins
Reviewed-by: zapb <de...@za...>
Reviewed-by: Jan Matyas <jan...@co...>
diff --git a/src/transport/transport.c b/src/transport/transport.c
index b7a3913cc..59f76ad31 100644
--- a/src/transport/transport.c
+++ b/src/transport/transport.c
@@ -125,21 +125,37 @@ static int transport_select(struct command_context *ctx, const char *name)
int allow_transports(struct command_context *ctx, unsigned int transport_ids,
unsigned int transport_preferred_id)
{
- /* NOTE: caller is required to provide only a list
- * of *valid* transports
- *
- * REVISIT should we validate that? and insist there's
- * at least one valid element in that list?
- *
- * ... allow removals, e.g. external strapping prevents use
- * of one transport; C code should be definitive about what
- * can be used when all goes well.
- */
if (allowed_transports || session) {
LOG_ERROR("Can't modify the set of allowed transports.");
return ERROR_FAIL;
}
+ /* validate the values in transport_ids and transport_preferred_id */
+ if (transport_ids == 0 || (transport_ids & ~TRANSPORT_VALID_MASK) != 0) {
+ LOG_ERROR("BUG: Unknown transport IDs %lu", transport_ids & ~TRANSPORT_VALID_MASK);
+ return ERROR_FAIL;
+ }
+
+ if ((transport_ids & transport_preferred_id) == 0
+ || !IS_PWR_OF_2(transport_preferred_id)) {
+ LOG_ERROR("BUG: Invalid adapter transport_preferred_id");
+ return ERROR_FAIL;
+ }
+
+ unsigned int mask = transport_ids &
+ (TRANSPORT_JTAG | TRANSPORT_HLA_JTAG | TRANSPORT_DAPDIRECT_JTAG);
+ if (mask && !IS_PWR_OF_2(mask)) {
+ LOG_ERROR("BUG: Multiple JTAG transports");
+ return ERROR_FAIL;
+ }
+
+ mask = transport_ids &
+ (TRANSPORT_SWD | TRANSPORT_HLA_SWD | TRANSPORT_DAPDIRECT_SWD);
+ if (mask && !IS_PWR_OF_2(mask)) {
+ LOG_ERROR("BUG: Multiple SWD transports");
+ return ERROR_FAIL;
+ }
+
allowed_transports = transport_ids;
preferred_transport = transport_preferred_id;
-----------------------------------------------------------------------
Summary of changes:
src/transport/transport.c | 50 ++++++++++++++++++++++++++++++++---------------
src/transport/transport.h | 5 +++--
2 files changed, 37 insertions(+), 18 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:27:08
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via a500b2ce67eb80870dfbd5d73118e822ac99ef88 (commit)
via 236208a5ff2db5f502444b32da1df3fd17b692fb (commit)
via 9a5de74423503d1bd16e16b77b4e0e6d19913057 (commit)
from da50873d5ebe558ee545c1a00f31df9e23f45456 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit a500b2ce67eb80870dfbd5d73118e822ac99ef88
Author: Antonio Borneo <bor...@gm...>
Date: Wed Feb 12 16:39:18 2025 +0100
adapter: use bitmask for driver's transports
In every driver, replace the array of strings with a bitmask that
lists the supported transports.
Add an extra field to carry the former first listed transport as a
"preferred" transport. It would be used as default when no command
'transport select' is used. This keeps backward compatibility with
scripts that do not define the transport, relying on such default.
Change-Id: I4976583f1a38fdcc1f85045023dc7c629001f743
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8675
Tested-by: jenkins
Reviewed-by: zapb <de...@za...>
diff --git a/src/jtag/adapter.c b/src/jtag/adapter.c
index 694721746..6785a74ef 100644
--- a/src/jtag/adapter.c
+++ b/src/jtag/adapter.c
@@ -16,6 +16,7 @@
#include "minidriver.h"
#include "interface.h"
#include "interfaces.h"
+#include <helper/bits.h>
#include <transport/transport.h>
/**
@@ -24,7 +25,6 @@
*/
struct adapter_driver *adapter_driver;
-const char * const jtag_only[] = { "jtag", NULL };
enum adapter_clk_mode {
CLOCK_MODE_UNSELECTED = 0,
@@ -402,11 +402,12 @@ COMMAND_HANDLER(dump_adapter_driver_list)
for (unsigned int i = 0; adapter_drivers[i]; i++) {
const char *name = adapter_drivers[i]->name;
- const char * const *transports = adapter_drivers[i]->transports;
+ unsigned int transport_ids = adapter_drivers[i]->transport_ids;
command_print_sameline(CMD, "%-*s {", max_len, name);
- for (unsigned int j = 0; transports[j]; j++)
- command_print_sameline(CMD, " %s", transports[j]);
+ for (unsigned int j = BIT(0); j & TRANSPORT_VALID_MASK; j <<= 1)
+ if (j & transport_ids)
+ command_print_sameline(CMD, " %s", transport_name(j));
command_print(CMD, " }");
}
@@ -447,7 +448,8 @@ COMMAND_HANDLER(handle_adapter_driver_command)
adapter_driver = adapter_drivers[i];
- return allow_transports(CMD_CTX, adapter_driver->transports);
+ return allow_transports(CMD_CTX, adapter_driver->transport_ids,
+ adapter_driver->transport_preferred_id);
}
/* no valid adapter driver was found (i.e. the configuration option,
diff --git a/src/jtag/drivers/am335xgpio.c b/src/jtag/drivers/am335xgpio.c
index cacf4e7c7..a4727cc89 100644
--- a/src/jtag/drivers/am335xgpio.c
+++ b/src/jtag/drivers/am335xgpio.c
@@ -350,8 +350,6 @@ static const struct command_registration am335xgpio_command_handlers[] = {
COMMAND_REGISTRATION_DONE
};
-static const char * const am335xgpio_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface am335xgpio_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
@@ -494,7 +492,8 @@ static int am335xgpio_quit(void)
struct adapter_driver am335xgpio_adapter_driver = {
.name = "am335xgpio",
- .transports = am335xgpio_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = am335xgpio_command_handlers,
.init = am335xgpio_init,
diff --git a/src/jtag/drivers/amt_jtagaccel.c b/src/jtag/drivers/amt_jtagaccel.c
index 80254ff07..633c20413 100644
--- a/src/jtag/drivers/amt_jtagaccel.c
+++ b/src/jtag/drivers/amt_jtagaccel.c
@@ -579,7 +579,8 @@ static struct jtag_interface amt_jtagaccel_interface = {
struct adapter_driver amt_jtagaccel_adapter_driver = {
.name = "amt_jtagaccel",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = amtjtagaccel_command_handlers,
.init = amt_jtagaccel_init,
diff --git a/src/jtag/drivers/angie.c b/src/jtag/drivers/angie.c
index 46a4c82e5..56a118eae 100644
--- a/src/jtag/drivers/angie.c
+++ b/src/jtag/drivers/angie.c
@@ -2388,7 +2388,8 @@ static struct jtag_interface angie_interface = {
struct adapter_driver angie_adapter_driver = {
.name = "angie",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = angie_init,
.quit = angie_quit,
diff --git a/src/jtag/drivers/arm-jtag-ew.c b/src/jtag/drivers/arm-jtag-ew.c
index 45e03840e..9d8c592ed 100644
--- a/src/jtag/drivers/arm-jtag-ew.c
+++ b/src/jtag/drivers/arm-jtag-ew.c
@@ -486,7 +486,8 @@ static struct jtag_interface armjtagew_interface = {
struct adapter_driver armjtagew_adapter_driver = {
.name = "arm-jtag-ew",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = armjtagew_command_handlers,
.init = armjtagew_init,
diff --git a/src/jtag/drivers/at91rm9200.c b/src/jtag/drivers/at91rm9200.c
index a77e29aa6..ddcf857a6 100644
--- a/src/jtag/drivers/at91rm9200.c
+++ b/src/jtag/drivers/at91rm9200.c
@@ -186,7 +186,8 @@ static struct jtag_interface at91rm9200_interface = {
struct adapter_driver at91rm9200_adapter_driver = {
.name = "at91rm9200",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = at91rm9200_command_handlers,
.init = at91rm9200_init,
diff --git a/src/jtag/drivers/bcm2835gpio.c b/src/jtag/drivers/bcm2835gpio.c
index e8689aa03..1a105aac4 100644
--- a/src/jtag/drivers/bcm2835gpio.c
+++ b/src/jtag/drivers/bcm2835gpio.c
@@ -590,15 +590,14 @@ static int bcm2835gpio_quit(void)
}
-static const char * const bcm2835_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface bcm2835gpio_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
};
struct adapter_driver bcm2835gpio_adapter_driver = {
.name = "bcm2835gpio",
- .transports = bcm2835_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = bcm2835gpio_command_handlers,
.init = bcm2835gpio_init,
diff --git a/src/jtag/drivers/buspirate.c b/src/jtag/drivers/buspirate.c
index 93f0ba383..4283616ad 100644
--- a/src/jtag/drivers/buspirate.c
+++ b/src/jtag/drivers/buspirate.c
@@ -534,15 +534,14 @@ static const struct swd_driver buspirate_swd = {
.run = buspirate_swd_run_queue,
};
-static const char * const buspirate_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface buspirate_interface = {
.execute_queue = buspirate_execute_queue,
};
struct adapter_driver buspirate_adapter_driver = {
.name = "buspirate",
- .transports = buspirate_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = buspirate_command_handlers,
.init = buspirate_init,
diff --git a/src/jtag/drivers/cmsis_dap.c b/src/jtag/drivers/cmsis_dap.c
index be9ebaed5..2bfcfcc2b 100644
--- a/src/jtag/drivers/cmsis_dap.c
+++ b/src/jtag/drivers/cmsis_dap.c
@@ -2314,8 +2314,6 @@ static const struct swd_driver cmsis_dap_swd_driver = {
.run = cmsis_dap_swd_run_queue,
};
-static const char * const cmsis_dap_transport[] = { "swd", "jtag", NULL };
-
static struct jtag_interface cmsis_dap_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = cmsis_dap_execute_queue,
@@ -2323,7 +2321,8 @@ static struct jtag_interface cmsis_dap_interface = {
struct adapter_driver cmsis_dap_adapter_driver = {
.name = "cmsis-dap",
- .transports = cmsis_dap_transport,
+ .transport_ids = TRANSPORT_SWD | TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_SWD,
.commands = cmsis_dap_command_handlers,
.init = cmsis_dap_init,
diff --git a/src/jtag/drivers/dmem.c b/src/jtag/drivers/dmem.c
index 4dc582115..e50e84aee 100644
--- a/src/jtag/drivers/dmem.c
+++ b/src/jtag/drivers/dmem.c
@@ -604,11 +604,10 @@ static const struct dap_ops dmem_dap_ops = {
.run = dmem_dp_run,
};
-static const char *const dmem_dap_transport[] = { "dapdirect_swd", NULL };
-
struct adapter_driver dmem_dap_adapter_driver = {
.name = "dmem",
- .transports = dmem_dap_transport,
+ .transport_ids = TRANSPORT_DAPDIRECT_SWD,
+ .transport_preferred_id = TRANSPORT_DAPDIRECT_SWD,
.commands = dmem_dap_command_handlers,
.init = dmem_dap_init,
diff --git a/src/jtag/drivers/dummy.c b/src/jtag/drivers/dummy.c
index 79b29fbae..471668c3a 100644
--- a/src/jtag/drivers/dummy.c
+++ b/src/jtag/drivers/dummy.c
@@ -140,7 +140,8 @@ static struct jtag_interface dummy_interface = {
struct adapter_driver dummy_adapter_driver = {
.name = "dummy",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = dummy_command_handlers,
.init = &dummy_init,
diff --git a/src/jtag/drivers/ep93xx.c b/src/jtag/drivers/ep93xx.c
index ea9faf19b..f3e1676f9 100644
--- a/src/jtag/drivers/ep93xx.c
+++ b/src/jtag/drivers/ep93xx.c
@@ -46,7 +46,8 @@ static struct jtag_interface ep93xx_interface = {
struct adapter_driver ep93xx_adapter_driver = {
.name = "ep93xx",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = ep93xx_init,
.quit = ep93xx_quit,
diff --git a/src/jtag/drivers/esp_usb_jtag.c b/src/jtag/drivers/esp_usb_jtag.c
index 950405954..a13303511 100644
--- a/src/jtag/drivers/esp_usb_jtag.c
+++ b/src/jtag/drivers/esp_usb_jtag.c
@@ -784,7 +784,8 @@ static struct jtag_interface esp_usb_jtag_interface = {
struct adapter_driver esp_usb_adapter_driver = {
.name = "esp_usb_jtag",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = esp_usb_jtag_commands,
.init = esp_usb_jtag_init,
diff --git a/src/jtag/drivers/ft232r.c b/src/jtag/drivers/ft232r.c
index f4e5af4dd..f88e4b940 100644
--- a/src/jtag/drivers/ft232r.c
+++ b/src/jtag/drivers/ft232r.c
@@ -900,7 +900,8 @@ static struct jtag_interface ft232r_interface = {
struct adapter_driver ft232r_adapter_driver = {
.name = "ft232r",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = ft232r_command_handlers,
.init = ft232r_init,
diff --git a/src/jtag/drivers/ftdi.c b/src/jtag/drivers/ftdi.c
index ec0ae4c00..a8f6f6015 100644
--- a/src/jtag/drivers/ftdi.c
+++ b/src/jtag/drivers/ftdi.c
@@ -1247,8 +1247,6 @@ static const struct swd_driver ftdi_swd = {
.run = ftdi_swd_run_queue,
};
-static const char * const ftdi_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface ftdi_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = ftdi_execute_queue,
@@ -1256,7 +1254,8 @@ static struct jtag_interface ftdi_interface = {
struct adapter_driver ftdi_adapter_driver = {
.name = "ftdi",
- .transports = ftdi_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = ftdi_command_handlers,
.init = ftdi_initialize,
diff --git a/src/jtag/drivers/gw16012.c b/src/jtag/drivers/gw16012.c
index 7200e757c..805065f1f 100644
--- a/src/jtag/drivers/gw16012.c
+++ b/src/jtag/drivers/gw16012.c
@@ -514,7 +514,8 @@ static struct jtag_interface gw16012_interface = {
struct adapter_driver gw16012_adapter_driver = {
.name = "gw16012",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = gw16012_command_handlers,
.init = gw16012_init,
diff --git a/src/jtag/drivers/imx_gpio.c b/src/jtag/drivers/imx_gpio.c
index 18dc2ddf6..a4a76ca5a 100644
--- a/src/jtag/drivers/imx_gpio.c
+++ b/src/jtag/drivers/imx_gpio.c
@@ -417,8 +417,6 @@ static const struct command_registration imx_gpio_command_handlers[] = {
COMMAND_REGISTRATION_DONE
};
-static const char * const imx_gpio_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface imx_gpio_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
@@ -426,7 +424,8 @@ static struct jtag_interface imx_gpio_interface = {
struct adapter_driver imx_gpio_adapter_driver = {
.name = "imx_gpio",
- .transports = imx_gpio_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = imx_gpio_command_handlers,
.init = imx_gpio_init,
diff --git a/src/jtag/drivers/jlink.c b/src/jtag/drivers/jlink.c
index 4d15cf5e6..9caf37f6f 100644
--- a/src/jtag/drivers/jlink.c
+++ b/src/jtag/drivers/jlink.c
@@ -2264,15 +2264,14 @@ static const struct swd_driver jlink_swd = {
.run = &jlink_swd_run_queue,
};
-static const char * const jlink_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface jlink_interface = {
.execute_queue = &jlink_execute_queue,
};
struct adapter_driver jlink_adapter_driver = {
.name = "jlink",
- .transports = jlink_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = jlink_command_handlers,
.init = &jlink_init,
diff --git a/src/jtag/drivers/jtag_dpi.c b/src/jtag/drivers/jtag_dpi.c
index 046186a61..d6418d39c 100644
--- a/src/jtag/drivers/jtag_dpi.c
+++ b/src/jtag/drivers/jtag_dpi.c
@@ -398,7 +398,8 @@ static struct jtag_interface jtag_dpi_interface = {
struct adapter_driver jtag_dpi_adapter_driver = {
.name = "jtag_dpi",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = jtag_dpi_command_handlers,
.init = jtag_dpi_init,
.quit = jtag_dpi_quit,
diff --git a/src/jtag/drivers/jtag_vpi.c b/src/jtag/drivers/jtag_vpi.c
index f6cb3de5d..fac27b306 100644
--- a/src/jtag/drivers/jtag_vpi.c
+++ b/src/jtag/drivers/jtag_vpi.c
@@ -666,7 +666,8 @@ static struct jtag_interface jtag_vpi_interface = {
struct adapter_driver jtag_vpi_adapter_driver = {
.name = "jtag_vpi",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = jtag_vpi_command_handlers,
.init = jtag_vpi_init,
diff --git a/src/jtag/drivers/kitprog.c b/src/jtag/drivers/kitprog.c
index 98b0d1668..88e301ceb 100644
--- a/src/jtag/drivers/kitprog.c
+++ b/src/jtag/drivers/kitprog.c
@@ -908,11 +908,10 @@ static const struct swd_driver kitprog_swd = {
.run = kitprog_swd_run_queue,
};
-static const char * const kitprog_transports[] = { "swd", NULL };
-
struct adapter_driver kitprog_adapter_driver = {
.name = "kitprog",
- .transports = kitprog_transports,
+ .transport_ids = TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_SWD,
.commands = kitprog_command_handlers,
.init = kitprog_init,
diff --git a/src/jtag/drivers/linuxgpiod.c b/src/jtag/drivers/linuxgpiod.c
index eda7b1a80..36c7e0493 100644
--- a/src/jtag/drivers/linuxgpiod.c
+++ b/src/jtag/drivers/linuxgpiod.c
@@ -425,8 +425,6 @@ out_error:
return ERROR_JTAG_INIT_FAILED;
}
-static const char *const linuxgpiod_transport[] = { "swd", "jtag", NULL };
-
static struct jtag_interface linuxgpiod_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
@@ -434,7 +432,8 @@ static struct jtag_interface linuxgpiod_interface = {
struct adapter_driver linuxgpiod_adapter_driver = {
.name = "linuxgpiod",
- .transports = linuxgpiod_transport,
+ .transport_ids = TRANSPORT_SWD | TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_SWD,
.init = linuxgpiod_init,
.quit = linuxgpiod_quit,
diff --git a/src/jtag/drivers/linuxspidev.c b/src/jtag/drivers/linuxspidev.c
index 18abdc7db..396f1a19a 100644
--- a/src/jtag/drivers/linuxspidev.c
+++ b/src/jtag/drivers/linuxspidev.c
@@ -616,12 +616,10 @@ static const struct command_registration spidev_command_handlers[] = {
COMMAND_REGISTRATION_DONE
};
-// Only SWD transport supported
-static const char *const spidev_transports[] = { "swd", NULL };
-
struct adapter_driver linuxspidev_adapter_driver = {
.name = "linuxspidev",
- .transports = spidev_transports,
+ .transport_ids = TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_SWD,
.commands = spidev_command_handlers,
.init = spidev_init,
diff --git a/src/jtag/drivers/opendous.c b/src/jtag/drivers/opendous.c
index 999afb3fc..04626cb1e 100644
--- a/src/jtag/drivers/opendous.c
+++ b/src/jtag/drivers/opendous.c
@@ -229,7 +229,8 @@ static struct jtag_interface opendous_interface = {
struct adapter_driver opendous_adapter_driver = {
.name = "opendous",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = opendous_command_handlers,
.init = opendous_init,
diff --git a/src/jtag/drivers/openjtag.c b/src/jtag/drivers/openjtag.c
index 14bcc171e..943ad854e 100644
--- a/src/jtag/drivers/openjtag.c
+++ b/src/jtag/drivers/openjtag.c
@@ -931,7 +931,8 @@ static struct jtag_interface openjtag_interface = {
struct adapter_driver openjtag_adapter_driver = {
.name = "openjtag",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = openjtag_command_handlers,
.init = openjtag_init,
diff --git a/src/jtag/drivers/osbdm.c b/src/jtag/drivers/osbdm.c
index 80f66d197..de2e1f8eb 100644
--- a/src/jtag/drivers/osbdm.c
+++ b/src/jtag/drivers/osbdm.c
@@ -684,7 +684,8 @@ static struct jtag_interface osbdm_interface = {
struct adapter_driver osbdm_adapter_driver = {
.name = "osbdm",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = osbdm_init,
.quit = osbdm_quit,
diff --git a/src/jtag/drivers/parport.c b/src/jtag/drivers/parport.c
index 3b20fe247..143f3bde1 100644
--- a/src/jtag/drivers/parport.c
+++ b/src/jtag/drivers/parport.c
@@ -533,7 +533,8 @@ static struct jtag_interface parport_interface = {
struct adapter_driver parport_adapter_driver = {
.name = "parport",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = parport_command_handlers,
.init = parport_init,
diff --git a/src/jtag/drivers/presto.c b/src/jtag/drivers/presto.c
index f6e13f7eb..84b881cdc 100644
--- a/src/jtag/drivers/presto.c
+++ b/src/jtag/drivers/presto.c
@@ -528,7 +528,8 @@ static struct jtag_interface presto_interface = {
struct adapter_driver presto_adapter_driver = {
.name = "presto",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = presto_jtag_init,
.quit = presto_jtag_quit,
diff --git a/src/jtag/drivers/remote_bitbang.c b/src/jtag/drivers/remote_bitbang.c
index bb608ba0a..449c61654 100644
--- a/src/jtag/drivers/remote_bitbang.c
+++ b/src/jtag/drivers/remote_bitbang.c
@@ -412,8 +412,6 @@ COMMAND_HANDLER(remote_bitbang_handle_remote_bitbang_host_command)
return ERROR_COMMAND_SYNTAX_ERROR;
}
-static const char * const remote_bitbang_transports[] = { "jtag", "swd", NULL };
-
COMMAND_HANDLER(remote_bitbang_handle_remote_bitbang_use_remote_sleep_command)
{
if (CMD_ARGC != 1)
@@ -484,7 +482,8 @@ static struct jtag_interface remote_bitbang_interface = {
struct adapter_driver remote_bitbang_adapter_driver = {
.name = "remote_bitbang",
- .transports = remote_bitbang_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = remote_bitbang_command_handlers,
.init = &remote_bitbang_init,
diff --git a/src/jtag/drivers/rlink.c b/src/jtag/drivers/rlink.c
index 6ea3729a5..a81899625 100644
--- a/src/jtag/drivers/rlink.c
+++ b/src/jtag/drivers/rlink.c
@@ -1675,7 +1675,8 @@ static struct jtag_interface rlink_interface = {
struct adapter_driver rlink_adapter_driver = {
.name = "rlink",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = rlink_init,
.quit = rlink_quit,
diff --git a/src/jtag/drivers/rshim.c b/src/jtag/drivers/rshim.c
index b37fe8c45..89bdadd69 100644
--- a/src/jtag/drivers/rshim.c
+++ b/src/jtag/drivers/rshim.c
@@ -508,11 +508,10 @@ static const struct dap_ops rshim_dap_ops = {
.quit = rshim_disconnect,
};
-static const char *const rshim_dap_transport[] = { "dapdirect_swd", NULL };
-
struct adapter_driver rshim_dap_adapter_driver = {
.name = "rshim",
- .transports = rshim_dap_transport,
+ .transport_ids = TRANSPORT_DAPDIRECT_SWD,
+ .transport_preferred_id = TRANSPORT_DAPDIRECT_SWD,
.commands = rshim_dap_command_handlers,
.init = rshim_dap_init,
diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index d77f28b0f..e018f71cd 100644
--- a/src/jtag/drivers/stlink_usb.c
+++ b/src/jtag/drivers/stlink_usb.c
@@ -5217,11 +5217,10 @@ static const struct swim_driver stlink_swim_ops = {
.reconnect = stlink_swim_op_reconnect,
};
-static const char *const stlink_dap_transport[] = { "dapdirect_swd", "dapdirect_jtag", "swim", NULL };
-
struct adapter_driver stlink_dap_adapter_driver = {
.name = "st-link",
- .transports = stlink_dap_transport,
+ .transport_ids = TRANSPORT_DAPDIRECT_SWD | TRANSPORT_DAPDIRECT_JTAG | TRANSPORT_SWIM,
+ .transport_preferred_id = TRANSPORT_DAPDIRECT_SWD,
.commands = stlink_dap_command_handlers,
.init = stlink_dap_init,
diff --git a/src/jtag/drivers/sysfsgpio.c b/src/jtag/drivers/sysfsgpio.c
index ccd3974a4..279b35377 100644
--- a/src/jtag/drivers/sysfsgpio.c
+++ b/src/jtag/drivers/sysfsgpio.c
@@ -545,8 +545,6 @@ static const struct command_registration sysfsgpio_command_handlers[] = {
static int sysfsgpio_init(void);
static int sysfsgpio_quit(void);
-static const char * const sysfsgpio_transports[] = { "jtag", "swd", NULL };
-
static struct jtag_interface sysfsgpio_interface = {
.supported = DEBUG_CAP_TMS_SEQ,
.execute_queue = bitbang_execute_queue,
@@ -554,7 +552,8 @@ static struct jtag_interface sysfsgpio_interface = {
struct adapter_driver sysfsgpio_adapter_driver = {
.name = "sysfsgpio",
- .transports = sysfsgpio_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = sysfsgpio_command_handlers,
.init = sysfsgpio_init,
diff --git a/src/jtag/drivers/ulink.c b/src/jtag/drivers/ulink.c
index 0a13bf6d4..417d560cd 100644
--- a/src/jtag/drivers/ulink.c
+++ b/src/jtag/drivers/ulink.c
@@ -2271,7 +2271,8 @@ static struct jtag_interface ulink_interface = {
struct adapter_driver ulink_adapter_driver = {
.name = "ulink",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = ulink_command_handlers,
.init = ulink_init,
diff --git a/src/jtag/drivers/usb_blaster/usb_blaster.c b/src/jtag/drivers/usb_blaster/usb_blaster.c
index 1782cc424..81344664e 100644
--- a/src/jtag/drivers/usb_blaster/usb_blaster.c
+++ b/src/jtag/drivers/usb_blaster/usb_blaster.c
@@ -1057,7 +1057,8 @@ static struct jtag_interface usb_blaster_interface = {
struct adapter_driver usb_blaster_adapter_driver = {
.name = "usb_blaster",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = ublast_command_handlers,
.init = ublast_init,
diff --git a/src/jtag/drivers/usbprog.c b/src/jtag/drivers/usbprog.c
index 24407f003..264b45f72 100644
--- a/src/jtag/drivers/usbprog.c
+++ b/src/jtag/drivers/usbprog.c
@@ -590,7 +590,8 @@ static struct jtag_interface usbprog_interface = {
struct adapter_driver usbprog_adapter_driver = {
.name = "usbprog",
- .transports = jtag_only,
+ .transport_ids = TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_JTAG,
.init = usbprog_init,
.quit = usbprog_quit,
diff --git a/src/jtag/drivers/vdebug.c b/src/jtag/drivers/vdebug.c
index fd1e6a7e7..38685950a 100644
--- a/src/jtag/drivers/vdebug.c
+++ b/src/jtag/drivers/vdebug.c
@@ -1342,11 +1342,10 @@ static const struct dap_ops vdebug_dap_ops = {
.quit = NULL, /* optional */
};
-static const char *const vdebug_transports[] = { "jtag", "dapdirect_swd", NULL };
-
struct adapter_driver vdebug_adapter_driver = {
.name = "vdebug",
- .transports = vdebug_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_DAPDIRECT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.speed = vdebug_jtag_speed,
.khz = vdebug_jtag_khz,
.speed_div = vdebug_jtag_div,
diff --git a/src/jtag/drivers/vsllink.c b/src/jtag/drivers/vsllink.c
index c10ed1380..145f0682a 100644
--- a/src/jtag/drivers/vsllink.c
+++ b/src/jtag/drivers/vsllink.c
@@ -913,8 +913,6 @@ static const struct command_registration vsllink_command_handlers[] = {
COMMAND_REGISTRATION_DONE
};
-static const char * const vsllink_transports[] = {"jtag", "swd", NULL};
-
static const struct swd_driver vsllink_swd_driver = {
.init = vsllink_swd_init,
.switch_seq = vsllink_swd_switch_seq,
@@ -930,7 +928,8 @@ static struct jtag_interface vsllink_interface = {
struct adapter_driver vsllink_adapter_driver = {
.name = "vsllink",
- .transports = vsllink_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = vsllink_command_handlers,
.init = vsllink_init,
diff --git a/src/jtag/drivers/xds110.c b/src/jtag/drivers/xds110.c
index c84371001..d1bb70590 100644
--- a/src/jtag/drivers/xds110.c
+++ b/src/jtag/drivers/xds110.c
@@ -2058,15 +2058,14 @@ static const struct swd_driver xds110_swd_driver = {
.run = xds110_swd_run_queue,
};
-static const char * const xds110_transport[] = { "swd", "jtag", NULL };
-
static struct jtag_interface xds110_interface = {
.execute_queue = xds110_execute_queue,
};
struct adapter_driver xds110_adapter_driver = {
.name = "xds110",
- .transports = xds110_transport,
+ .transport_ids = TRANSPORT_SWD | TRANSPORT_JTAG,
+ .transport_preferred_id = TRANSPORT_SWD,
.commands = xds110_command_handlers,
.init = xds110_init,
diff --git a/src/jtag/drivers/xlnx-pcie-xvc.c b/src/jtag/drivers/xlnx-pcie-xvc.c
index 37c6777e4..3baa183d9 100644
--- a/src/jtag/drivers/xlnx-pcie-xvc.c
+++ b/src/jtag/drivers/xlnx-pcie-xvc.c
@@ -690,11 +690,10 @@ static const struct swd_driver xlnx_pcie_xvc_swd_ops = {
.run = xlnx_pcie_xvc_swd_run_queue,
};
-static const char * const xlnx_pcie_xvc_transports[] = { "jtag", "swd", NULL };
-
struct adapter_driver xlnx_pcie_xvc_adapter_driver = {
.name = "xlnx_pcie_xvc",
- .transports = xlnx_pcie_xvc_transports,
+ .transport_ids = TRANSPORT_JTAG | TRANSPORT_SWD,
+ .transport_preferred_id = TRANSPORT_JTAG,
.commands = xlnx_pcie_xvc_command_handlers,
.init = &xlnx_pcie_xvc_init,
diff --git a/src/jtag/hla/hla_interface.c b/src/jtag/hla/hla_interface.c
index 96862b0d0..a9d196cce 100644
--- a/src/jtag/hla/hla_interface.c
+++ b/src/jtag/hla/hla_interface.c
@@ -367,7 +367,8 @@ static const struct command_registration hl_interface_command_handlers[] = {
struct adapter_driver hl_adapter_driver = {
.name = "hla",
- .transports = hl_transports,
+ .transport_ids = TRANSPORT_HLA_SWD | TRANSPORT_HLA_JTAG,
+ .transport_preferred_id = TRANSPORT_HLA_SWD,
.commands = hl_interface_command_handlers,
.init = hl_interface_init,
diff --git a/src/jtag/hla/hla_interface.h b/src/jtag/hla/hla_interface.h
index f1550d991..c0ee05498 100644
--- a/src/jtag/hla/hla_interface.h
+++ b/src/jtag/hla/hla_interface.h
@@ -15,8 +15,6 @@
struct target;
/** */
enum e_hl_transports;
-/** */
-extern const char *hl_transports[];
#define HLA_MAX_USB_IDS 16
diff --git a/src/jtag/hla/hla_transport.c b/src/jtag/hla/hla_transport.c
index 333825eff..d8ece0776 100644
--- a/src/jtag/hla/hla_transport.c
+++ b/src/jtag/hla/hla_transport.c
@@ -231,8 +231,6 @@ static struct transport hl_jtag_transport = {
.override_target = hl_interface_override_target,
};
-const char *hl_transports[] = { "hla_swd", "hla_jtag", NULL };
-
static void hl_constructor(void) __attribute__ ((constructor));
static void hl_constructor(void)
{
diff --git a/src/jtag/interface.h b/src/jtag/interface.h
index b2d7123fd..475dbed36 100644
--- a/src/jtag/interface.h
+++ b/src/jtag/interface.h
@@ -17,6 +17,7 @@
#include <jtag/jtag.h>
#include <jtag/swim.h>
#include <target/arm_tpiu_swo.h>
+#include <transport/transport.h>
/* @file
* The "Cable Helper API" is what the cable drivers can use to help
@@ -208,8 +209,16 @@ struct adapter_driver {
/** The name of the interface driver. */
const char * const name;
- /** transports supported in C code (NULL terminated vector) */
- const char * const *transports;
+ /**
+ * Bitmask of transport IDs supported in C code.
+ */
+ unsigned int transport_ids;
+
+ /**
+ * ID of transport that gets auto-selected when not specified by the user.
+ * The auto-selection of transport is DEPRECATED.
+ */
+ unsigned int transport_preferred_id;
/**
* The interface driver may register additional commands to expose
@@ -354,8 +363,6 @@ struct adapter_driver {
const struct swim_driver *swim_ops;
};
-extern const char * const jtag_only[];
-
int adapter_resets(int assert_trst, int assert_srst);
int adapter_assert_reset(void);
int adapter_deassert_reset(void);
diff --git a/src/transport/transport.c b/src/transport/transport.c
index 411b0a5e0..b7a3913cc 100644
--- a/src/transport/transport.c
+++ b/src/transport/transport.c
@@ -62,11 +62,15 @@ static const struct {
static struct transport *transport_list;
/**
- * NULL-terminated Vector of names of transports which the
- * currently selected debug adapter supports. This is declared
- * by the time that adapter is fully set up.
+ * Bitmask of transport IDs which the currently selected debug adapter supports.
+ * This is declared by the time that adapter is fully set up.
*/
-static const char * const *allowed_transports;
+static unsigned int allowed_transports;
+
+/**
+ * Transport ID auto-selected when not specified by the user.
+ */
+static unsigned int preferred_transport;
/**
* Adapter supports a single transport; it has been auto-selected
@@ -76,7 +80,7 @@ static bool transport_single_is_autoselected;
/** * The transport being used for the current OpenOCD session. */
static struct transport *session;
-static const char *transport_name(unsigned int id)
+const char *transport_name(unsigned int id)
{
for (unsigned int i = 0; i < ARRAY_SIZE(transport_names); i++)
if (id == transport_names[i].id)
@@ -118,13 +122,14 @@ static int transport_select(struct command_context *ctx, const char *name)
* to declare the set of transports supported by an adapter. When
* there is only one member of that set, it is automatically selected.
*/
-int allow_transports(struct command_context *ctx, const char * const *vector)
+int allow_transports(struct command_context *ctx, unsigned int transport_ids,
+ unsigned int transport_preferred_id)
{
/* NOTE: caller is required to provide only a list
- * of *valid* transport names
+ * of *valid* transports
*
* REVISIT should we validate that? and insist there's
- * at least one non-NULL element in that list?
+ * at least one valid element in that list?
*
* ... allow removals, e.g. external strapping prevents use
* of one transport; C code should be definitive about what
@@ -135,13 +140,14 @@ int allow_transports(struct command_context *ctx, const char * const *vector)
return ERROR_FAIL;
}
- allowed_transports = vector;
+ allowed_transports = transport_ids;
+ preferred_transport = transport_preferred_id;
/* autoselect if there's no choice ... */
- if (!vector[1]) {
- LOG_DEBUG("only one transport option; autoselecting '%s'", vector[0]);
+ if (IS_PWR_OF_2(transport_ids)) {
+ LOG_DEBUG("only one transport option; autoselecting '%s'", transport_name(transport_ids));
transport_single_is_autoselected = true;
- return transport_select(ctx, vector[0]);
+ return transport_select(ctx, transport_name(transport_ids));
}
return ERROR_OK;
@@ -226,10 +232,9 @@ COMMAND_HANDLER(handle_transport_init)
/* no session transport configured, print transports then fail */
LOG_ERROR("Transports available:");
- const char * const *vector = allowed_transports;
- while (*vector) {
- LOG_ERROR("%s", *vector);
- vector++;
+ for (unsigned int i = BIT(0); i & TRANSPORT_VALID_MASK; i <<= 1) {
+ if (i & allowed_transports)
+ LOG_ERROR("%s", transport_name(i));
}
return ERROR_FAIL;
}
@@ -275,8 +280,9 @@ COMMAND_HANDLER(handle_transport_select)
}
LOG_WARNING("DEPRECATED: auto-selecting transport \"%s\". "
"Use 'transport select %s' to suppress this message.",
- allowed_transports[0], allowed_transports[0]);
- int retval = transport_select(CMD_CTX, allowed_transports[0]);
+ transport_name(preferred_transport),
+ transport_name(preferred_transport));
+ int retval = transport_select(CMD_CTX, transport_name(preferred_transport));
if (retval != ERROR_OK)
return retval;
}
@@ -310,8 +316,9 @@ COMMAND_HANDLER(handle_transport_select)
return ERROR_FAIL;
}
- for (unsigned int i = 0; allowed_transports[i]; i++) {
- if (!strcmp(allowed_transports[i], CMD_ARGV[0])) {
+ for (unsigned int i = BIT(0); i & TRANSPORT_VALID_MASK; i <<= 1) {
+ if ((i & allowed_transports)
+ && !strcmp(transport_name(i), CMD_ARGV[0])) {
int retval = transport_select(CMD_CTX, CMD_ARGV[0]);
if (retval != ERROR_OK)
return retval;
diff --git a/src/transport/transport.h b/src/transport/transport.h
index dde7c6ba7..f6f0f4f4d 100644
--- a/src/transport/transport.h
+++ b/src/transport/transport.h
@@ -95,9 +95,12 @@ struct transport *get_current_transport(void);
const char *get_current_transport_name(void);
+const char *transport_name(unsigned int id);
+
int transport_register_commands(struct command_context *ctx);
-int allow_transports(struct command_context *ctx, const char * const *vector);
+int allow_transports(struct command_context *ctx, unsigned int transport_ids,
+ unsigned int transport_preferred_id);
bool transport_is_jtag(void);
bool transport_is_swd(void);
commit 236208a5ff2db5f502444b32da1df3fd17b692fb
Author: Antonio Borneo <bor...@gm...>
Date: Sun Dec 22 17:06:12 2024 +0100
transport: use a bitmask for the transport
Move the transport's names in a local array in the transport
framework.
Replace the string struct transport::name, that identifies the
transport, with a bitmask where each bit corresponds to one of the
available transports.
Change-Id: I6bdf7264d5979c355299f63fcf80bf54dcd95cee
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8674
Tested-by: jenkins
Reviewed-by: zapb <de...@za...>
diff --git a/src/jtag/core.c b/src/jtag/core.c
index 030c173be..6dd2144c6 100644
--- a/src/jtag/core.c
+++ b/src/jtag/core.c
@@ -1823,7 +1823,7 @@ static int jtag_select(struct command_context *ctx)
}
static struct transport jtag_transport = {
- .name = "jtag",
+ .id = TRANSPORT_JTAG,
.select = jtag_select,
.init = jtag_init,
};
@@ -1868,7 +1868,7 @@ int adapter_resets(int trst, int srst)
transport_is_swim()) {
if (trst == TRST_ASSERT) {
LOG_ERROR("transport %s has no trst signal",
- get_current_transport()->name);
+ get_current_transport_name());
return ERROR_FAIL;
}
@@ -1884,7 +1884,7 @@ int adapter_resets(int trst, int srst)
return ERROR_OK;
LOG_ERROR("reset is not supported on transport %s",
- get_current_transport()->name);
+ get_current_transport_name());
return ERROR_FAIL;
}
@@ -1903,7 +1903,7 @@ int adapter_assert_reset(void)
return adapter_system_reset(1);
else if (get_current_transport())
LOG_ERROR("reset is not supported on %s",
- get_current_transport()->name);
+ get_current_transport_name());
else
LOG_ERROR("transport is not selected");
return ERROR_FAIL;
@@ -1920,7 +1920,7 @@ int adapter_deassert_reset(void)
return adapter_system_reset(0);
else if (get_current_transport())
LOG_ERROR("reset is not supported on %s",
- get_current_transport()->name);
+ get_current_transport_name());
else
LOG_ERROR("transport is not selected");
return ERROR_FAIL;
diff --git a/src/jtag/hla/hla_transport.c b/src/jtag/hla/hla_transport.c
index b826eb0fe..333825eff 100644
--- a/src/jtag/hla/hla_transport.c
+++ b/src/jtag/hla/hla_transport.c
@@ -177,15 +177,20 @@ static int hl_transport_init(struct command_context *cmd_ctx)
return ERROR_FAIL;
}
- LOG_DEBUG("current transport %s", transport->name);
+ LOG_DEBUG("current transport %s", get_current_transport_name());
/* get selected transport as enum */
- tr = HL_TRANSPORT_UNKNOWN;
-
- if (strcmp(transport->name, "hla_swd") == 0)
+ switch (transport->id) {
+ case TRANSPORT_HLA_SWD:
tr = HL_TRANSPORT_SWD;
- else if (strcmp(transport->name, "hla_jtag") == 0)
+ break;
+ case TRANSPORT_HLA_JTAG:
tr = HL_TRANSPORT_JTAG;
+ break;
+ default:
+ tr = HL_TRANSPORT_UNKNOWN;
+ break;
+ }
int retval = hl_interface_open(tr);
@@ -213,14 +218,14 @@ static int hl_swd_transport_select(struct command_context *cmd_ctx)
}
static struct transport hl_swd_transport = {
- .name = "hla_swd",
+ .id = TRANSPORT_HLA_SWD,
.select = hl_swd_transport_select,
.init = hl_transport_init,
.override_target = hl_interface_override_target,
};
static struct transport hl_jtag_transport = {
- .name = "hla_jtag",
+ .id = TRANSPORT_HLA_JTAG,
.select = hl_jtag_transport_select,
.init = hl_transport_init,
.override_target = hl_interface_override_target,
diff --git a/src/jtag/swim.c b/src/jtag/swim.c
index de3e106a1..004a9fd4f 100644
--- a/src/jtag/swim.c
+++ b/src/jtag/swim.c
@@ -136,7 +136,7 @@ static int swim_transport_init(struct command_context *cmd_ctx)
}
static struct transport swim_transport = {
- .name = "swim",
+ .id = TRANSPORT_SWIM,
.select = swim_transport_select,
.init = swim_transport_init,
};
diff --git a/src/target/adi_v5_dapdirect.c b/src/target/adi_v5_dapdirect.c
index d198dacf3..07ea313d1 100644
--- a/src/target/adi_v5_dapdirect.c
+++ b/src/target/adi_v5_dapdirect.c
@@ -207,13 +207,13 @@ static int dapdirect_init(struct command_context *ctx)
}
static struct transport dapdirect_jtag_transport = {
- .name = "dapdirect_jtag",
+ .id = TRANSPORT_DAPDIRECT_JTAG,
.select = dapdirect_jtag_select,
.init = dapdirect_init,
};
static struct transport dapdirect_swd_transport = {
- .name = "dapdirect_swd",
+ .id = TRANSPORT_DAPDIRECT_SWD,
.select = dapdirect_swd_select,
.init = dapdirect_init,
};
diff --git a/src/target/adi_v5_swd.c b/src/target/adi_v5_swd.c
index e50f8f137..2d286136a 100644
--- a/src/target/adi_v5_swd.c
+++ b/src/target/adi_v5_swd.c
@@ -756,7 +756,7 @@ static int swd_init(struct command_context *ctx)
}
static struct transport swd_transport = {
- .name = "swd",
+ .id = TRANSPORT_SWD,
.select = swd_select,
.init = swd_init,
};
diff --git a/src/transport/transport.c b/src/transport/transport.c
index 4a1f71d40..411b0a5e0 100644
--- a/src/transport/transport.c
+++ b/src/transport/transport.c
@@ -30,6 +30,8 @@
* messaging and error handling.
*/
+#include <helper/align.h>
+#include <helper/bits.h>
#include <helper/log.h>
#include <helper/replacements.h>
#include <transport/transport.h>
@@ -43,6 +45,20 @@ extern struct command_context *global_cmd_ctx;
*/
/** List of transports known to OpenOCD. */
+static const struct {
+ unsigned int id;
+ const char *name;
+} transport_names[] = {
+ { TRANSPORT_JTAG, "jtag", },
+ { TRANSPORT_SWD, "swd", },
+ { TRANSPORT_HLA_JTAG, "hla_jtag", },
+ { TRANSPORT_HLA_SWD, "hla_swd", },
+ { TRANSPORT_DAPDIRECT_JTAG, "dapdirect_jtag", },
+ { TRANSPORT_DAPDIRECT_SWD, "dapdirect_swd", },
+ { TRANSPORT_SWIM, "swim", },
+};
+
+/** List of transports registered in OpenOCD. */
static struct transport *transport_list;
/**
@@ -60,12 +76,26 @@ static bool transport_single_is_autoselected;
/** * The transport being used for the current OpenOCD session. */
static struct transport *session;
+static const char *transport_name(unsigned int id)
+{
+ for (unsigned int i = 0; i < ARRAY_SIZE(transport_names); i++)
+ if (id == transport_names[i].id)
+ return transport_names[i].name;
+
+ return NULL;
+}
+
+static bool is_transport_id_valid(unsigned int id)
+{
+ return (id != 0) && ((id & ~TRANSPORT_VALID_MASK) == 0) && IS_PWR_OF_2(id);
+}
+
static int transport_select(struct command_context *ctx, const char *name)
{
/* name may only identify a known transport;
* caller guarantees session's transport isn't yet set.*/
for (struct transport *t = transport_list; t; t = t->next) {
- if (strcmp(t->name, name) == 0) {
+ if (!strcmp(transport_name(t->id), name)) {
int retval = t->select(ctx);
/* select() registers commands specific to this
* transport, and may also reset the link, e.g.
@@ -74,7 +104,7 @@ static int transport_select(struct command_context *ctx, const char *name)
if (retval == ERROR_OK)
session = t;
else
- LOG_ERROR("Error selecting '%s' as transport", t->name);
+ LOG_ERROR("Error selecting '%s' as transport", name);
return retval;
}
}
@@ -136,20 +166,28 @@ int transport_register(struct transport *new_transport)
{
struct transport *t;
+ if (!is_transport_id_valid(new_transport->id)) {
+ LOG_ERROR("invalid transport ID 0x%x", new_transport->id);
+ return ERROR_FAIL;
+ }
+
for (t = transport_list; t; t = t->next) {
- if (strcmp(t->name, new_transport->name) == 0) {
- LOG_ERROR("transport name already used");
+ if (t->id == new_transport->id) {
+ LOG_ERROR("transport '%s' already registered",
+ transport_name(t->id));
return ERROR_FAIL;
}
}
if (!new_transport->select || !new_transport->init)
- LOG_ERROR("invalid transport %s", new_transport->name);
+ LOG_ERROR("invalid transport %s",
+ transport_name(new_transport->id));
/* splice this into the list */
new_transport->next = transport_list;
transport_list = new_transport;
- LOG_DEBUG("register '%s'", new_transport->name);
+ LOG_DEBUG("register '%s' (ID %d)",
+ transport_name(new_transport->id), new_transport->id);
return ERROR_OK;
}
@@ -166,6 +204,14 @@ struct transport *get_current_transport(void)
return session;
}
+const char *get_current_transport_name(void)
+{
+ if (!session || !is_transport_id_valid(session->id))
+ NULL;
+
+ return transport_name(session->id);
+}
+
/*-----------------------------------------------------------------------*/
/*
@@ -191,7 +237,7 @@ COMMAND_HANDLER(handle_transport_init)
if (transport_single_is_autoselected)
LOG_WARNING("DEPRECATED: auto-selecting transport \"%s\". "
"Use 'transport select %s' to suppress this message.",
- session->name, session->name);
+ transport_name(session->id), transport_name(session->id));
return session->init(CMD_CTX);
}
@@ -204,7 +250,7 @@ COMMAND_HANDLER(handle_transport_list)
command_print(CMD, "The following transports are available:");
for (struct transport *t = transport_list; t; t = t->next)
- command_print(CMD, "\t%s", t->name);
+ command_print(CMD, "\t%s", transport_name(t->id));
return ERROR_OK;
}
@@ -234,19 +280,19 @@ COMMAND_HANDLER(handle_transport_select)
if (retval != ERROR_OK)
return retval;
}
- command_print(CMD, "%s", session->name);
+ command_print(CMD, "%s", transport_name(session->id));
return ERROR_OK;
}
/* assign transport */
if (session) {
- if (!strcmp(session->name, CMD_ARGV[0])) {
+ if (!strcmp(transport_name(session->id), CMD_ARGV[0])) {
if (transport_single_is_autoselected) {
/* Nothing to do, but also nothing to complain */
transport_single_is_autoselected = false;
return ERROR_OK;
}
- LOG_WARNING("Transport \"%s\" was already selected", session->name);
+ LOG_WARNING("Transport \"%s\" was already selected", CMD_ARGV[0]);
return ERROR_OK;
}
command_print(CMD, "Can't change session's transport after the initial selection was made");
diff --git a/src/transport/transport.h b/src/transport/transport.h
index 2e3dcc61a..dde7c6ba7 100644
--- a/src/transport/transport.h
+++ b/src/transport/transport.h
@@ -12,8 +12,27 @@
#include "config.h"
#endif
+#include "helper/bits.h"
#include "helper/command.h"
+#define TRANSPORT_JTAG BIT(0)
+#define TRANSPORT_SWD BIT(1)
+#define TRANSPORT_HLA_JTAG BIT(2)
+#define TRANSPORT_HLA_SWD BIT(3)
+#define TRANSPORT_DAPDIRECT_JTAG BIT(4)
+#define TRANSPORT_DAPDIRECT_SWD BIT(5)
+#define TRANSPORT_SWIM BIT(6)
+
+/* mask for valid ID */
+#define TRANSPORT_VALID_MASK \
+ (TRANSPORT_JTAG | \
+ TRANSPORT_SWD | \
+ TRANSPORT_HLA_JTAG | \
+ TRANSPORT_HLA_SWD | \
+ TRANSPORT_DAPDIRECT_JTAG | \
+ TRANSPORT_DAPDIRECT_SWD | \
+ TRANSPORT_SWIM)
+
/**
* Wrapper for transport lifecycle operations.
*
@@ -34,11 +53,10 @@
*/
struct transport {
/**
- * Each transport has a unique name, used to select it
- * from among the alternatives. Examples might include
- * "jtag", * "swd", "AVR_ISP" and more.
+ * Each transport has a unique ID, used to select it
+ * from among the alternatives.
*/
- const char *name;
+ unsigned int id;
/**
* When a transport is selected, this method registers
@@ -75,6 +93,8 @@ int transport_register(struct transport *new_transport);
struct transport *get_current_transport(void);
+const char *get_current_transport_name(void);
+
int transport_register_commands(struct command_context *ctx);
int allow_transports(struct command_context *ctx, const char * const *vector);
commit 9a5de74423503d1bd16e16b77b4e0e6d19913057
Author: Antonio Borneo <bor...@gm...>
Date: Sat Jan 4 16:54:14 2025 +0100
transport: deprecate auto-selection of transport
Historically, if the user does not specify a transport, OpenOCD
select automatically the first transport listed in the adapter
driver.
This auto-selection can behave differently by changing adapter,
so the transport should be enforced in the configuration file.
Deprecate the auto-selection and print a warning message when a
transport gets auto-selected.
There are two cases:
- adapter offers one transport only. The code early auto-selects
the transport but does not print anything. If later the user
selects the transport then no deprecation will be printed during
'transport init';
- user runs 'transport select', e.g. in 'swj-dp' script, and this
triggers the auto-selection and the deprecated message.
Change-Id: I2e55b9dcc6da77ca937978fbfb36bc365b803f0d
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8692
Reviewed-by: Jan Matyas <jan...@co...>
Reviewed-by: zapb <de...@za...>
Tested-by: jenkins
diff --git a/src/transport/transport.c b/src/transport/transport.c
index 0af136036..4a1f71d40 100644
--- a/src/transport/transport.c
+++ b/src/transport/transport.c
@@ -52,6 +52,11 @@ static struct transport *transport_list;
*/
static const char * const *allowed_transports;
+/**
+ * Adapter supports a single transport; it has been auto-selected
+ */
+static bool transport_single_is_autoselected;
+
/** * The transport being used for the current OpenOCD session. */
static struct transport *session;
@@ -104,7 +109,8 @@ int allow_transports(struct command_context *ctx, const char * const *vector)
/* autoselect if there's no choice ... */
if (!vector[1]) {
- LOG_INFO("only one transport option; autoselecting '%s'", vector[0]);
+ LOG_DEBUG("only one transport option; autoselecting '%s'", vector[0]);
+ transport_single_is_autoselected = true;
return transport_select(ctx, vector[0]);
}
@@ -182,6 +188,11 @@ COMMAND_HANDLER(handle_transport_init)
return ERROR_FAIL;
}
+ if (transport_single_is_autoselected)
+ LOG_WARNING("DEPRECATED: auto-selecting transport \"%s\". "
+ "Use 'transport select %s' to suppress this message.",
+ session->name, session->name);
+
return session->init(CMD_CTX);
}
@@ -216,8 +227,9 @@ COMMAND_HANDLER(handle_transport_select)
command_print(CMD, "Debug adapter does not support any transports? Check config file order.");
return ERROR_FAIL;
}
- LOG_INFO("auto-selecting first available session transport \"%s\". "
- "To override use 'transport select <transport>'.", allowed_transports[0]);
+ LOG_WARNING("DEPRECATED: auto-selecting transport \"%s\". "
+ "Use 'transport select %s' to suppress this message.",
+ allowed_transports[0], allowed_transports[0]);
int retval = transport_select(CMD_CTX, allowed_transports[0]);
if (retval != ERROR_OK)
return retval;
@@ -229,6 +241,11 @@ COMMAND_HANDLER(handle_transport_select)
/* assign transport */
if (session) {
if (!strcmp(session->name, CMD_ARGV[0])) {
+ if (transport_single_is_autoselected) {
+ /* Nothing to do, but also nothing to complain */
+ transport_single_is_autoselected = false;
+ return ERROR_OK;
+ }
LOG_WARNING("Transport \"%s\" was already selected", session->name);
return ERROR_OK;
}
-----------------------------------------------------------------------
Summary of changes:
src/jtag/adapter.c | 12 +--
src/jtag/core.c | 10 +--
src/jtag/drivers/am335xgpio.c | 5 +-
src/jtag/drivers/amt_jtagaccel.c | 3 +-
src/jtag/drivers/angie.c | 3 +-
src/jtag/drivers/arm-jtag-ew.c | 3 +-
src/jtag/drivers/at91rm9200.c | 3 +-
src/jtag/drivers/bcm2835gpio.c | 5 +-
src/jtag/drivers/buspirate.c | 5 +-
src/jtag/drivers/cmsis_dap.c | 5 +-
src/jtag/drivers/dmem.c | 5 +-
src/jtag/drivers/dummy.c | 3 +-
src/jtag/drivers/ep93xx.c | 3 +-
src/jtag/drivers/esp_usb_jtag.c | 3 +-
src/jtag/drivers/ft232r.c | 3 +-
src/jtag/drivers/ftdi.c | 5 +-
src/jtag/drivers/gw16012.c | 3 +-
src/jtag/drivers/imx_gpio.c | 5 +-
src/jtag/drivers/jlink.c | 5 +-
src/jtag/drivers/jtag_dpi.c | 3 +-
src/jtag/drivers/jtag_vpi.c | 3 +-
src/jtag/drivers/kitprog.c | 5 +-
src/jtag/drivers/linuxgpiod.c | 5 +-
src/jtag/drivers/linuxspidev.c | 6 +-
src/jtag/drivers/opendous.c | 3 +-
src/jtag/drivers/openjtag.c | 3 +-
src/jtag/drivers/osbdm.c | 3 +-
src/jtag/drivers/parport.c | 3 +-
src/jtag/drivers/presto.c | 3 +-
src/jtag/drivers/remote_bitbang.c | 5 +-
src/jtag/drivers/rlink.c | 3 +-
src/jtag/drivers/rshim.c | 5 +-
src/jtag/drivers/stlink_usb.c | 5 +-
src/jtag/drivers/sysfsgpio.c | 5 +-
src/jtag/drivers/ulink.c | 3 +-
src/jtag/drivers/usb_blaster/usb_blaster.c | 3 +-
src/jtag/drivers/usbprog.c | 3 +-
src/jtag/drivers/vdebug.c | 5 +-
src/jtag/drivers/vsllink.c | 5 +-
src/jtag/drivers/xds110.c | 5 +-
src/jtag/drivers/xlnx-pcie-xvc.c | 5 +-
src/jtag/hla/hla_interface.c | 3 +-
src/jtag/hla/hla_interface.h | 2 -
src/jtag/hla/hla_transport.c | 21 +++--
src/jtag/interface.h | 15 +++-
src/jtag/swim.c | 2 +-
src/target/adi_v5_dapdirect.c | 4 +-
src/target/adi_v5_swd.c | 2 +-
src/transport/transport.c | 130 ++++++++++++++++++++++-------
src/transport/transport.h | 33 ++++++--
50 files changed, 247 insertions(+), 143 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:26:35
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via da50873d5ebe558ee545c1a00f31df9e23f45456 (commit)
from c3fae349692c7c2d0eac95a04da648ba95a558a0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit da50873d5ebe558ee545c1a00f31df9e23f45456
Author: Antonio Borneo <bor...@gm...>
Date: Sat Jan 4 18:41:41 2025 +0100
adapter: list supported transports beside adapter name
Modify the command 'adapter list' to output the list of transports
supported by each adapter driver.
Drop the line number, as there is no real interest on it.
Format the output as a TCL dictionary indexed by the adapter name
and containing the transports in a TCL list. E.g:
dummy { jtag }
ftdi { jtag swd }
This format is easily handled by TCL scripts, e.g.:
dict get [adapter list] ftdi
Document the command output.
Change-Id: I69f73b71da2f1756866a63bc2c0ba33459a29063
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8691
Tested-by: jenkins
diff --git a/doc/openocd.texi b/doc/openocd.texi
index 32a2895ec..d85812824 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -2414,6 +2414,17 @@ target.
@deffn {Command} {adapter list}
List the debug adapter drivers that have been built into
the running copy of OpenOCD.
+
+The output is formatted as a Tcl dictionary indexed by the adapter name
+and containing the transports in a Tcl list.
+@example
+dummy @{ jtag @}
+ftdi @{ jtag swd @}
+@end example
+This format is easily handled by Tcl scripts:
+@example
+dict get [adapter list] ftdi
+@end example
@end deffn
@anchor{adapter gpio}
diff --git a/src/jtag/adapter.c b/src/jtag/adapter.c
index 0bdfe7b13..694721746 100644
--- a/src/jtag/adapter.c
+++ b/src/jtag/adapter.c
@@ -393,9 +393,21 @@ COMMAND_HANDLER(handle_adapter_name)
COMMAND_HANDLER(dump_adapter_driver_list)
{
+ int max_len = 0;
+ for (unsigned int i = 0; adapter_drivers[i]; i++) {
+ int len = strlen(adapter_drivers[i]->name);
+ if (max_len < len)
+ max_len = len;
+ }
+
for (unsigned int i = 0; adapter_drivers[i]; i++) {
const char *name = adapter_drivers[i]->name;
- command_print(CMD, "%u: %s", i + 1, name);
+ const char * const *transports = adapter_drivers[i]->transports;
+
+ command_print_sameline(CMD, "%-*s {", max_len, name);
+ for (unsigned int j = 0; transports[j]; j++)
+ command_print_sameline(CMD, " %s", transports[j]);
+ command_print(CMD, " }");
}
return ERROR_OK;
-----------------------------------------------------------------------
Summary of changes:
doc/openocd.texi | 11 +++++++++++
src/jtag/adapter.c | 14 +++++++++++++-
2 files changed, 24 insertions(+), 1 deletion(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:25:14
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via c3fae349692c7c2d0eac95a04da648ba95a558a0 (commit)
from cbd7987c7ca2656b60bc8964bb1d9b7819e66ccb (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit c3fae349692c7c2d0eac95a04da648ba95a558a0
Author: Antonio Borneo <bor...@gm...>
Date: Sun Mar 16 14:31:01 2025 +0100
adapter: replace 'interface' with 'adapter driver'
Comments and output strings still reference the term 'interface',
while 'adapter driver' should be used.
While there, drop the useless test if CMD_ARGV[0] is an empty
string, as this is not possible when CMD_ARGC > 0.
Change-Id: I7b46b5dd3cec53d8b5b7559d941ee9ae3bd1d89b
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8808
Tested-by: jenkins
Reviewed-by: zapb <de...@za...>
diff --git a/src/jtag/adapter.c b/src/jtag/adapter.c
index 2fcbd609e..0bdfe7b13 100644
--- a/src/jtag/adapter.c
+++ b/src/jtag/adapter.c
@@ -187,7 +187,6 @@ int adapter_init(struct command_context *cmd_ctx)
int adapter_quit(void)
{
if (is_adapter_initialized() && adapter_driver->quit) {
- /* close the JTAG interface */
int result = adapter_driver->quit();
if (result != ERROR_OK)
LOG_ERROR("failed: %d", result);
@@ -380,7 +379,7 @@ done:
COMMAND_HANDLER(handle_adapter_name)
{
- /* return the name of the interface */
+ /* return the name of the adapter driver */
/* TCL code might need to know the exact type... */
/* FUTURE: we allow this as a means to "set" the interface. */
@@ -414,14 +413,14 @@ COMMAND_HANDLER(handle_adapter_driver_command)
{
int retval;
- /* check whether the interface is already configured */
+ /* check whether the adapter driver is already configured */
if (adapter_driver) {
- LOG_WARNING("Interface already configured, ignoring");
+ LOG_WARNING("Adapter driver already configured, ignoring");
return ERROR_OK;
}
- /* interface name is a mandatory argument */
- if (CMD_ARGC != 1 || CMD_ARGV[0][0] == '\0')
+ /* adapter driver name is a mandatory argument */
+ if (CMD_ARGC != 1)
return ERROR_COMMAND_SYNTAX_ERROR;
for (unsigned int i = 0; adapter_drivers[i]; i++) {
@@ -439,10 +438,10 @@ COMMAND_HANDLER(handle_adapter_driver_command)
return allow_transports(CMD_CTX, adapter_driver->transports);
}
- /* no valid interface was found (i.e. the configuration option,
- * didn't match one of the compiled-in interfaces
+ /* no valid adapter driver was found (i.e. the configuration option,
+ * didn't match one of the compiled-in drivers
*/
- LOG_ERROR("The specified debug interface was not found (%s)",
+ LOG_ERROR("The specified adapter driver was not found (%s)",
CMD_ARGV[0]);
command_print(CMD, "The following adapter drivers are available:");
CALL_COMMAND_HANDLER(dump_adapter_driver_list);
-----------------------------------------------------------------------
Summary of changes:
src/jtag/adapter.c | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-05-01 15:23:50
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via cbd7987c7ca2656b60bc8964bb1d9b7819e66ccb (commit)
from 4d4c45cfd25703f39f9e2413b22d91a48c4b4565 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit cbd7987c7ca2656b60bc8964bb1d9b7819e66ccb
Author: Antonio Borneo <bor...@gm...>
Date: Sat Apr 19 11:03:46 2025 +0200
target: stm8: drop include file stm8.h
The file stm8.h is only included by stm8.c and provides some basic
declaration that can be simply part of the C file.
Drop the file stm8.h and move its content in stm8.c
Replace the macro 'STM8_NUM_CORE_REGS' with the existing macro
'STM8_NUM_REGS'.
While there:
- drop the useless include of "hello.h".
Change-Id: Iecd1a27f0630cdbbfd51033d34aa3d468aa63464
Signed-off-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8856
Tested-by: jenkins
Reviewed-by: zapb <de...@za...>
diff --git a/src/target/Makefile.am b/src/target/Makefile.am
index 1fc7d2afa..1a7686418 100644
--- a/src/target/Makefile.am
+++ b/src/target/Makefile.am
@@ -224,7 +224,6 @@ ARC_SRC = \
%D%/avr32_mem.h \
%D%/avr32_regs.h \
%D%/semihosting_common.h \
- %D%/stm8.h \
%D%/lakemont.h \
%D%/x86_32_common.h \
%D%/arm_cti.h \
diff --git a/src/target/stm8.c b/src/target/stm8.c
index c80ea0eb2..81c41f2b2 100644
--- a/src/target/stm8.c
+++ b/src/target/stm8.c
@@ -13,14 +13,12 @@
#include <helper/log.h>
#include "target.h"
#include "target_type.h"
-#include "hello.h"
#include "jtag/interface.h"
#include "jtag/jtag.h"
#include "jtag/swim.h"
#include "register.h"
#include "breakpoints.h"
#include "algorithm.h"
-#include "stm8.h"
static struct reg_cache *stm8_build_reg_cache(struct target *target);
static int stm8_read_core_reg(struct target *target, unsigned int num);
@@ -54,6 +52,8 @@ static const struct {
{ 5, "cc", 8, REG_TYPE_UINT8, "general", "org.gnu.gdb.stm8.core", 0 },
};
+#define STM8_COMMON_MAGIC 0x53544D38U
+
#define STM8_NUM_REGS ARRAY_SIZE(stm8_regs)
#define STM8_PC 0
#define STM8_A 1
@@ -168,6 +168,51 @@ struct stm8_comparator {
enum hw_break_type type;
};
+struct stm8_common {
+ unsigned int common_magic;
+
+ void *arch_info;
+ struct reg_cache *core_cache;
+ uint32_t core_regs[STM8_NUM_REGS];
+
+ /* working area for fastdata access */
+ struct working_area *fast_data_area;
+
+ bool swim_configured;
+ bool bp_scanned;
+ uint8_t num_hw_bpoints;
+ uint8_t num_hw_bpoints_avail;
+ struct stm8_comparator *hw_break_list;
+ uint32_t blocksize;
+ uint32_t flashstart;
+ uint32_t flashend;
+ uint32_t eepromstart;
+ uint32_t eepromend;
+ uint32_t optionstart;
+ uint32_t optionend;
+ bool enable_step_irq;
+
+ bool enable_stm8l;
+ uint32_t flash_cr2;
+ uint32_t flash_ncr2;
+ uint32_t flash_iapsr;
+ uint32_t flash_dukr;
+ uint32_t flash_pukr;
+
+ /* cc value used for interrupt flags restore */
+ uint32_t cc;
+ bool cc_valid;
+
+ /* register cache to processor synchronization */
+ int (*read_core_reg)(struct target *target, unsigned int num);
+ int (*write_core_reg)(struct target *target, unsigned int num);
+};
+
+static struct stm8_common *target_to_stm8(struct target *target)
+{
+ return target->arch_info;
+}
+
static int stm8_adapter_read_memory(struct target *target,
uint32_t addr, int size, int count, void *buf)
{
diff --git a/src/target/stm8.h b/src/target/stm8.h
deleted file mode 100644
index 55e1071ab..000000000
--- a/src/target/stm8.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-
-/*
-* OpenOCD STM8 target driver
-* Copyright (C) 2017 Ake Rehnman
-* ake.rehnman(at)gmail.com
-*/
-
-#ifndef OPENOCD_TARGET_STM8_H
-#define OPENOCD_TARGET_STM8_H
-
-struct target;
-
-#define STM8_COMMON_MAGIC 0x53544D38U
-#define STM8_NUM_CORE_REGS 6
-
-struct stm8_common {
- unsigned int common_magic;
-
- void *arch_info;
- struct reg_cache *core_cache;
- uint32_t core_regs[STM8_NUM_CORE_REGS];
-
- /* working area for fastdata access */
- struct working_area *fast_data_area;
-
- bool swim_configured;
- bool bp_scanned;
- uint8_t num_hw_bpoints;
- uint8_t num_hw_bpoints_avail;
- struct stm8_comparator *hw_break_list;
- uint32_t blocksize;
- uint32_t flashstart;
- uint32_t flashend;
- uint32_t eepromstart;
- uint32_t eepromend;
- uint32_t optionstart;
- uint32_t optionend;
- bool enable_step_irq;
-
- bool enable_stm8l;
- uint32_t flash_cr2;
- uint32_t flash_ncr2;
- uint32_t flash_iapsr;
- uint32_t flash_dukr;
- uint32_t flash_pukr;
-
- /* cc value used for interrupt flags restore */
- uint32_t cc;
- bool cc_valid;
-
- /* register cache to processor synchronization */
- int (*read_core_reg)(struct target *target, unsigned int num);
- int (*write_core_reg)(struct target *target, unsigned int num);
-};
-
-static inline struct stm8_common *
-target_to_stm8(struct target *target)
-{
- return target->arch_info;
-}
-
-#endif /* OPENOCD_TARGET_STM8_H */
-----------------------------------------------------------------------
Summary of changes:
src/target/Makefile.am | 1 -
src/target/stm8.c | 49 +++++++++++++++++++++++++++++++++++++--
src/target/stm8.h | 63 --------------------------------------------------
3 files changed, 47 insertions(+), 66 deletions(-)
delete mode 100644 src/target/stm8.h
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 10:31:00
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 4d4c45cfd25703f39f9e2413b22d91a48c4b4565 (commit)
via bf66d95be2db83da2694d20970c4b8db8e5de969 (commit)
from 5bb7dbc2312f4ce84224720eb258ebcae2089e28 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 4d4c45cfd25703f39f9e2413b22d91a48c4b4565
Author: Tomas Vanek <va...@fb...>
Date: Fri Mar 21 21:56:39 2025 +0100
flash/nor/rp2xxx: define macro BOOTROM_MAGIC_MASK
and use it instead of magic value.
Change-Id: I5d006aaf990d4ef3a82e622b1e41cd2bfec359f7
Signed-off-by: Tomas Vanek <va...@fb...>
Reported-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8810
Reviewed-by: Antonio Borneo <bor...@gm...>
Tested-by: jenkins
diff --git a/src/flash/nor/rp2xxx.c b/src/flash/nor/rp2xxx.c
index 2b22e52eb..85c591104 100644
--- a/src/flash/nor/rp2xxx.c
+++ b/src/flash/nor/rp2xxx.c
@@ -16,6 +16,7 @@
#define BOOTROM_RP2040_MAGIC 0x01754d
/* this is 'M' 'u', 2 (version) */
#define BOOTROM_RP2350_MAGIC 0x02754d
+#define BOOTROM_MAGIC_MASK 0xffffff
#define BOOTROM_MAGIC_ADDR 0x00000010
#define MAKE_TAG(a, b) (((b)<<8) | a)
@@ -368,7 +369,7 @@ static int rp2xxx_lookup_rom_symbol(struct target *target, uint16_t tag, uint16_
return err;
/* Ignore version */
- magic &= 0xffffff;
+ magic &= BOOTROM_MAGIC_MASK;
if (magic == BOOTROM_RP2350_MAGIC) {
/* Distinguish old-style RP2350 ROM table (A0, and earlier A1 builds)
commit bf66d95be2db83da2694d20970c4b8db8e5de969
Author: Tomas Vanek <va...@fb...>
Date: Fri Mar 21 21:30:13 2025 +0100
flash/nor/rp2xxx: fix LOG_xxx messages
Use proper format specifiers for uint16_t and uint32_t arguments.
Use LOG_TARGET_DEBUG instead of target->cmd_name as a parameter.
Use command_print() in command handler.
Drop dots and new lines at end of messages.
Change-Id: I37c7d3680a352210b1d7e69f2c9b4ba0efe6ec15
Signed-off-by: Tomas Vanek <va...@fb...>
Reported-by: Antonio Borneo <bor...@gm...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8809
Tested-by: jenkins
diff --git a/src/flash/nor/rp2xxx.c b/src/flash/nor/rp2xxx.c
index 280f077c1..2b22e52eb 100644
--- a/src/flash/nor/rp2xxx.c
+++ b/src/flash/nor/rp2xxx.c
@@ -242,7 +242,7 @@ static int rp2040_lookup_rom_symbol(struct target *target, uint16_t tag, uint16_
if (err != ERROR_OK)
return err;
- LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04x", *symbol_out);
+ LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04" PRIx16, *symbol_out);
return ERROR_OK;
}
ptr_to_entry += 4;
@@ -287,7 +287,7 @@ static int rp2350_a0_lookup_symbol(struct target *target, uint16_t tag, uint16_t
if (err != ERROR_OK)
return err;
- LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04x", *symbol_out);
+ LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04" PRIx16, *symbol_out);
return ERROR_OK;
}
ptr_to_entry += 6;
@@ -347,7 +347,7 @@ static int rp2350_lookup_rom_symbol(struct target *target, uint32_t ptr_to_entry
if (err != ERROR_OK)
return err;
- LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04x", *symbol_out);
+ LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04" PRIx16, *symbol_out);
return ERROR_OK;
}
/* Skip past this entry */
@@ -398,38 +398,38 @@ static int rp2xxx_populate_rom_pointer_cache(struct target *target, struct rp2xx
err = rp2xxx_lookup_rom_symbol(target, FUNC_FLASH_EXIT_XIP,
symtype_func, &priv->jump_flash_exit_xip);
if (err != ERROR_OK) {
- LOG_ERROR("Function FUNC_FLASH_EXIT_XIP not found in RP2xxx ROM.");
+ LOG_ERROR("Function FUNC_FLASH_EXIT_XIP not found in RP2xxx ROM");
return err;
}
err = rp2xxx_lookup_rom_symbol(target, FUNC_CONNECT_INTERNAL_FLASH,
symtype_func, &priv->jump_connect_internal_flash);
if (err != ERROR_OK) {
- LOG_ERROR("Function FUNC_CONNECT_INTERNAL_FLASH not found in RP2xxx ROM.");
+ LOG_ERROR("Function FUNC_CONNECT_INTERNAL_FLASH not found in RP2xxx ROM");
return err;
}
err = rp2xxx_lookup_rom_symbol(target, FUNC_FLASH_RANGE_ERASE, symtype_func, &priv->jump_flash_range_erase);
if (err != ERROR_OK) {
- LOG_ERROR("Function FUNC_FLASH_RANGE_ERASE not found in RP2xxx ROM.");
+ LOG_ERROR("Function FUNC_FLASH_RANGE_ERASE not found in RP2xxx ROM");
return err;
}
err = rp2xxx_lookup_rom_symbol(target, FUNC_FLASH_RANGE_PROGRAM, symtype_func, &priv->jump_flash_range_program);
if (err != ERROR_OK) {
- LOG_ERROR("Function FUNC_FLASH_RANGE_PROGRAM not found in RP2xxx ROM.");
+ LOG_ERROR("Function FUNC_FLASH_RANGE_PROGRAM not found in RP2xxx ROM");
return err;
}
err = rp2xxx_lookup_rom_symbol(target, FUNC_FLASH_FLUSH_CACHE, symtype_func, &priv->jump_flush_cache);
if (err != ERROR_OK) {
- LOG_ERROR("Function FUNC_FLASH_FLUSH_CACHE not found in RP2xxx ROM.");
+ LOG_ERROR("Function FUNC_FLASH_FLUSH_CACHE not found in RP2xxx ROM");
return err;
}
err = rp2xxx_lookup_rom_symbol(target, FUNC_FLASH_ENTER_CMD_XIP, symtype_func, &priv->jump_enter_cmd_xip);
if (err != ERROR_OK) {
- LOG_ERROR("Function FUNC_FLASH_ENTER_CMD_XIP not found in RP2xxx ROM.");
+ LOG_ERROR("Function FUNC_FLASH_ENTER_CMD_XIP not found in RP2xxx ROM");
return err;
}
@@ -480,18 +480,17 @@ static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2xxx_flash
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
}
if (priv->ram_algo_space->size < batch_size) {
- LOG_ERROR("RAM code space too small for call batch size of %u\n", n_calls);
+ LOG_ERROR("RAM code space too small for call batch size of %u", n_calls);
return ERROR_BUF_TOO_SMALL;
}
- LOG_DEBUG("Calling batch of %u ROM functions:", n_calls);
+ LOG_TARGET_DEBUG(target, "Calling batch of %u ROM functions:", n_calls);
for (unsigned int i = 0; i < n_calls; ++i) {
LOG_DEBUG(" func @ %" PRIx32, calls[i].pc);
LOG_DEBUG(" sp = %" PRIx32, calls[i].sp);
for (unsigned int j = 0; j < 4; ++j)
- LOG_DEBUG(" a%d = %" PRIx32, j, calls[i].args[j]);
+ LOG_DEBUG(" a%u = %" PRIx32, j, calls[i].args[j]);
}
- LOG_DEBUG("Calling on core \"%s\"", target->cmd_name);
if (n_calls <= 0) {
LOG_DEBUG("Returning early from call of 0 ROM functions");
@@ -534,7 +533,7 @@ static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2xxx_flash
free(batch_bf);
if (err != ERROR_OK) {
- LOG_ERROR("Failed to write ROM batch algorithm to RAM code space\n");
+ LOG_ERROR("Failed to write ROM batch algorithm to RAM code space");
return err;
}
@@ -565,7 +564,7 @@ static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2xxx_flash
);
}
if (err != ERROR_OK) {
- LOG_ERROR("Failed to call ROM function batch\n");
+ LOG_ERROR("Failed to call ROM function batch");
/* This case is hit when loading new ROM images on FPGA, but can also be hit on real
hardware if you swap two devices with different ROM versions without restarting OpenOCD: */
LOG_ROM_SYMBOL_DEBUG("Repopulating ROM address cache after failed ROM call");
@@ -616,9 +615,9 @@ static int rp2350_init_accessctrl(struct target *target)
return ERROR_FAIL;
}
if (accessctrl_lock_reg & ACCESSCTRL_LOCK_DEBUG_BITS) {
- LOG_ERROR("ACCESSCTRL is locked, so can't reset permissions. Following steps might fail.\n");
+ LOG_ERROR("ACCESSCTRL is locked, so can't reset permissions. Following steps might fail");
} else {
- LOG_DEBUG("Reset ACCESSCTRL permissions via CFGRESET\n");
+ LOG_DEBUG("Reset ACCESSCTRL permissions via CFGRESET");
return target_write_u32(target, ACCESSCTRL_CFGRESET_OFFSET, ACCESSCTRL_WRITE_PASSWORD | 1u);
}
return ERROR_OK;
@@ -637,9 +636,9 @@ static int rp2350_init_arm_core0(struct target *target, struct rp2xxx_flash_bank
return retval;
}
- LOG_DEBUG("DSCSR: %08x\n", dscsr);
+ LOG_DEBUG("DSCSR: 0x%08" PRIx32, dscsr);
if (!(dscsr & DSCSR_CDS)) {
- LOG_DEBUG("Setting Current Domain Secure in DSCSR\n");
+ LOG_DEBUG("Setting Current Domain Secure in DSCSR");
retval = target_write_u32(target, DCB_DSCSR, (dscsr & ~DSCSR_CDSKEY) | DSCSR_CDS);
if (retval != ERROR_OK) {
LOG_ERROR("RP2350 init ARM core: DSCSR read failed");
@@ -664,12 +663,12 @@ static int rp2350_init_arm_core0(struct target *target, struct rp2xxx_flash_bank
rcp_init_code
);
if (err != ERROR_OK) {
- LOG_ERROR("Failed to load rcp_init algorithm into RAM\n");
+ LOG_ERROR("Failed to load rcp_init algorithm into RAM");
return ERROR_FAIL;
}
- LOG_DEBUG("Calling rcp_init on core \"%s\", code at 0x%" PRIx32 "\n",
- target->cmd_name, (uint32_t)priv->ram_algo_space->address);
+ LOG_TARGET_DEBUG(target, "Calling rcp_init, code at " TARGET_ADDR_FMT,
+ priv->ram_algo_space->address);
/* Actually call the function */
struct armv7m_algorithm alg_info;
@@ -684,7 +683,7 @@ static int rp2350_init_arm_core0(struct target *target, struct rp2xxx_flash_bank
&alg_info
);
if (err != ERROR_OK) {
- LOG_ERROR("Failed to invoke rcp_init\n");
+ LOG_ERROR("Failed to invoke rcp_init");
return err;
}
@@ -729,7 +728,7 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2xxx_flash_ba
BOOTROM_STATE_RESET_CURRENT_CORE
};
if (!priv->jump_bootrom_reset_state) {
- LOG_WARNING("RP2350 flash: no bootrom_reset_method\n");
+ LOG_WARNING("RP2350 flash: no bootrom_reset_method");
} else {
/* This is mainly required to clear varmulet_enclosing_cpu pointers on RISC-V, in case
an Arm -> RISC-V call has been interrupted (these pointers are used to handle
@@ -746,7 +745,7 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2xxx_flash_ba
/* Pass {0, 0} to set_varmulet_user_stack() to enable automatic emulation of Arm APIs
using the ROM's default stacks. Usually the bootrom does this before exiting to user
code, but it needs to be done manually when the USB bootloader has been interrupted. */
- LOG_DEBUG("Enabling default Arm emulator stacks for RISC-V ROM calls\n");
+ LOG_DEBUG("Enabling default Arm emulator stacks for RISC-V ROM calls");
struct working_area *set_stack_mem_args;
err = target_alloc_working_area(target, 2 * sizeof(uint32_t), &set_stack_mem_args);
if (err != ERROR_OK) {
@@ -771,7 +770,7 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2xxx_flash_ba
set_stack_register_args, ARRAY_SIZE(set_stack_register_args));
target_free_working_area(target, set_stack_mem_args);
if (err != ERROR_OK) {
- LOG_ERROR("Failed to initialise Arm emulation stacks for RISC-V: 0x%08" PRIx32, err);
+ LOG_ERROR("Failed to initialise Arm emulation stacks for RISC-V");
return err;
}
}
@@ -852,7 +851,7 @@ static void cleanup_after_raw_flash_cmd(struct target *target, struct rp2xxx_fla
static int rp2xxx_flash_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
{
- LOG_DEBUG("Writing %d bytes starting at 0x%" PRIx32, count, offset);
+ LOG_DEBUG("Writing %" PRIu32 " bytes starting at 0x%" PRIx32, count, offset);
struct rp2xxx_flash_bank *priv = bank->driver_priv;
struct target *target = bank->target;
@@ -882,7 +881,8 @@ static int rp2xxx_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
while (count > 0) {
uint32_t write_size = count > chunk_size ? chunk_size : count;
- LOG_DEBUG("Writing %d bytes to offset 0x%" PRIx32, write_size, offset);
+ LOG_DEBUG("Writing %" PRIu32 " bytes to offset 0x%" PRIx32,
+ write_size, offset);
err = target_write_buffer(target, bounce->address, write_size, buffer);
if (err != ERROR_OK) {
LOG_ERROR("Could not load data into target bounce buffer");
@@ -929,7 +929,8 @@ static int rp2xxx_flash_erase(struct flash_bank *bank, unsigned int first, unsig
uint32_t offset_start = bank->sectors[first].offset;
uint32_t offset_last = bank->sectors[last].offset + bank->sectors[last].size;
uint32_t length = offset_last - offset_start;
- LOG_DEBUG("erase %d bytes starting at 0x%" PRIx32, length, offset_start);
+ LOG_DEBUG("erase %" PRIu32 " bytes starting at 0x%" PRIx32,
+ length, offset_start);
int err = setup_for_raw_flash_cmd(target, priv);
if (err != ERROR_OK)
@@ -1328,7 +1329,7 @@ COMMAND_HANDLER(rp2xxx_rom_api_call_handler)
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[i + 1], args[i]);
if (target->state != TARGET_HALTED) {
- LOG_ERROR("Target not halted");
+ command_print(CMD, "Target not halted");
return ERROR_TARGET_NOT_HALTED;
}
@@ -1343,7 +1344,7 @@ COMMAND_HANDLER(rp2xxx_rom_api_call_handler)
uint16_t fc;
retval = rp2xxx_lookup_rom_symbol(target, tag, symtype_func, &fc);
if (retval != ERROR_OK) {
- command_print(CMD, "Function %.2s not found in RP2xxx ROM.",
+ command_print(CMD, "Function %.2s not found in RP2xxx ROM",
CMD_ARGV[0]);
goto cleanup_and_return;
}
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2xxx.c | 66 ++++++++++++++++++++++++++------------------------
1 file changed, 34 insertions(+), 32 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:47:07
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 5bb7dbc2312f4ce84224720eb258ebcae2089e28 (commit)
via 376d11c2e38303094976186d59502ab7d3073452 (commit)
from f039fe7f9d1ecfc1ca25574d5527c35db119e77b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 5bb7dbc2312f4ce84224720eb258ebcae2089e28
Author: Luke Wren <lu...@ra...>
Date: Fri Dec 13 21:56:45 2024 +0100
flash/nor/rp2xxx: fix flash operation after halt in RISC-V bootsel
Calling ROM API set_bootrom_stack() function allows ROM API functionality
after OpenOCD halt or reset halt in RISC-V bootloder (emulated ARM code)
Change-Id: I3b255738d61876e876a94207804d9cbe1a7593c2
Signed-off-by: Tomas Vanek <va...@fb...>
Signed-off-by: Luke Wren <lu...@ra...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8729
Tested-by: jenkins
diff --git a/src/flash/nor/rp2xxx.c b/src/flash/nor/rp2xxx.c
index fce501703..280f077c1 100644
--- a/src/flash/nor/rp2xxx.c
+++ b/src/flash/nor/rp2xxx.c
@@ -26,6 +26,7 @@
#define FUNC_FLASH_FLUSH_CACHE MAKE_TAG('F', 'C')
#define FUNC_FLASH_ENTER_CMD_XIP MAKE_TAG('C', 'X')
#define FUNC_BOOTROM_STATE_RESET MAKE_TAG('S', 'R')
+#define FUNC_BOOTROM_SET_STACK MAKE_TAG('S', 'S')
#define FUNC_FLASH_RESET_ADDRESS_TRANS MAKE_TAG('R', 'A')
/* ROM table flags for RP2350 A1 ROM onwards */
@@ -201,6 +202,7 @@ struct rp2xxx_flash_bank {
uint16_t jump_flash_reset_address_trans;
uint16_t jump_enter_cmd_xip;
uint16_t jump_bootrom_reset_state;
+ uint16_t jump_bootrom_set_varm_stack;
char dev_name[20];
bool size_override;
@@ -445,6 +447,15 @@ static int rp2xxx_populate_rom_pointer_cache(struct target *target, struct rp2xx
LOG_WARNING("Function FUNC_BOOTROM_STATE_RESET not found in RP2xxx ROM. (probably an RP2350 A0)");
}
+ if (!is_arm(target_to_arm(target))) {
+ err = rp2xxx_lookup_rom_symbol(target, FUNC_BOOTROM_SET_STACK, symtype_func,
+ &priv->jump_bootrom_set_varm_stack);
+ if (err != ERROR_OK) {
+ priv->jump_bootrom_set_varm_stack = 0;
+ LOG_WARNING("Function FUNC_BOOTROM_SET_STACK not found in RP2xxx ROM. (probably an RP2350 A0)");
+ }
+ }
+
err = rp2xxx_lookup_rom_symbol(target, FUNC_FLASH_RESET_ADDRESS_TRANS,
symtype_func, &priv->jump_flash_reset_address_trans);
if (err != ERROR_OK) {
@@ -720,6 +731,9 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2xxx_flash_ba
if (!priv->jump_bootrom_reset_state) {
LOG_WARNING("RP2350 flash: no bootrom_reset_method\n");
} else {
+ /* This is mainly required to clear varmulet_enclosing_cpu pointers on RISC-V, in case
+ an Arm -> RISC-V call has been interrupted (these pointers are used to handle
+ reentrant calls to the ROM emulator) */
LOG_DEBUG("Clearing core 0 ROM state");
err = rp2xxx_call_rom_func(target, priv, priv->jump_bootrom_reset_state,
reset_args, ARRAY_SIZE(reset_args));
@@ -728,6 +742,39 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2xxx_flash_ba
return err;
}
}
+ if (!is_arm(target_to_arm(target)) && priv->jump_bootrom_set_varm_stack) {
+ /* Pass {0, 0} to set_varmulet_user_stack() to enable automatic emulation of Arm APIs
+ using the ROM's default stacks. Usually the bootrom does this before exiting to user
+ code, but it needs to be done manually when the USB bootloader has been interrupted. */
+ LOG_DEBUG("Enabling default Arm emulator stacks for RISC-V ROM calls\n");
+ struct working_area *set_stack_mem_args;
+ err = target_alloc_working_area(target, 2 * sizeof(uint32_t), &set_stack_mem_args);
+ if (err != ERROR_OK) {
+ LOG_ERROR("Failed to allocate memory for arguments to set_varmulet_user_stack()");
+ return err;
+ }
+
+ err = target_write_u32(target, set_stack_mem_args->address, 0);
+ if (err == ERROR_OK)
+ err = target_write_u32(target, set_stack_mem_args->address + 4, 0);
+
+ if (err != ERROR_OK) {
+ LOG_ERROR("Failed to initialise memory arguments for set_varmulet_user_stack()");
+ target_free_working_area(target, set_stack_mem_args);
+ return err;
+ }
+
+ uint32_t set_stack_register_args[1] = {
+ set_stack_mem_args->address
+ };
+ err = rp2xxx_call_rom_func(target, priv, priv->jump_bootrom_set_varm_stack,
+ set_stack_register_args, ARRAY_SIZE(set_stack_register_args));
+ target_free_working_area(target, set_stack_mem_args);
+ if (err != ERROR_OK) {
+ LOG_ERROR("Failed to initialise Arm emulation stacks for RISC-V: 0x%08" PRIx32, err);
+ return err;
+ }
+ }
}
LOG_DEBUG("Connecting flash IOs and issuing XIP exit sequence to flash");
commit 376d11c2e38303094976186d59502ab7d3073452
Author: Tomas Vanek <va...@fb...>
Date: Sat Aug 17 16:21:06 2024 +0200
tcl/target/rp2040: add flash size override and reset init event
Allow flash size override and suppress flash size detection
by setting FLASHSIZE Tcl variable.
reset-init event calls 'connect XIP' ROM API function to make
flash content accessible at the XIP mapping memory area.
Ported from rp2350.cfg
Change-Id: I9b352b1ef6d4c6d4b78a6b61e900ce01355c8eff
Signed-off-by: Tomas Vanek <va...@fb...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8461
Reviewed-by: Jonathan Bell <jon...@ra...>
Tested-by: jenkins
diff --git a/tcl/target/rp2040.cfg b/tcl/target/rp2040.cfg
index 5fae390b4..f64d4322b 100644
--- a/tcl/target/rp2040.cfg
+++ b/tcl/target/rp2040.cfg
@@ -20,6 +20,14 @@ if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE 0x10000
}
+# Nonzero FLASHSIZE supresses QSPI flash size detection
+if { [info exists FLASHSIZE] } {
+ set _FLASHSIZE $FLASHSIZE
+} else {
+ # Detect QSPI flash size based on flash ID or SFDP
+ set _FLASHSIZE 0
+}
+
if { [info exists CPUTAPID] } {
set _CPUTAPID $CPUTAPID
} else {
@@ -74,6 +82,10 @@ if { $_USE_CORE != 1 } {
target create $_TARGETNAME_0 cortex_m -dap $_CHIPNAME.dap0 -coreid 0
# srst does not exist; use SYSRESETREQ to perform a soft reset
$_TARGETNAME_0 cortex_m reset_config sysresetreq
+
+ # After a rescue reset and fi BOOTSEL is halted connect the flash to enable
+ # reads from the XIP cached mapping area
+ $_TARGETNAME_0 configure -event reset-init { rp2xxx rom_api_call 0 CX }
}
# core 1
@@ -95,11 +107,11 @@ if { $_USE_CORE == 1 } {
} else {
set _FLASH_TARGET $_TARGETNAME_0
}
-# 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).
-$_FLASH_TARGET configure -work-area-phys 0x20010000 -work-area-size $_WORKAREASIZE -work-area-backup 1
+# QSPI flash size detection during gdb connect requires to back-up RAM
+set _WKA_BACKUP [expr { $_FLASHSIZE == 0 }]
+$_FLASH_TARGET configure -work-area-phys 0x20010000 -work-area-size $_WORKAREASIZE -work-area-backup $_WKA_BACKUP
set _FLASHNAME $_CHIPNAME.flash
-flash bank $_FLASHNAME rp2xxx 0x10000000 0 0 0 $_FLASH_TARGET
+flash bank $_FLASHNAME rp2xxx 0x10000000 $_FLASHSIZE 0 0 $_FLASH_TARGET
if { $_BOTH_CORES } {
# Alias to ensure gdb connecting to core 1 gets the correct memory map
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2xxx.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++
tcl/target/rp2040.cfg | 20 ++++++++++++++++----
2 files changed, 63 insertions(+), 4 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:46:13
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via f039fe7f9d1ecfc1ca25574d5527c35db119e77b (commit)
from a9608871692be6cda4d73ae837b4313747370ff8 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit f039fe7f9d1ecfc1ca25574d5527c35db119e77b
Author: Tomas Vanek <va...@fb...>
Date: Fri Aug 16 23:35:06 2024 +0200
flash/nor/rp2xxx: fix endianness error
struct rp2xxx_rom_call_batch_record consists of uint32_t in the host
endianness. Therefore it should be converted to the target endianness
not just simply copied by target_write_buffer().
Concatenate algo code, converted batch records and terminator
to the host resident buffer and copy it at once to the target and
save some adapter turnaround times.
While on it remove typedef rp2xxx_rom_call_batch_record_t
Change-Id: I0e698396003869bee5dde4141d48ddd7d62b3cbc
Signed-off-by: Tomas Vanek <va...@fb...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8460
Reviewed-by: Jonathan Bell <jon...@ra...>
Tested-by: jenkins
diff --git a/src/flash/nor/rp2xxx.c b/src/flash/nor/rp2xxx.c
index 5d0255b61..fce501703 100644
--- a/src/flash/nor/rp2xxx.c
+++ b/src/flash/nor/rp2xxx.c
@@ -179,11 +179,11 @@ static const uint8_t rp2xxx_rom_call_batch_algo_riscv[ROM_CALL_BATCH_ALGO_SIZE_B
// <_args>:
};
-typedef struct rp2xxx_rom_call_batch_record {
+struct rp2xxx_rom_call_batch_record {
uint32_t pc;
uint32_t sp;
uint32_t args[4];
-} rp2xxx_rom_call_batch_record_t;
+};
struct rp2xxx_flash_bank {
bool probed; /* flag indicating successful flash probe */
@@ -457,18 +457,18 @@ static int rp2xxx_populate_rom_pointer_cache(struct target *target, struct rp2xx
// Call a list of PC + SP + r0-r3 function call tuples with a single OpenOCD
// algorithm invocation, to amortise the algorithm overhead over multiple calls:
static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2xxx_flash_bank *priv,
- rp2xxx_rom_call_batch_record_t *calls, unsigned int n_calls)
+ struct rp2xxx_rom_call_batch_record *calls, unsigned int n_calls)
{
- // Note +1 is for the null terminator
- unsigned int batch_words = 1 + (ROM_CALL_BATCH_ALGO_SIZE_BYTES +
- n_calls * sizeof(rp2xxx_rom_call_batch_record_t)
- ) / sizeof(uint32_t);
+ // Note + sizeof(uint32_t) is for the null terminator
+ unsigned int batch_size = ROM_CALL_BATCH_ALGO_SIZE_BYTES
+ + n_calls * sizeof(struct rp2xxx_rom_call_batch_record)
+ + sizeof(uint32_t);
if (!priv->ram_algo_space) {
LOG_ERROR("No RAM code space allocated for ROM call");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
}
- if (priv->ram_algo_space->size < batch_words * sizeof(uint32_t)) {
+ if (priv->ram_algo_space->size < batch_size) {
LOG_ERROR("RAM code space too small for call batch size of %u\n", n_calls);
return ERROR_BUF_TOO_SMALL;
}
@@ -501,32 +501,31 @@ static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2xxx_flash
algo_code = rp2xxx_rom_call_batch_algo_riscv;
}
+ uint8_t *batch_bf = malloc(batch_size);
+ if (!batch_bf) {
+ LOG_ERROR("No memory for batch buffer");
+ return ERROR_FAIL;
+ }
+ memcpy(batch_bf, algo_code, ROM_CALL_BATCH_ALGO_SIZE_BYTES);
+ unsigned int words = n_calls * sizeof(struct rp2xxx_rom_call_batch_record)
+ / sizeof(uint32_t);
+ target_buffer_set_u32_array(target,
+ &batch_bf[ROM_CALL_BATCH_ALGO_SIZE_BYTES], words,
+ (const uint32_t *)calls);
+ /* Null terminator */
+ target_buffer_set_u32(target, &batch_bf[batch_size - sizeof(uint32_t)], 0);
+
int err = target_write_buffer(target,
priv->ram_algo_space->address,
- ROM_CALL_BATCH_ALGO_SIZE_BYTES,
- algo_code
+ batch_size,
+ batch_bf
);
+ free(batch_bf);
+
if (err != ERROR_OK) {
LOG_ERROR("Failed to write ROM batch algorithm to RAM code space\n");
return err;
}
- err = target_write_buffer(target,
- priv->ram_algo_space->address + ROM_CALL_BATCH_ALGO_SIZE_BYTES,
- n_calls * sizeof(rp2xxx_rom_call_batch_record_t),
- (const uint8_t *)calls
- );
- if (err != ERROR_OK) {
- LOG_ERROR("Failed to write ROM batch records to RAM code space\n");
- return err;
- }
- err = target_write_u32(target,
- priv->ram_algo_space->address + (batch_words - 1) * sizeof(uint32_t),
- 0
- );
- if (err != ERROR_OK) {
- LOG_ERROR("Failed to write null terminator for ROM batch records\n");
- return err;
- }
// Call into the ROM batch algorithm -- this will in turn call each ROM
// call specified by the batch records.
@@ -579,7 +578,7 @@ static int rp2xxx_call_rom_func(struct target *target, struct rp2xxx_flash_bank
}
target_addr_t stacktop = priv->stack->address + priv->stack->size;
- rp2xxx_rom_call_batch_record_t call = {
+ struct rp2xxx_rom_call_batch_record call = {
.pc = func_offset,
.sp = stacktop
};
@@ -732,7 +731,7 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2xxx_flash_ba
}
LOG_DEBUG("Connecting flash IOs and issuing XIP exit sequence to flash");
- rp2xxx_rom_call_batch_record_t calls[2] = {
+ struct rp2xxx_rom_call_batch_record calls[2] = {
{
.pc = priv->jump_connect_internal_flash,
.sp = priv->stack->address + priv->stack->size
@@ -759,7 +758,7 @@ static int rp2xxx_invalidate_cache_restore_xip(struct target *target, struct rp2
LOG_DEBUG("Flushing flash cache after write behind");
- rp2xxx_rom_call_batch_record_t finishing_calls[2] = {
+ struct rp2xxx_rom_call_batch_record finishing_calls[2] = {
{
.pc = priv->jump_flush_cache,
.sp = priv->stack->address + priv->stack->size
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2xxx.c | 59 +++++++++++++++++++++++++-------------------------
1 file changed, 29 insertions(+), 30 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:45:22
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via a9608871692be6cda4d73ae837b4313747370ff8 (commit)
from d29c1c6d6df31f64ae5593babc65cfdffa312def (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit a9608871692be6cda4d73ae837b4313747370ff8
Author: Tomas Vanek <va...@fb...>
Date: Fri Aug 16 22:53:36 2024 +0200
flash/nor/rp2xxx: drop couple of Java-like const
The compiler knows what variable remains constant during its lifetime
and there is no need to emphasise constantness.
Change-Id: Ib515f96a3c77afea87274f33b8ccac7a71bfb932
Signed-off-by: Tomas Vanek <va...@fb...>
Reviewed-on: https://review.openocd.org/c/openocd/+/8459
Tested-by: jenkins
Reviewed-by: Jonathan Bell <jon...@ra...>
diff --git a/src/flash/nor/rp2xxx.c b/src/flash/nor/rp2xxx.c
index 909d3f14d..5d0255b61 100644
--- a/src/flash/nor/rp2xxx.c
+++ b/src/flash/nor/rp2xxx.c
@@ -223,7 +223,7 @@ static int rp2040_lookup_rom_symbol(struct target *target, uint16_t tag, uint16_
}
uint16_t ptr_to_entry;
- const unsigned int offset_magic_to_table_ptr = flags == RT_FLAG_DATA ? 6 : 4;
+ unsigned int offset_magic_to_table_ptr = flags == RT_FLAG_DATA ? 6 : 4;
int err = target_read_u16(target, BOOTROM_MAGIC_ADDR + offset_magic_to_table_ptr, &ptr_to_entry);
if (err != ERROR_OK)
return err;
@@ -390,8 +390,8 @@ static int rp2xxx_lookup_rom_symbol(struct target *target, uint16_t tag, uint16_
static int rp2xxx_populate_rom_pointer_cache(struct target *target, struct rp2xxx_flash_bank *priv)
{
- const uint16_t symtype_func = is_arm(target_to_arm(target))
- ? RT_FLAG_FUNC_ARM_SEC : RT_FLAG_FUNC_RISCV;
+ uint16_t symtype_func = is_arm(target_to_arm(target))
+ ? RT_FLAG_FUNC_ARM_SEC : RT_FLAG_FUNC_RISCV;
int err;
err = rp2xxx_lookup_rom_symbol(target, FUNC_FLASH_EXIT_XIP,
symtype_func, &priv->jump_flash_exit_xip);
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2xxx.c | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:44:50
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via d29c1c6d6df31f64ae5593babc65cfdffa312def (commit)
from 9fce121366c86e77e84b9d20c7d1c7dbb38710d5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit d29c1c6d6df31f64ae5593babc65cfdffa312def
Author: Tomas Vanek <va...@fb...>
Date: Wed Aug 14 17:43:13 2024 +0200
flash/nor/rp2xxx: minor code improvements
Add error messages and proper error propagation.
Type cleaning.
Use saved chip id.
Cosmetics: separating lines added.
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: I151e684e1fbfc9476ec429036caf85f4c9329547
Reviewed-on: https://review.openocd.org/c/openocd/+/8457
Tested-by: jenkins
Reviewed-by: Jonathan Bell <jon...@ra...>
diff --git a/src/flash/nor/rp2xxx.c b/src/flash/nor/rp2xxx.c
index e58fc8a29..909d3f14d 100644
--- a/src/flash/nor/rp2xxx.c
+++ b/src/flash/nor/rp2xxx.c
@@ -233,11 +233,13 @@ static int rp2040_lookup_rom_symbol(struct target *target, uint16_t tag, uint16_
err = target_read_u16(target, ptr_to_entry, &entry_tag);
if (err != ERROR_OK)
return err;
+
if (entry_tag == tag) {
/* 16 bit symbol is next */
err = target_read_u16(target, ptr_to_entry + 2, symbol_out);
if (err != ERROR_OK)
return err;
+
LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04x", *symbol_out);
return ERROR_OK;
}
@@ -277,10 +279,12 @@ static int rp2350_a0_lookup_symbol(struct target *target, uint16_t tag, uint16_t
err = target_read_u16(target, ptr_to_entry, &entry_tag);
if (err != ERROR_OK)
return err;
+
if (entry_tag == tag) {
err = target_read_u16(target, ptr_to_entry + 2, symbol_out);
if (err != ERROR_OK)
return err;
+
LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04x", *symbol_out);
return ERROR_OK;
}
@@ -303,9 +307,10 @@ static int rp2350_lookup_rom_symbol(struct target *target, uint32_t ptr_to_entry
while (true) {
uint16_t entry_tag, entry_flags;
- uint32_t err = target_read_u16(target, ptr_to_entry, &entry_tag);
+ int err = target_read_u16(target, ptr_to_entry, &entry_tag);
if (err != ERROR_OK)
return err;
+
if (entry_tag == 0) {
*symbol_out = 0;
return ERROR_FAIL;
@@ -315,6 +320,7 @@ static int rp2350_lookup_rom_symbol(struct target *target, uint32_t ptr_to_entry
err = target_read_u16(target, ptr_to_entry, &entry_flags);
if (err != ERROR_OK)
return err;
+
ptr_to_entry += 2;
uint16_t matching_flags = flags & entry_flags;
@@ -338,6 +344,7 @@ static int rp2350_lookup_rom_symbol(struct target *target, uint32_t ptr_to_entry
err = target_read_u16(target, ptr_to_entry, symbol_out);
if (err != ERROR_OK)
return err;
+
LOG_ROM_SYMBOL_DEBUG(" -> found: 0x%04x", *symbol_out);
return ERROR_OK;
}
@@ -426,18 +433,23 @@ static int rp2xxx_populate_rom_pointer_cache(struct target *target, struct rp2xx
// From this point are optional functions which do not exist on e.g. RP2040
// or pre-production RP2350 ROM versions:
+ if (IS_RP2040(priv->id)) {
+ priv->jump_bootrom_reset_state = 0;
+ priv->jump_flash_reset_address_trans = 0;
+ return ERROR_OK;
+ }
err = rp2xxx_lookup_rom_symbol(target, FUNC_BOOTROM_STATE_RESET, symtype_func, &priv->jump_bootrom_reset_state);
if (err != ERROR_OK) {
priv->jump_bootrom_reset_state = 0;
- LOG_WARNING("Function FUNC_BOOTROM_STATE_RESET not found in RP2xxx ROM. (probably an RP2040 or an RP2350 A0)");
+ LOG_WARNING("Function FUNC_BOOTROM_STATE_RESET not found in RP2xxx ROM. (probably an RP2350 A0)");
}
err = rp2xxx_lookup_rom_symbol(target, FUNC_FLASH_RESET_ADDRESS_TRANS,
symtype_func, &priv->jump_flash_reset_address_trans);
if (err != ERROR_OK) {
priv->jump_flash_reset_address_trans = 0;
- LOG_WARNING("Function FUNC_FLASH_RESET_ADDRESS_TRANS not found in RP2xxx ROM. (probably an RP2040 or an RP2350 A0)");
+ LOG_WARNING("Function FUNC_FLASH_RESET_ADDRESS_TRANS not found in RP2xxx ROM. (probably an RP2350 A0)");
}
return ERROR_OK;
}
@@ -465,7 +477,7 @@ static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2xxx_flash
for (unsigned int i = 0; i < n_calls; ++i) {
LOG_DEBUG(" func @ %" PRIx32, calls[i].pc);
LOG_DEBUG(" sp = %" PRIx32, calls[i].sp);
- for (int j = 0; j < 4; ++j)
+ for (unsigned int j = 0; j < 4; ++j)
LOG_DEBUG(" a%d = %" PRIx32, j, calls[i].args[j]);
}
LOG_DEBUG("Calling on core \"%s\"", target->cmd_name);
@@ -607,14 +619,22 @@ static int rp2350_init_arm_core0(struct target *target, struct rp2xxx_flash_bank
// Flash algorithms (and the RCP init stub called by this function) must
// run in the Secure state, so flip the state now before attempting to
// execute any code on the core.
+ int retval;
uint32_t dscsr;
- (void)target_read_u32(target, DCB_DSCSR, &dscsr);
+ retval = target_read_u32(target, DCB_DSCSR, &dscsr);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("RP2350 init ARM core: DSCSR read failed");
+ return retval;
+ }
+
LOG_DEBUG("DSCSR: %08x\n", dscsr);
if (!(dscsr & DSCSR_CDS)) {
LOG_DEBUG("Setting Current Domain Secure in DSCSR\n");
- (void)target_write_u32(target, DCB_DSCSR, (dscsr & ~DSCSR_CDSKEY) | DSCSR_CDS);
- (void)target_read_u32(target, DCB_DSCSR, &dscsr);
- LOG_DEBUG("DSCSR*: %08x\n", dscsr);
+ retval = target_write_u32(target, DCB_DSCSR, (dscsr & ~DSCSR_CDSKEY) | DSCSR_CDS);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("RP2350 init ARM core: DSCSR read failed");
+ return retval;
+ }
}
if (!priv->stack) {
@@ -682,8 +702,7 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2xxx_flash_ba
}
}
- // hacky RP2350 check -- either RISC-V or v8-M
- if (is_arm(target_to_arm(target)) ? target_to_arm(target)->arch == ARM_ARCH_V8M : true) {
+ if (IS_RP2350(priv->id)) {
err = rp2350_init_accessctrl(target);
if (err != ERROR_OK) {
LOG_ERROR("Failed to init ACCESSCTRL before ROM call");
@@ -861,16 +880,16 @@ static int rp2xxx_flash_erase(struct flash_bank *bank, unsigned int first, unsig
return ERROR_TARGET_NOT_HALTED;
}
- uint32_t start_addr = bank->sectors[first].offset;
- uint32_t length = bank->sectors[last].offset + bank->sectors[last].size - start_addr;
- LOG_DEBUG("erase %d bytes starting at 0x%" PRIx32, length, start_addr);
+ uint32_t offset_start = bank->sectors[first].offset;
+ uint32_t offset_last = bank->sectors[last].offset + bank->sectors[last].size;
+ uint32_t length = offset_last - offset_start;
+ LOG_DEBUG("erase %d bytes starting at 0x%" PRIx32, length, offset_start);
int err = setup_for_raw_flash_cmd(target, priv);
if (err != ERROR_OK)
goto cleanup_and_return;
- uint32_t offset_next = bank->sectors[first].offset;
- uint32_t offset_last = bank->sectors[last].offset + bank->sectors[last].size;
+ uint32_t offset_next = offset_start;
/* Break erase into multiple calls to avoid timeout on large erase. Choose 128k chunk which has
fairly low ROM call overhead and empirically seems to avoid the default keep_alive() limit
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2xxx.c | 49 ++++++++++++++++++++++++++++++++++---------------
1 file changed, 34 insertions(+), 15 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:43:21
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 9fce121366c86e77e84b9d20c7d1c7dbb38710d5 (commit)
from 63f94bbab864d78e19ff86eda0836a5ff35b4a1b (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 9fce121366c86e77e84b9d20c7d1c7dbb38710d5
Author: Tomas Vanek <va...@fb...>
Date: Wed Aug 14 17:14:17 2024 +0200
doc: document changes in rp2xxx flash driver
Namely the driver name changed from rp2040_flash and added RP2350 support.
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: I2ec9e62786002d71f655dbe0edc9f2e9ac4141b7
Reviewed-on: https://review.openocd.org/c/openocd/+/8456
Tested-by: jenkins
diff --git a/doc/openocd.texi b/doc/openocd.texi
index 9ff524b74..32a2895ec 100644
--- a/doc/openocd.texi
+++ b/doc/openocd.texi
@@ -7872,15 +7872,29 @@ locked, but can still mass erase the whole flash.
@end deffn
@end deffn
-@deffn {Flash Driver} {rp2040}
-Supports RP2040 "Raspberry Pi Pico" microcontroller.
-RP2040 is a dual-core device with two CM0+ cores. Both cores share the same
-Flash/RAM/MMIO address space. Non-volatile storage is achieved with an
-external QSPI flash; a Boot ROM provides helper functions.
+@deffn {Flash Driver} {rp2xxx}
+Supports RP2040 "Raspberry Pi Pico" microcontroller and RP2350 Pico 2
+RP2040 is a dual-core device with two CM0+ cores.
+RP2350 is a dual-core device with two slots switched to either Cortex-M33
+or Hazard3 RISC-V core.
+Both cores share the same Flash/RAM/MMIO address space.
+Non-volatile storage is achieved with an external QSPI flash;
+a Boot ROM provides helper functions.
@example
-flash bank $_FLASHNAME rp2040_flash $_FLASHBASE $_FLASHSIZE 1 32 $_TARGETNAME
+flash bank $_FLASHNAME rp2xxx $_FLASHBASE $_FLASHSIZE 0 0 $_TARGETNAME
@end example
+
+@deffn {Command} {rp2xxx rom_api_call} fc [p0 [p1 [p2 [p3]]]]
+A utility for calling ROM API function with two characters lookup code
+@var{fc} and up to 4 optional parameters @var{p0 p1 p2 p3}.
+The call is supported on the target where the flash bank is configured
+(core0).
+@end deffn
+
+@deffn {Command} {rp2xxx _switch_target} old_target new_target
+A command used internally by rp2350.cfg when the core type is switched.
+@end deffn
@end deffn
@deffn {Flash Driver} {rsl10}
-----------------------------------------------------------------------
Summary of changes:
doc/openocd.texi | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:42:38
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 63f94bbab864d78e19ff86eda0836a5ff35b4a1b (commit)
from c914cfceab54245fae1aefd70e20d0ed549f9308 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 63f94bbab864d78e19ff86eda0836a5ff35b4a1b
Author: Tomas Vanek <va...@fb...>
Date: Wed Aug 14 11:29:21 2024 +0200
flash/nor/rp2040: refactoring: change rp2040 to rp2xxx
While on it use calloc() instead of malloc()/memset()
Drop useless implementation of rp2040_flash_free_driver_priv()
- exactly same as default_flash_free_driver_priv()
Code style fixes forced by checkpatch
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: I5c56c4a7d586c0dcab164a45e8f6200ea9a3bd1d
Reviewed-on: https://review.openocd.org/c/openocd/+/8455
Tested-by: jenkins
diff --git a/src/flash/nor/Makefile.am b/src/flash/nor/Makefile.am
index 147807fba..7a81b282b 100644
--- a/src/flash/nor/Makefile.am
+++ b/src/flash/nor/Makefile.am
@@ -59,7 +59,7 @@ NOR_DRIVERS = \
%D%/psoc6.c \
%D%/qn908x.c \
%D%/renesas_rpchf.c \
- %D%/rp2040.c \
+ %D%/rp2xxx.c \
%D%/rsl10.c \
%D%/sfdp.c \
%D%/sh_qspi.c \
diff --git a/src/flash/nor/driver.h b/src/flash/nor/driver.h
index 794566f12..3b57ef9ff 100644
--- a/src/flash/nor/driver.h
+++ b/src/flash/nor/driver.h
@@ -289,7 +289,7 @@ extern const struct flash_driver psoc5lp_nvl_flash;
extern const struct flash_driver psoc6_flash;
extern const struct flash_driver qn908x_flash;
extern const struct flash_driver renesas_rpchf_flash;
-extern const struct flash_driver rp2040_flash;
+extern const struct flash_driver rp2xxx_flash;
extern const struct flash_driver rsl10_flash;
extern const struct flash_driver sh_qspi_flash;
extern const struct flash_driver sim3x_flash;
diff --git a/src/flash/nor/drivers.c b/src/flash/nor/drivers.c
index 67d86243b..3770bfbd3 100644
--- a/src/flash/nor/drivers.c
+++ b/src/flash/nor/drivers.c
@@ -66,7 +66,7 @@ static const struct flash_driver * const flash_drivers[] = {
&psoc6_flash,
&qn908x_flash,
&renesas_rpchf_flash,
- &rp2040_flash,
+ &rp2xxx_flash,
&sh_qspi_flash,
&sim3x_flash,
&stellaris_flash,
diff --git a/src/flash/nor/rp2040.c b/src/flash/nor/rp2xxx.c
similarity index 94%
rename from src/flash/nor/rp2040.c
rename to src/flash/nor/rp2xxx.c
index 514cea8b6..e58fc8a29 100644
--- a/src/flash/nor/rp2040.c
+++ b/src/flash/nor/rp2xxx.c
@@ -185,14 +185,14 @@ typedef struct rp2xxx_rom_call_batch_record {
uint32_t args[4];
} rp2xxx_rom_call_batch_record_t;
-struct rp2040_flash_bank {
+struct rp2xxx_flash_bank {
bool probed; /* flag indicating successful flash probe */
uint32_t id; /* cached SYSINFO CHIP_ID */
struct working_area *stack; /* stack used by Boot ROM calls */
/* static code scratchpad used for RAM algorithms -- allocated in advance
so that higher-level calls can just grab all remaining workarea: */
struct working_area *ram_algo_space;
- /* function jump table populated by rp2040_flash_probe() */
+ /* function jump table populated by rp2xxx_flash_probe() */
uint16_t jump_flash_exit_xip;
uint16_t jump_connect_internal_flash;
uint16_t jump_flash_range_erase;
@@ -381,7 +381,7 @@ static int rp2xxx_lookup_rom_symbol(struct target *target, uint16_t tag, uint16_
return ERROR_FAIL;
}
-static int rp2xxx_populate_rom_pointer_cache(struct target *target, struct rp2040_flash_bank *priv)
+static int rp2xxx_populate_rom_pointer_cache(struct target *target, struct rp2xxx_flash_bank *priv)
{
const uint16_t symtype_func = is_arm(target_to_arm(target))
? RT_FLAG_FUNC_ARM_SEC : RT_FLAG_FUNC_RISCV;
@@ -444,7 +444,7 @@ static int rp2xxx_populate_rom_pointer_cache(struct target *target, struct rp204
// Call a list of PC + SP + r0-r3 function call tuples with a single OpenOCD
// algorithm invocation, to amortise the algorithm overhead over multiple calls:
-static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2040_flash_bank *priv,
+static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2xxx_flash_bank *priv,
rp2xxx_rom_call_batch_record_t *calls, unsigned int n_calls)
{
// Note +1 is for the null terminator
@@ -556,7 +556,7 @@ static int rp2xxx_call_rom_func_batch(struct target *target, struct rp2040_flash
}
// Call a single ROM function, using the default algorithm stack.
-static int rp2xxx_call_rom_func(struct target *target, struct rp2040_flash_bank *priv,
+static int rp2xxx_call_rom_func(struct target *target, struct rp2xxx_flash_bank *priv,
uint16_t func_offset, uint32_t argdata[], unsigned int n_args)
{
assert(n_args <= 4); /* only allow register arguments -- capped at just 4 on Arm */
@@ -602,7 +602,7 @@ static int rp2350_init_accessctrl(struct target *target)
return ERROR_OK;
}
-static int rp2350_init_arm_core0(struct target *target, struct rp2040_flash_bank *priv)
+static int rp2350_init_arm_core0(struct target *target, struct rp2xxx_flash_bank *priv)
{
// Flash algorithms (and the RCP init stub called by this function) must
// run in the Secure state, so flip the state now before attempting to
@@ -661,7 +661,7 @@ static int rp2350_init_arm_core0(struct target *target, struct rp2040_flash_bank
return err;
}
-static int setup_for_raw_flash_cmd(struct target *target, struct rp2040_flash_bank *priv)
+static int setup_for_raw_flash_cmd(struct target *target, struct rp2xxx_flash_bank *priv)
{
int err = ERROR_OK;
@@ -725,14 +725,14 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2040_flash_ba
};
err = rp2xxx_call_rom_func_batch(target, priv, calls, 2);
if (err != ERROR_OK) {
- LOG_ERROR("RP2040 flash: failed to exit flash XIP mode");
+ LOG_ERROR("RP2xxx flash: failed to exit flash XIP mode");
return err;
}
return ERROR_OK;
}
-static int rp2xxx_invalidate_cache_restore_xip(struct target *target, struct rp2040_flash_bank *priv)
+static int rp2xxx_invalidate_cache_restore_xip(struct target *target, struct rp2xxx_flash_bank *priv)
{
// Flash content has changed. We can now do a bit of poking to make
// the new flash contents visible to us via memory-mapped (XIP) interface
@@ -763,12 +763,12 @@ static int rp2xxx_invalidate_cache_restore_xip(struct target *target, struct rp2
int retval = rp2xxx_call_rom_func_batch(target, priv, finishing_calls, num_finishing_calls);
if (retval != ERROR_OK)
- LOG_ERROR("RP2040 write: failed to flush flash cache/restore XIP");
+ LOG_ERROR("RP2xxx: failed to flush flash cache/restore XIP");
return retval;
}
-static void cleanup_after_raw_flash_cmd(struct target *target, struct rp2040_flash_bank *priv)
+static void cleanup_after_raw_flash_cmd(struct target *target, struct rp2xxx_flash_bank *priv)
{
/* OpenOCD is prone to trashing work-area allocations on target state
transitions, which leaves us with stale work area pointers in our
@@ -785,11 +785,11 @@ static void cleanup_after_raw_flash_cmd(struct target *target, struct rp2040_fla
}
}
-static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
+static int rp2xxx_flash_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t offset, uint32_t count)
{
LOG_DEBUG("Writing %d bytes starting at 0x%" PRIx32, count, offset);
- struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct rp2xxx_flash_bank *priv = bank->driver_priv;
struct target *target = bank->target;
if (target->state != TARGET_HALTED) {
@@ -851,9 +851,9 @@ cleanup_and_return:
return err;
}
-static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
+static int rp2xxx_flash_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
{
- struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct rp2xxx_flash_bank *priv = bank->driver_priv;
struct target *target = bank->target;
if (target->state != TARGET_HALTED) {
@@ -863,7 +863,7 @@ static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsig
uint32_t start_addr = bank->sectors[first].offset;
uint32_t length = bank->sectors[last].offset + bank->sectors[last].size - start_addr;
- LOG_DEBUG("RP2040 erase %d bytes starting at 0x%" PRIx32, length, start_addr);
+ LOG_DEBUG("erase %d bytes starting at 0x%" PRIx32, length, start_addr);
int err = setup_for_raw_flash_cmd(target, priv);
if (err != ERROR_OK)
@@ -1064,7 +1064,7 @@ static int rp2xxx_spi_tx_rx(struct flash_bank *bank,
unsigned int dummy_len,
uint8_t *rx, unsigned int rx_len)
{
- struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct rp2xxx_flash_bank *priv = bank->driver_priv;
struct target *target = bank->target;
if (IS_RP2040(priv->id))
@@ -1078,7 +1078,7 @@ static int rp2xxx_spi_tx_rx(struct flash_bank *bank,
static int rp2xxx_read_sfdp_block(struct flash_bank *bank, uint32_t addr,
unsigned int words, uint32_t *buffer)
{
- struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct rp2xxx_flash_bank *priv = bank->driver_priv;
uint8_t cmd[4] = { SPIFLASH_READ_SFDP };
uint8_t data[4 * words + priv->sfdp_dummy_detect];
@@ -1106,9 +1106,9 @@ static int rp2xxx_read_sfdp_block(struct flash_bank *bank, uint32_t addr,
return retval;
}
-static int rp2040_flash_probe(struct flash_bank *bank)
+static int rp2xxx_flash_probe(struct flash_bank *bank)
{
- struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct rp2xxx_flash_bank *priv = bank->driver_priv;
struct target *target = bank->target;
int retval = target_read_u32(target, RP2XXX_SYSINFO_CHIP_ID, &priv->id);
@@ -1202,31 +1202,23 @@ static int rp2040_flash_probe(struct flash_bank *bank)
return ERROR_OK;
}
-static int rp2040_flash_auto_probe(struct flash_bank *bank)
+static int rp2xxx_flash_auto_probe(struct flash_bank *bank)
{
- struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct rp2xxx_flash_bank *priv = bank->driver_priv;
if (priv->probed)
return ERROR_OK;
- return rp2040_flash_probe(bank);
-}
-
-static void rp2040_flash_free_driver_priv(struct flash_bank *bank)
-{
- free(bank->driver_priv);
- bank->driver_priv = NULL;
+ return rp2xxx_flash_probe(bank);
}
/* -----------------------------------------------------------------------------
Driver boilerplate */
-FLASH_BANK_COMMAND_HANDLER(rp2040_flash_bank_command)
+FLASH_BANK_COMMAND_HANDLER(rp2xxx_flash_bank_command)
{
- struct rp2040_flash_bank *priv;
- priv = malloc(sizeof(struct rp2040_flash_bank));
- memset(priv, 0, sizeof(struct rp2040_flash_bank));
- priv->probed = false;
+ struct rp2xxx_flash_bank *priv;
+ priv = calloc(1, sizeof(struct rp2xxx_flash_bank));
priv->size_override = bank->size != 0;
/* Set up driver_priv */
@@ -1236,7 +1228,7 @@ FLASH_BANK_COMMAND_HANDLER(rp2040_flash_bank_command)
}
-COMMAND_HANDLER(rp2040_rom_api_call_handler)
+COMMAND_HANDLER(rp2xxx_rom_api_call_handler)
{
if (CMD_ARGC < 1)
return ERROR_COMMAND_SYNTAX_ERROR;
@@ -1245,7 +1237,7 @@ COMMAND_HANDLER(rp2040_rom_api_call_handler)
struct flash_bank *bank;
for (bank = flash_bank_list(); bank; bank = bank->next) {
- if (bank->driver != &rp2040_flash)
+ if (bank->driver != &rp2xxx_flash)
continue;
if (bank->target == target)
@@ -1258,7 +1250,7 @@ COMMAND_HANDLER(rp2040_rom_api_call_handler)
return ERROR_FAIL;
}
- int retval = rp2040_flash_auto_probe(bank);
+ int retval = rp2xxx_flash_auto_probe(bank);
if (retval != ERROR_OK) {
command_print(CMD, "auto_probe failed");
return retval;
@@ -1275,7 +1267,7 @@ COMMAND_HANDLER(rp2040_rom_api_call_handler)
return ERROR_TARGET_NOT_HALTED;
}
- struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct rp2xxx_flash_bank *priv = bank->driver_priv;
retval = setup_for_raw_flash_cmd(target, priv);
if (retval != ERROR_OK)
goto cleanup_and_return;
@@ -1304,7 +1296,7 @@ cleanup_and_return:
return retval;
}
-COMMAND_HANDLER(rp2040_switch_target_handler)
+COMMAND_HANDLER(rp2xxx_switch_target_handler)
{
if (CMD_ARGC != 2)
return ERROR_COMMAND_SYNTAX_ERROR;
@@ -1323,10 +1315,10 @@ COMMAND_HANDLER(rp2040_switch_target_handler)
struct flash_bank *bank;
for (bank = flash_bank_list(); bank; bank = bank->next) {
- if (bank->driver == &rp2040_flash) {
+ if (bank->driver == &rp2xxx_flash) {
if (bank->target == old_target) {
bank->target = new_target;
- struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct rp2xxx_flash_bank *priv = bank->driver_priv;
priv->probed = false;
return ERROR_OK;
} else if (bank->target == new_target) {
@@ -1340,44 +1332,44 @@ COMMAND_HANDLER(rp2040_switch_target_handler)
return ERROR_FAIL;
}
-static const struct command_registration rp2040_exec_command_handlers[] = {
+static const struct command_registration rp2xxx_exec_command_handlers[] = {
{
.name = "rom_api_call",
.mode = COMMAND_EXEC,
.help = "arbitrary ROM API call",
.usage = "fc [p0 [p1 [p2 [p3]]]]",
- .handler = rp2040_rom_api_call_handler,
+ .handler = rp2xxx_rom_api_call_handler,
},
{
.name = "_switch_target",
.mode = COMMAND_EXEC,
.help = "internal use",
.usage = "old_target new_target",
- .handler = rp2040_switch_target_handler,
+ .handler = rp2xxx_switch_target_handler,
},
COMMAND_REGISTRATION_DONE
};
-static const struct command_registration rp2040_command_handler[] = {
+static const struct command_registration rp2xxx_command_handler[] = {
{
.name = "rp2xxx",
.mode = COMMAND_ANY,
.help = "rp2xxx flash controller commands",
.usage = "",
- .chain = rp2040_exec_command_handlers,
+ .chain = rp2xxx_exec_command_handlers,
},
COMMAND_REGISTRATION_DONE
};
-const struct flash_driver rp2040_flash = {
- .name = "rp2040_flash",
- .commands = rp2040_command_handler,
- .flash_bank_command = rp2040_flash_bank_command,
- .erase = rp2040_flash_erase,
- .write = rp2040_flash_write,
+const struct flash_driver rp2xxx_flash = {
+ .name = "rp2xxx",
+ .commands = rp2xxx_command_handler,
+ .flash_bank_command = rp2xxx_flash_bank_command,
+ .erase = rp2xxx_flash_erase,
+ .write = rp2xxx_flash_write,
.read = default_flash_read,
- .probe = rp2040_flash_probe,
- .auto_probe = rp2040_flash_auto_probe,
+ .probe = rp2xxx_flash_probe,
+ .auto_probe = rp2xxx_flash_auto_probe,
.erase_check = default_flash_blank_check,
- .free_driver_priv = rp2040_flash_free_driver_priv
+ .free_driver_priv = default_flash_free_driver_priv
};
diff --git a/tcl/target/rp2040.cfg b/tcl/target/rp2040.cfg
index 5e78c6931..5fae390b4 100644
--- a/tcl/target/rp2040.cfg
+++ b/tcl/target/rp2040.cfg
@@ -99,7 +99,7 @@ if { $_USE_CORE == 1 } {
# 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
set _FLASHNAME $_CHIPNAME.flash
-flash bank $_FLASHNAME rp2040_flash 0x10000000 0 0 0 $_FLASH_TARGET
+flash bank $_FLASHNAME rp2xxx 0x10000000 0 0 0 $_FLASH_TARGET
if { $_BOTH_CORES } {
# Alias to ensure gdb connecting to core 1 gets the correct memory map
diff --git a/tcl/target/rp2350.cfg b/tcl/target/rp2350.cfg
index dc26cde19..b7617acd4 100644
--- a/tcl/target/rp2350.cfg
+++ b/tcl/target/rp2350.cfg
@@ -160,7 +160,7 @@ if { [info exists _FLASH_TARGET] } {
echo "Info : $_CHIPNAME.flash will be handled by the active one of $_FLASH_TARGET and $_TARGETNAME_RV0 cores"
}
set _FLASHNAME $_CHIPNAME.flash
- flash bank $_FLASHNAME rp2040_flash 0x10000000 $_FLASHSIZE 0 0 $_FLASH_TARGET
+ flash bank $_FLASHNAME rp2xxx 0x10000000 $_FLASHSIZE 0 0 $_FLASH_TARGET
}
if { [info exists _TARGETNAME_1] } {
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/Makefile.am | 2 +-
src/flash/nor/driver.h | 2 +-
src/flash/nor/drivers.c | 2 +-
src/flash/nor/{rp2040.c => rp2xxx.c} | 102 ++++++++++++++++-------------------
tcl/target/rp2040.cfg | 2 +-
tcl/target/rp2350.cfg | 2 +-
6 files changed, 52 insertions(+), 60 deletions(-)
rename src/flash/nor/{rp2040.c => rp2xxx.c} (94%)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:41:55
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via c914cfceab54245fae1aefd70e20d0ed549f9308 (commit)
via 26729aa8b089230bf0896c32df9a4b7ae3ef6fee (commit)
from 20d1d4405d73fe47efc07cb109454c088a8ecbc8 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit c914cfceab54245fae1aefd70e20d0ed549f9308
Author: Tomas Vanek <va...@fb...>
Date: Wed Aug 14 10:47:36 2024 +0200
flash/nor/rp2040: refactor finalizing calls and use them after erase
Invalidate cache and restore flash XIP mode after erase and also
in error cleanup after write/erase.
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: If7e0c2d75f50f923e6bcbf0aa7bab53fe91b6cc8
Reviewed-on: https://review.openocd.org/c/openocd/+/8454
Tested-by: jenkins
diff --git a/src/flash/nor/rp2040.c b/src/flash/nor/rp2040.c
index c28bc8509..514cea8b6 100644
--- a/src/flash/nor/rp2040.c
+++ b/src/flash/nor/rp2040.c
@@ -732,6 +732,42 @@ static int setup_for_raw_flash_cmd(struct target *target, struct rp2040_flash_ba
return ERROR_OK;
}
+static int rp2xxx_invalidate_cache_restore_xip(struct target *target, struct rp2040_flash_bank *priv)
+{
+ // Flash content has changed. We can now do a bit of poking to make
+ // the new flash contents visible to us via memory-mapped (XIP) interface
+ // in the 0x1... memory region.
+
+ LOG_DEBUG("Flushing flash cache after write behind");
+
+ rp2xxx_rom_call_batch_record_t finishing_calls[2] = {
+ {
+ .pc = priv->jump_flush_cache,
+ .sp = priv->stack->address + priv->stack->size
+ },
+ {
+ .sp = priv->stack->address + priv->stack->size
+ },
+ };
+
+ int num_finishing_calls = 1;
+ // Note on RP2350 it's not *required* to call flash_enter_cmd_xip, since
+ // the ROM leaves flash XIPable by default in between direct-mode
+ // accesses
+ if (IS_RP2040(priv->id)) {
+ finishing_calls[num_finishing_calls++].pc = priv->jump_enter_cmd_xip;
+ } else if (priv->jump_flash_reset_address_trans) {
+ // Note flash_reset_address_trans function does not exist on older devices
+ finishing_calls[num_finishing_calls++].pc = priv->jump_flash_reset_address_trans;
+ }
+
+ int retval = rp2xxx_call_rom_func_batch(target, priv, finishing_calls, num_finishing_calls);
+ if (retval != ERROR_OK)
+ LOG_ERROR("RP2040 write: failed to flush flash cache/restore XIP");
+
+ return retval;
+}
+
static void cleanup_after_raw_flash_cmd(struct target *target, struct rp2040_flash_bank *priv)
{
/* OpenOCD is prone to trashing work-area allocations on target state
@@ -805,45 +841,12 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
count -= write_size;
}
- if (err != ERROR_OK)
- goto cleanup_and_return;
-
- // Flash is successfully programmed. We can now do a bit of poking to make
- // the new flash contents visible to us via memory-mapped (XIP) interface
- // in the 0x1... memory region.
- //
- // Note on RP2350 it's not *required* to call flash_enter_cmd_xip, since
- // the ROM leaves flash XIPable by default in between direct-mode
- // accesses, but there's no harm in calling it anyway.
-
- LOG_DEBUG("Flushing flash cache after write behind");
- err = rp2xxx_call_rom_func(target, priv, priv->jump_flush_cache, NULL, 0);
-
- rp2xxx_rom_call_batch_record_t finishing_calls[3] = {
- {
- .pc = priv->jump_flush_cache,
- .sp = priv->stack->address + priv->stack->size
- },
- {
- .pc = priv->jump_enter_cmd_xip,
- .sp = priv->stack->address + priv->stack->size
- },
- {
- .pc = priv->jump_flash_reset_address_trans,
- .sp = priv->stack->address + priv->stack->size
- }
- };
- // Note the last function does not exist on older devices:
- int num_finishing_calls = priv->jump_flash_reset_address_trans ? 3 : 2;
-
- err = rp2xxx_call_rom_func_batch(target, priv, finishing_calls, num_finishing_calls);
- if (err != ERROR_OK) {
- LOG_ERROR("RP2040 write: failed to flush flash cache");
- goto cleanup_and_return;
- }
cleanup_and_return:
target_free_working_area(target, bounce);
+ /* Don't propagate error or user gets fooled the flash write failed */
+ (void)rp2xxx_invalidate_cache_restore_xip(target, priv);
+
cleanup_after_raw_flash_cmd(target, priv);
return err;
}
@@ -912,6 +915,9 @@ static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsig
cleanup_and_return:
+ /* Don't propagate error or user gets fooled the flash erase failed */
+ (void)rp2xxx_invalidate_cache_restore_xip(target, priv);
+
cleanup_after_raw_flash_cmd(target, priv);
return err;
}
commit 26729aa8b089230bf0896c32df9a4b7ae3ef6fee
Author: Tomas Vanek <va...@fb...>
Date: Wed Aug 14 10:41:55 2024 +0200
flash/nor/rp2040: improve flash write buffer size computation
While on it:
Define the names for the fixed flash page/sector sizes and use them
instead of magic values.
Fix memory leak on error return.
Partially backported from former upstream rp2040.c
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: If51c912f4d381ee47756a70f616ecdbee1ac0da7
Reviewed-on: https://review.openocd.org/c/openocd/+/8453
Tested-by: jenkins
diff --git a/src/flash/nor/rp2040.c b/src/flash/nor/rp2040.c
index 65c1e095b..c28bc8509 100644
--- a/src/flash/nor/rp2040.c
+++ b/src/flash/nor/rp2040.c
@@ -73,6 +73,9 @@
#define RP2XXX_MAX_ALGO_STACK_USAGE 1024
#define RP2XXX_MAX_RAM_ALGO_SIZE 1024
+#define RP2XXX_ROM_API_FIXED_FLASH_PAGE 256
+#define RP2XXX_ROM_API_FIXED_FLASH_SECTOR 4096
+
// Calling bootrom functions on Arm RP2350 requires the redundancy
// coprocessor (RCP) to be initialised. Usually this is done first thing by
// the bootrom, but the debugger may skip this, e.g. by resetting the cores
@@ -758,17 +761,19 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
return ERROR_TARGET_NOT_HALTED;
}
- struct working_area *bounce;
+ struct working_area *bounce = NULL;
int err = setup_for_raw_flash_cmd(target, priv);
if (err != ERROR_OK)
goto cleanup_and_return;
- // Allocate as much memory as possible, rounded down to a whole number of flash pages
- const unsigned int chunk_size = target_get_working_area_avail(target) & ~0xffu;
- if (chunk_size == 0 || target_alloc_working_area(target, chunk_size, &bounce) != ERROR_OK) {
+ unsigned int avail_pages = target_get_working_area_avail(target) / RP2XXX_ROM_API_FIXED_FLASH_PAGE;
+ /* We try to allocate working area rounded down to device page size,
+ * al least 1 page, at most the write data size */
+ unsigned int chunk_size = MIN(MAX(avail_pages, 1) * RP2XXX_ROM_API_FIXED_FLASH_PAGE, count);
+ err = target_alloc_working_area(target, chunk_size, &bounce);
+ if (err != ERROR_OK) {
LOG_ERROR("Could not allocate bounce buffer for flash programming. Can't continue");
- err = ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
goto cleanup_and_return;
}
@@ -787,7 +792,8 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
bounce->address, /* data */
write_size /* count */
};
- err = rp2xxx_call_rom_func(target, priv, priv->jump_flash_range_program, args, ARRAY_SIZE(args));
+ err = rp2xxx_call_rom_func(target, priv, priv->jump_flash_range_program,
+ args, ARRAY_SIZE(args));
keep_alive();
if (err != ERROR_OK) {
LOG_ERROR("Failed to invoke flash programming code on target");
@@ -798,7 +804,6 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
offset += write_size;
count -= write_size;
}
- target_free_working_area(target, bounce);
if (err != ERROR_OK)
goto cleanup_and_return;
@@ -837,6 +842,8 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
goto cleanup_and_return;
}
cleanup_and_return:
+ target_free_working_area(target, bounce);
+
cleanup_after_raw_flash_cmd(target, priv);
return err;
}
@@ -1113,8 +1120,8 @@ static int rp2040_flash_probe(struct flash_bank *bank)
return retval;
/* the Boot ROM flash_range_program() routine requires page alignment */
- bank->write_start_alignment = 256;
- bank->write_end_alignment = 256;
+ bank->write_start_alignment = RP2XXX_ROM_API_FIXED_FLASH_PAGE;
+ bank->write_end_alignment = RP2XXX_ROM_API_FIXED_FLASH_PAGE;
uint32_t flash_id = 0;
if (priv->size_override) {
@@ -1168,7 +1175,7 @@ static int rp2040_flash_probe(struct flash_bank *bank)
return ERROR_FLASH_BANK_INVALID;
}
- bank->num_sectors = bank->size / 4096;
+ bank->num_sectors = bank->size / RP2XXX_ROM_API_FIXED_FLASH_SECTOR;
if (priv->size_override) {
LOG_INFO("%s, QSPI Flash size override = %u KiB in %u sectors",
@@ -1180,7 +1187,7 @@ static int rp2040_flash_probe(struct flash_bank *bank)
}
free(bank->sectors);
- bank->sectors = alloc_block_array(0, 4096, bank->num_sectors);
+ bank->sectors = alloc_block_array(0, RP2XXX_ROM_API_FIXED_FLASH_SECTOR, bank->num_sectors);
if (!bank->sectors)
return ERROR_FAIL;
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2040.c | 105 +++++++++++++++++++++++++++----------------------
1 file changed, 59 insertions(+), 46 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:41:14
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 20d1d4405d73fe47efc07cb109454c088a8ecbc8 (commit)
from 2e1a76368eed7aac8054e6ccb7c8104bad421a70 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 20d1d4405d73fe47efc07cb109454c088a8ecbc8
Author: Tomas Vanek <va...@fb...>
Date: Wed Aug 14 09:39:42 2024 +0200
flash/nor/rp2040: add missing TARGET_HALTED checks
Flash erase and write require this guard, unfortunately it is also
partially needed in the flash probe.
Partially backported from former upstream rp2040.c
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: Ie8a240e66c3ed68e08f872cbbfdd90a6d80e1f1e
Reviewed-on: https://review.openocd.org/c/openocd/+/8452
Tested-by: jenkins
diff --git a/src/flash/nor/rp2040.c b/src/flash/nor/rp2040.c
index 0e592f912..65c1e095b 100644
--- a/src/flash/nor/rp2040.c
+++ b/src/flash/nor/rp2040.c
@@ -752,6 +752,12 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
struct rp2040_flash_bank *priv = bank->driver_priv;
struct target *target = bank->target;
+
+ if (target->state != TARGET_HALTED) {
+ LOG_ERROR("Target not halted");
+ return ERROR_TARGET_NOT_HALTED;
+ }
+
struct working_area *bounce;
int err = setup_for_raw_flash_cmd(target, priv);
@@ -839,6 +845,12 @@ static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsig
{
struct rp2040_flash_bank *priv = bank->driver_priv;
struct target *target = bank->target;
+
+ if (target->state != TARGET_HALTED) {
+ LOG_ERROR("Target not halted");
+ return ERROR_TARGET_NOT_HALTED;
+ }
+
uint32_t start_addr = bank->sectors[first].offset;
uint32_t length = bank->sectors[last].offset + bank->sectors[last].size - start_addr;
LOG_DEBUG("RP2040 erase %d bytes starting at 0x%" PRIx32, length, start_addr);
@@ -1109,6 +1121,11 @@ static int rp2040_flash_probe(struct flash_bank *bank)
priv->spi_dev.name = "size override";
LOG_DEBUG("SPI flash autodetection disabled, using configured size");
} else {
+ if (target->state != TARGET_HALTED) {
+ LOG_ERROR("Target not halted");
+ return ERROR_TARGET_NOT_HALTED;
+ }
+
bank->size = 0;
(void)setup_for_raw_flash_cmd(target, priv);
@@ -1240,6 +1257,11 @@ COMMAND_HANDLER(rp2040_rom_api_call_handler)
for (unsigned int i = 0; i + 1 < CMD_ARGC && i < ARRAY_SIZE(args); i++)
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[i + 1], args[i]);
+ if (target->state != TARGET_HALTED) {
+ LOG_ERROR("Target not halted");
+ return ERROR_TARGET_NOT_HALTED;
+ }
+
struct rp2040_flash_bank *priv = bank->driver_priv;
retval = setup_for_raw_flash_cmd(target, priv);
if (retval != ERROR_OK)
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2040.c | 22 ++++++++++++++++++++++
1 file changed, 22 insertions(+)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:37:20
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 2e1a76368eed7aac8054e6ccb7c8104bad421a70 (commit)
from 22dfd0efaddaa70baf9e65aff661554c4497909a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 2e1a76368eed7aac8054e6ccb7c8104bad421a70
Author: Tomas Vanek <va...@fb...>
Date: Wed Aug 14 09:10:31 2024 +0200
flash/nor/rp2040: detect flash size including SFDP
Also keep size override by FLASHSIZE Tcl variable possible.
Partially backported from former upstream rp2040.c
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: I224c3644450e8b46e35714bfc5436219ffdee563
Reviewed-on: https://review.openocd.org/c/openocd/+/8451
Tested-by: jenkins
diff --git a/src/flash/nor/rp2040.c b/src/flash/nor/rp2040.c
index 15a04fbb0..0e592f912 100644
--- a/src/flash/nor/rp2040.c
+++ b/src/flash/nor/rp2040.c
@@ -9,6 +9,7 @@
#include <target/algorithm.h>
#include <target/armv7m.h>
#include "spi.h"
+#include "sfdp.h"
#include <target/cortex_m.h>
/* this is 'M' 'u', 1 (version) */
@@ -43,6 +44,32 @@
#define ACCESSCTRL_CFGRESET_OFFSET 0x40060008u
#define ACCESSCTRL_WRITE_PASSWORD 0xacce0000u
+#define RP2040_SSI_DR0 0x18000060
+#define RP2040_QSPI_CTRL 0x4001800c
+
+#define RP2040_QSPI_CTRL_OUTOVER_MASK (3ul << 8)
+#define RP2040_QSPI_CTRL_OUTOVER_LOW (2ul << 8)
+#define RP2040_QSPI_CTRL_OUTOVER_HIGH (3ul << 8)
+
+#define RP2350_QMI_DIRECT_CSR 0x400d0000
+#define RP2350_QMI_DIRECT_TX 0x400d0004
+#define RP2350_QMI_DIRECT_RX 0x400d0008
+
+#define RP2350_QMI_DIRECT_CSR_EN BIT(0)
+#define RP2350_QMI_DIRECT_CSR_ASSERT_CS0N BIT(2)
+#define RP2350_QMI_DIRECT_TX_NOPUSH BIT(20)
+#define RP2350_QMI_DIRECT_TX_OE BIT(19)
+
+#define RP2XXX_SYSINFO_CHIP_ID 0x40000000
+#define RP2XXX_CHIP_ID_PART_MANUFACTURER(id) ((id) & 0x0fffffff)
+#define RP2XXX_CHIP_ID_MANUFACTURER 0x493
+#define RP2XXX_MK_PART(part) (((part) << 12) | (RP2XXX_CHIP_ID_MANUFACTURER << 1) | 1)
+#define RP2040_CHIP_ID_PART 0x0002
+#define IS_RP2040(id) (RP2XXX_CHIP_ID_PART_MANUFACTURER(id) == RP2XXX_MK_PART(RP2040_CHIP_ID_PART))
+#define RP2350_CHIP_ID_PART 0x0004
+#define IS_RP2350(id) (RP2XXX_CHIP_ID_PART_MANUFACTURER(id) == RP2XXX_MK_PART(RP2350_CHIP_ID_PART))
+#define RP2XXX_CHIP_ID_REVISION(id) ((id) >> 28)
+
#define RP2XXX_MAX_ALGO_STACK_USAGE 1024
#define RP2XXX_MAX_RAM_ALGO_SIZE 1024
@@ -156,10 +183,9 @@ typedef struct rp2xxx_rom_call_batch_record {
} rp2xxx_rom_call_batch_record_t;
struct rp2040_flash_bank {
- /* flag indicating successful flash probe */
- bool probed;
- /* stack used by Boot ROM calls */
- struct working_area *stack;
+ bool probed; /* flag indicating successful flash probe */
+ uint32_t id; /* cached SYSINFO CHIP_ID */
+ struct working_area *stack; /* stack used by Boot ROM calls */
/* static code scratchpad used for RAM algorithms -- allocated in advance
so that higher-level calls can just grab all remaining workarea: */
struct working_area *ram_algo_space;
@@ -172,6 +198,11 @@ struct rp2040_flash_bank {
uint16_t jump_flash_reset_address_trans;
uint16_t jump_enter_cmd_xip;
uint16_t jump_bootrom_reset_state;
+
+ char dev_name[20];
+ bool size_override;
+ struct flash_device spi_dev; /* detected model of SPI flash */
+ unsigned int sfdp_dummy, sfdp_dummy_detect;
};
#ifndef LOG_ROM_SYMBOL_DEBUG
@@ -869,37 +900,276 @@ cleanup_and_return:
/* -----------------------------------------------------------------------------
Driver probing etc */
+
+static int rp2040_ssel_active(struct target *target, bool active)
+{
+ uint32_t state = active ? RP2040_QSPI_CTRL_OUTOVER_LOW : RP2040_QSPI_CTRL_OUTOVER_HIGH;
+ uint32_t val;
+
+ int err = target_read_u32(target, RP2040_QSPI_CTRL, &val);
+ if (err != ERROR_OK)
+ return err;
+
+ val = (val & ~RP2040_QSPI_CTRL_OUTOVER_MASK) | state;
+
+ err = target_write_u32(target, RP2040_QSPI_CTRL, val);
+ if (err != ERROR_OK)
+ return err;
+
+ return ERROR_OK;
+}
+
+static int rp2040_spi_tx_rx(struct target *target,
+ const uint8_t *tx, unsigned int tx_len,
+ unsigned int dummy_len,
+ uint8_t *rx, unsigned int rx_len)
+{
+ int retval, retval2;
+
+ retval = rp2040_ssel_active(target, true);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("QSPI select failed");
+ goto deselect;
+ }
+
+ unsigned int tx_cnt = 0;
+ unsigned int rx_cnt = 0;
+ unsigned int xfer_len = tx_len + dummy_len + rx_len;
+ while (rx_cnt < xfer_len) {
+ int in_flight = tx_cnt - rx_cnt;
+ if (tx_cnt < xfer_len && in_flight < 14) {
+ uint32_t dr = tx_cnt < tx_len ? tx[tx_cnt] : 0;
+ retval = target_write_u32(target, RP2040_SSI_DR0, dr);
+ if (retval != ERROR_OK)
+ break;
+
+ tx_cnt++;
+ continue;
+ }
+ uint32_t dr;
+ retval = target_read_u32(target, RP2040_SSI_DR0, &dr);
+ if (retval != ERROR_OK)
+ break;
+
+ if (rx_cnt >= tx_len + dummy_len)
+ rx[rx_cnt - tx_len - dummy_len] = (uint8_t)dr;
+
+ rx_cnt++;
+ }
+
+deselect:
+ retval2 = rp2040_ssel_active(target, false);
+
+ if (retval != ERROR_OK) {
+ LOG_ERROR("QSPI Tx/Rx failed");
+ return retval;
+ }
+ if (retval2 != ERROR_OK)
+ LOG_ERROR("QSPI deselect failed");
+
+ return retval2;
+}
+
+static int rp2350_spi_tx_rx(struct target *target,
+ const uint8_t *tx, unsigned int tx_len,
+ unsigned int dummy_len,
+ uint8_t *rx, unsigned int rx_len)
+{
+ uint32_t direct_csr;
+ int retval = target_read_u32(target, RP2350_QMI_DIRECT_CSR, &direct_csr);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("QMI DIRECT_CSR read failed");
+ return retval;
+ }
+ direct_csr |= RP2350_QMI_DIRECT_CSR_EN | RP2350_QMI_DIRECT_CSR_ASSERT_CS0N;
+ retval = target_write_u32(target, RP2350_QMI_DIRECT_CSR, direct_csr);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("QMI DIRECT mode enable failed");
+ goto deselect;
+ }
+
+ unsigned int tx_cnt = 0;
+ unsigned int rx_cnt = 0;
+ unsigned int xfer_len = tx_len + dummy_len + rx_len;
+ while (tx_cnt < xfer_len || rx_cnt < rx_len) {
+ int in_flight = tx_cnt - tx_len - dummy_len - rx_cnt;
+ if (tx_cnt < xfer_len && in_flight < 4) {
+ uint32_t tx_cmd;
+ if (tx_cnt < tx_len)
+ tx_cmd = tx[tx_cnt] | RP2350_QMI_DIRECT_TX_NOPUSH | RP2350_QMI_DIRECT_TX_OE;
+ else if (tx_cnt < tx_len + dummy_len)
+ tx_cmd = RP2350_QMI_DIRECT_TX_NOPUSH;
+ else
+ tx_cmd = 0;
+
+ retval = target_write_u32(target, RP2350_QMI_DIRECT_TX, tx_cmd);
+ if (retval != ERROR_OK)
+ break;
+
+ tx_cnt++;
+ continue;
+ }
+ if (rx_cnt < rx_len) {
+ uint32_t dr;
+ retval = target_read_u32(target, RP2350_QMI_DIRECT_RX, &dr);
+ if (retval != ERROR_OK)
+ break;
+
+ rx[rx_cnt] = (uint8_t)dr;
+ rx_cnt++;
+ }
+ }
+
+deselect:
+ direct_csr &= ~(RP2350_QMI_DIRECT_CSR_EN | RP2350_QMI_DIRECT_CSR_ASSERT_CS0N);
+ int retval2 = target_write_u32(target, RP2350_QMI_DIRECT_CSR, direct_csr);
+
+ if (retval != ERROR_OK) {
+ LOG_ERROR("QSPI Tx/Rx failed");
+ return retval;
+ }
+ if (retval2 != ERROR_OK)
+ LOG_ERROR("QMI DIRECT mode disable failed");
+
+ return retval2;
+}
+
+static int rp2xxx_spi_tx_rx(struct flash_bank *bank,
+ const uint8_t *tx, unsigned int tx_len,
+ unsigned int dummy_len,
+ uint8_t *rx, unsigned int rx_len)
+{
+ struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct target *target = bank->target;
+
+ if (IS_RP2040(priv->id))
+ return rp2040_spi_tx_rx(target, tx, tx_len, dummy_len, rx, rx_len);
+ else if (IS_RP2350(priv->id))
+ return rp2350_spi_tx_rx(target, tx, tx_len, dummy_len, rx, rx_len);
+ else
+ return ERROR_FAIL;
+}
+
+static int rp2xxx_read_sfdp_block(struct flash_bank *bank, uint32_t addr,
+ unsigned int words, uint32_t *buffer)
+{
+ struct rp2040_flash_bank *priv = bank->driver_priv;
+
+ uint8_t cmd[4] = { SPIFLASH_READ_SFDP };
+ uint8_t data[4 * words + priv->sfdp_dummy_detect];
+
+ h_u24_to_be(&cmd[1], addr);
+
+ int retval = rp2xxx_spi_tx_rx(bank, cmd, sizeof(cmd), priv->sfdp_dummy,
+ data, 4 * words + priv->sfdp_dummy_detect);
+ if (retval != ERROR_OK)
+ return retval;
+
+ if (priv->sfdp_dummy_detect) {
+ for (unsigned int i = 0; i < priv->sfdp_dummy_detect; i++)
+ if (le_to_h_u32(&data[i]) == SFDP_MAGIC) {
+ priv->sfdp_dummy_detect = 0;
+ priv->sfdp_dummy = i;
+ break;
+ }
+ for (unsigned int i = 0; i < words; i++)
+ buffer[i] = le_to_h_u32(&data[4 * i + priv->sfdp_dummy]);
+ } else {
+ for (unsigned int i = 0; i < words; i++)
+ buffer[i] = le_to_h_u32(&data[4 * i]);
+ }
+ return retval;
+}
+
static int rp2040_flash_probe(struct flash_bank *bank)
{
struct rp2040_flash_bank *priv = bank->driver_priv;
struct target *target = bank->target;
- int err = rp2xxx_populate_rom_pointer_cache(target, priv);
- if (err != ERROR_OK)
- return err;
+ int retval = target_read_u32(target, RP2XXX_SYSINFO_CHIP_ID, &priv->id);
+ if (retval != ERROR_OK) {
+ LOG_ERROR("SYSINFO CHIP_ID read failed");
+ return retval;
+ }
+ if (!IS_RP2040(priv->id) && !IS_RP2350(priv->id)) {
+ LOG_ERROR("Unknown SYSINFO CHIP_ID 0x%08" PRIx32, priv->id);
+ return ERROR_FLASH_BANK_INVALID;
+ }
+
+ retval = rp2xxx_populate_rom_pointer_cache(target, priv);
+ if (retval != ERROR_OK)
+ return retval;
/* the Boot ROM flash_range_program() routine requires page alignment */
bank->write_start_alignment = 256;
bank->write_end_alignment = 256;
- // Max size -- up to two devices (two chip selects) in adjacent 24-bit address windows
+ uint32_t flash_id = 0;
+ if (priv->size_override) {
+ priv->spi_dev.name = "size override";
+ LOG_DEBUG("SPI flash autodetection disabled, using configured size");
+ } else {
+ bank->size = 0;
+
+ (void)setup_for_raw_flash_cmd(target, priv);
+ /* ignore error, flash size detection could work anyway */
+
+ const uint8_t cmd[] = { SPIFLASH_READ_ID };
+ uint8_t data[3];
+ retval = rp2xxx_spi_tx_rx(bank, cmd, sizeof(cmd), 0, data, sizeof(data));
+ if (retval == ERROR_OK) {
+ flash_id = le_to_h_u24(data);
+
+ /* search for a SPI flash Device ID match */
+ for (const struct flash_device *p = flash_devices; p->name ; p++) {
+ if (p->device_id == flash_id) {
+ priv->spi_dev = *p;
+ bank->size = p->size_in_bytes;
+ break;
+ }
+ }
+ }
+
+ if (bank->size == 0) {
+ priv->sfdp_dummy_detect = 8;
+ priv->sfdp_dummy = 0;
+ retval = spi_sfdp(bank, &priv->spi_dev, &rp2xxx_read_sfdp_block);
+ if (retval == ERROR_OK)
+ bank->size = priv->spi_dev.size_in_bytes;
+ }
+
+ cleanup_after_raw_flash_cmd(target, priv);
+ }
+
+ snprintf(priv->dev_name, sizeof(priv->dev_name), "%s rev %u",
+ IS_RP2350(priv->id) ? "RP2350" : "RP2040",
+ RP2XXX_CHIP_ID_REVISION(priv->id));
+
if (bank->size == 0) {
- /* TODO: get real flash size */
- bank->size = 32 * 1024 * 1024;
+ LOG_ERROR("%s, QSPI Flash id = 0x%06" PRIx32 " not recognised",
+ priv->dev_name, flash_id);
+ return ERROR_FLASH_BANK_INVALID;
}
bank->num_sectors = bank->size / 4096;
- LOG_INFO("RP2040 Flash Probe: %d bytes @" TARGET_ADDR_FMT ", in %d sectors\n",
- bank->size, bank->base, bank->num_sectors);
+ if (priv->size_override) {
+ LOG_INFO("%s, QSPI Flash size override = %u KiB in %u sectors",
+ priv->dev_name, bank->size / 1024, bank->num_sectors);
+ } else {
+ LOG_INFO("%s, QSPI Flash %s id = 0x%06" PRIx32 " size = %u KiB in %u sectors",
+ priv->dev_name, priv->spi_dev.name, flash_id,
+ bank->size / 1024, bank->num_sectors);
+ }
+
+ free(bank->sectors);
bank->sectors = alloc_block_array(0, 4096, bank->num_sectors);
if (!bank->sectors)
return ERROR_FAIL;
- if (err == ERROR_OK)
- priv->probed = true;
+ priv->probed = true;
- return err;
+ return ERROR_OK;
}
static int rp2040_flash_auto_probe(struct flash_bank *bank)
@@ -927,6 +1197,7 @@ FLASH_BANK_COMMAND_HANDLER(rp2040_flash_bank_command)
priv = malloc(sizeof(struct rp2040_flash_bank));
memset(priv, 0, sizeof(struct rp2040_flash_bank));
priv->probed = false;
+ priv->size_override = bank->size != 0;
/* Set up driver_priv */
bank->driver_priv = priv;
diff --git a/tcl/target/rp2350.cfg b/tcl/target/rp2350.cfg
index d2465bd2f..dc26cde19 100644
--- a/tcl/target/rp2350.cfg
+++ b/tcl/target/rp2350.cfg
@@ -19,6 +19,14 @@ if { [info exists WORKAREASIZE] } {
set _WORKAREASIZE 0x10000
}
+# Nonzero FLASHSIZE supresses QSPI flash size detection
+if { [info exists FLASHSIZE] } {
+ set _FLASHSIZE $FLASHSIZE
+} else {
+ # Detect QSPI flash size based on flash ID or SFDP
+ set _FLASHSIZE 0
+}
+
if { [info exists CPUTAPID] } {
set _CPUTAPID $CPUTAPID
} else {
@@ -143,13 +151,15 @@ if { ![info exists _FLASH_TARGET] && [info exists _TARGETNAME_1] } {
}
}
if { [info exists _FLASH_TARGET] } {
- $_FLASH_TARGET configure -work-area-phys 0x20010000 -work-area-size $_WORKAREASIZE
+ # QSPI flash size detection during gdb connect requires to back-up RAM
+ set _WKA_BACKUP [expr { $_FLASHSIZE == 0 }]
+ $_FLASH_TARGET configure -work-area-phys 0x20010000 -work-area-size $_WORKAREASIZE -work-area-backup $_WKA_BACKUP
if { [info exists _TARGETNAME_CM0] && [info exists _TARGETNAME_RV0] } {
- $_TARGETNAME_RV0 configure -work-area-phys 0x20010000 -work-area-size $_WORKAREASIZE
+ $_TARGETNAME_RV0 configure -work-area-phys 0x20010000 \
+ -work-area-size $_WORKAREASIZE -work-area-backup $_WKA_BACKUP
echo "Info : $_CHIPNAME.flash will be handled by the active one of $_FLASH_TARGET and $_TARGETNAME_RV0 cores"
}
set _FLASHNAME $_CHIPNAME.flash
- set _FLASHSIZE 0x00400000
flash bank $_FLASHNAME rp2040_flash 0x10000000 $_FLASHSIZE 0 0 $_FLASH_TARGET
}
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2040.c | 301 ++++++++++++++++++++++++++++++++++++++++++++++---
tcl/target/rp2350.cfg | 16 ++-
2 files changed, 299 insertions(+), 18 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:36:27
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 22dfd0efaddaa70baf9e65aff661554c4497909a (commit)
from 69ee4457864af2657ce1b634887b26b838fc916f (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 22dfd0efaddaa70baf9e65aff661554c4497909a
Author: Tomas Vanek <va...@fb...>
Date: Tue Aug 13 16:23:20 2024 +0200
tcl/target/rp2350: workarounds for ROM API issues
A0 chip: remove pad isolation
A2 chip: instead of reset init fixes we will fix the flash driver
with the following patch by Luke Wren:
8729: flash/nor/rp2xxx: fix flash operation after halt in RISC-V bootsel
https://review.openocd.org/c/openocd/+/8729
I don't have A1 version to test.
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: I9e9fab04ead929fe6e0a17c6c2f32a6f02e9beb9
Reviewed-on: https://review.openocd.org/c/openocd/+/8450
Tested-by: jenkins
diff --git a/tcl/target/rp2350.cfg b/tcl/target/rp2350.cfg
index 775561f06..d2465bd2f 100644
--- a/tcl/target/rp2350.cfg
+++ b/tcl/target/rp2350.cfg
@@ -94,8 +94,7 @@ if { [info exists _TARGETNAME_RV0] } {
target create $_TARGETNAME_RV0 riscv -dap $_CHIPNAME.dap -ap-num 0xa000 -coreid 0
$_TARGETNAME_RV0 riscv set_enable_virt2phys off
- # Workaround for stray IO_QSPI: GPIO_QSPI_SD1_CTRL: INOVER bit in RISC-V BOOTSEL
- $_TARGETNAME_RV0 configure -event reset-init { mww 0x4003002c 0 }
+ $_TARGETNAME_RV0 configure -event reset-init "_rv_reset_init"
if { [info exists _TARGETNAME_CM0] } {
# just for setting after init when the event become-available is not fired
@@ -204,3 +203,22 @@ if { $_RESCUE } {
init
rescue_reset
}
+
+proc _rv_reset_init { } {
+ set chip_id [format 0x%08x [read_memory 0x40000000 32 1]]
+
+ # Version related workarounds
+ switch $chip_id {
+ 0x00004927 { # A0
+ # remove IO_QSPI isolation
+ mww 0x40030014 0
+ mww 0x4003001c 0
+ mww 0x40030024 0
+ mww 0x4003002c 0
+ mww 0x40030034 0
+ mww 0x4003003c 0
+ }
+ }
+
+ rp2xxx rom_api_call FC
+}
-----------------------------------------------------------------------
Summary of changes:
tcl/target/rp2350.cfg | 22 ++++++++++++++++++++--
1 file changed, 20 insertions(+), 2 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:34:47
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 69ee4457864af2657ce1b634887b26b838fc916f (commit)
from 2e49c99b1f919c2496c2d0140ada4ea5134c20a0 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 69ee4457864af2657ce1b634887b26b838fc916f
Author: Tomas Vanek <va...@fb...>
Date: Sun Aug 11 15:03:05 2024 +0200
tcl/target/rp2350: universal config for any combination of CM/RV cores
RP2350 has 2 slots where either Cortex-M33 or RISC-V can be selected.
Tcl variable USE_CORE selects what cores will be configured for debug.
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: I56fe1aa94304bdfd1ec98bba57cc3fa792a35f69
Reviewed-on: https://review.openocd.org/c/openocd/+/8449
Tested-by: jenkins
diff --git a/tcl/target/rp2350.cfg b/tcl/target/rp2350.cfg
new file mode 100644
index 000000000..775561f06
--- /dev/null
+++ b/tcl/target/rp2350.cfg
@@ -0,0 +1,206 @@
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+# RP2350 is a microcontroller with dual Cortex-M33 cores or dual Hazard3 RISC-V cores.
+# https://www.raspberrypi.com/documentation/microcontrollers/rp2350.html
+
+transport select swd
+
+source [find target/swj-dp.tcl]
+
+if { [info exists CHIPNAME] } {
+ set _CHIPNAME $CHIPNAME
+} else {
+ set _CHIPNAME rp2350
+}
+
+if { [info exists WORKAREASIZE] } {
+ set _WORKAREASIZE $WORKAREASIZE
+} else {
+ set _WORKAREASIZE 0x10000
+}
+
+if { [info exists CPUTAPID] } {
+ set _CPUTAPID $CPUTAPID
+} else {
+ set _CPUTAPID 0x00040927
+}
+
+# Set to '1' to start rescue mode
+if { [info exists RESCUE] } {
+ set _RESCUE $RESCUE
+} else {
+ set _RESCUE 0
+}
+
+# Set to 'cm0' or 'cm1' for Cortex-M33 single core configuration
+# To keep compatibility with RP2040 aliases '0' and '1' are provided for Cortex-M33 cores
+# Use 'rv0' or 'rv1' for RISC-V single core configuration
+# List more for a multicore configuration
+if { [info exists USE_CORE] } {
+ set _USE_CORE $USE_CORE
+} else {
+ # defaults to both Cortex-M33 cores
+ set _USE_CORE { cm0 cm1 }
+}
+
+swj_newdap $_CHIPNAME cpu -expected-id $_CPUTAPID
+
+if { [info exists SWD_MULTIDROP] } {
+ dap create $_CHIPNAME.dap -adiv6 -chain-position $_CHIPNAME.cpu -dp-id 0x0040927 -instance-id 0
+} else {
+ dap create $_CHIPNAME.dap -adiv6 -chain-position $_CHIPNAME.cpu
+}
+
+# Cortex-M33 core 0
+if { [lsearch $_USE_CORE cm0] >= 0 || [lsearch $_USE_CORE 0] >= 0 } {
+ set _TARGETNAME_CM0 $_CHIPNAME.cm0
+ set _TARGETNAME_0 $_TARGETNAME_CM0
+}
+
+# RISC-V core 0
+if { [lsearch $_USE_CORE rv0] >= 0 } {
+ set _TARGETNAME_RV0 $_CHIPNAME.rv0
+ if { ![info exists _TARGETNAME_0] } {
+ set _TARGETNAME_0 $_TARGETNAME_RV0
+ }
+}
+
+# Cortex-M33 core 1
+if { [lsearch $_USE_CORE cm1] >= 0 || [lsearch $_USE_CORE 1] >= 0 } {
+ set _TARGETNAME_CM1 $_CHIPNAME.cm1
+ set _TARGETNAME_1 $_TARGETNAME_CM1
+}
+
+# RISC-V core 1
+if { [lsearch $_USE_CORE rv1] >= 0 } {
+ set _TARGETNAME_RV1 $_CHIPNAME.rv1
+ if { ![info exists _TARGETNAME_1] } {
+ set _TARGETNAME_1 $_TARGETNAME_RV1
+ }
+}
+
+
+if { [info exists _TARGETNAME_CM0] } {
+ target create $_TARGETNAME_CM0 cortex_m -dap $_CHIPNAME.dap -ap-num 0x2000
+ # srst does not exist; use SYSRESETREQ to perform a soft reset
+ $_TARGETNAME_CM0 cortex_m reset_config sysresetreq
+
+ # After a rescue reset the cache requires invalidate to allow SPI flash
+ # reads from the XIP cached mapping area
+ $_TARGETNAME_CM0 configure -event reset-init { rp2xxx rom_api_call FC }
+}
+
+if { [info exists _TARGETNAME_RV0] } {
+ target create $_TARGETNAME_RV0 riscv -dap $_CHIPNAME.dap -ap-num 0xa000 -coreid 0
+ $_TARGETNAME_RV0 riscv set_enable_virt2phys off
+
+ # Workaround for stray IO_QSPI: GPIO_QSPI_SD1_CTRL: INOVER bit in RISC-V BOOTSEL
+ $_TARGETNAME_RV0 configure -event reset-init { mww 0x4003002c 0 }
+
+ if { [info exists _TARGETNAME_CM0] } {
+ # just for setting after init when the event become-available is not fired
+ $_TARGETNAME_RV0 configure -event examine-end "rp2xxx _switch_target $_TARGETNAME_CM0 $_TARGETNAME_RV0"
+ }
+}
+
+if { [info exists _TARGETNAME_CM1] } {
+ target create $_TARGETNAME_CM1 cortex_m -dap $_CHIPNAME.dap -ap-num 0x4000
+ $_TARGETNAME_CM1 cortex_m reset_config sysresetreq
+}
+
+if { [info exists _TARGETNAME_RV1] } {
+ target create $_TARGETNAME_RV1 riscv -dap $_CHIPNAME.dap -ap-num 0xa000 -coreid 1
+ $_TARGETNAME_RV1 riscv set_enable_virt2phys off
+}
+
+if { [info exists USE_SMP] } {
+ set _USE_SMP $USE_SMP
+} elseif { [info exists _TARGETNAME_CM0] == [info exists _TARGETNAME_CM1]
+ && [info exists _TARGETNAME_RV0] == [info exists _TARGETNAME_RV1] } {
+ set _USE_SMP 1
+} else {
+ set _USE_SMP 0
+}
+if { $_USE_SMP } {
+ if { [info exists _TARGETNAME_CM0] && [info exists _TARGETNAME_CM1] } {
+ $_TARGETNAME_CM0 configure -rtos hwthread
+ $_TARGETNAME_CM1 configure -rtos hwthread
+ target smp $_TARGETNAME_CM0 $_TARGETNAME_CM1
+ }
+ if { [info exists _TARGETNAME_RV0] && [info exists _TARGETNAME_RV1] } {
+ $_TARGETNAME_RV0 configure -rtos hwthread
+ $_TARGETNAME_RV1 configure -rtos hwthread
+ target smp $_TARGETNAME_RV0 $_TARGETNAME_RV1
+ }
+}
+
+if { [info exists _TARGETNAME_0] } {
+ set _FLASH_TARGET $_TARGETNAME_0
+}
+if { ![info exists _FLASH_TARGET] && [info exists _TARGETNAME_1] } {
+ set _FLASH_TARGET $_TARGETNAME_1
+ if { [info exists _TARGETNAME_CM1] && [info exists _TARGETNAME_RV1] } {
+ echo "Info : $_CHIPNAME.flash will be handled by $_TARGETNAME_1 without switching"
+ }
+}
+if { [info exists _FLASH_TARGET] } {
+ $_FLASH_TARGET configure -work-area-phys 0x20010000 -work-area-size $_WORKAREASIZE
+ if { [info exists _TARGETNAME_CM0] && [info exists _TARGETNAME_RV0] } {
+ $_TARGETNAME_RV0 configure -work-area-phys 0x20010000 -work-area-size $_WORKAREASIZE
+ echo "Info : $_CHIPNAME.flash will be handled by the active one of $_FLASH_TARGET and $_TARGETNAME_RV0 cores"
+ }
+ set _FLASHNAME $_CHIPNAME.flash
+ set _FLASHSIZE 0x00400000
+ flash bank $_FLASHNAME rp2040_flash 0x10000000 $_FLASHSIZE 0 0 $_FLASH_TARGET
+}
+
+if { [info exists _TARGETNAME_1] } {
+ # Alias to ensure gdb connecting to core 1 gets the correct memory map
+ flash bank $_CHIPNAME.alias virtual 0x10000000 0 0 0 $_TARGETNAME_1 $_FLASHNAME
+}
+
+if { [info exists _TARGETNAME_0] } {
+ # Select core 0
+ targets $_TARGETNAME_0
+}
+
+# Cold reset resets everything except DP
+proc cold_reset { { __CHIPNAME "" } } {
+ if { $__CHIPNAME == "" } {
+ global _CHIPNAME
+ set __CHIPNAME $_CHIPNAME
+ }
+ poll off
+ # set CDBGRSTREQ (and keep set CSYSPWRUPREQ and CDBGPWRUPREQ)
+ $__CHIPNAME.dap dpreg 4 0x54000000
+ set dpstat [$__CHIPNAME.dap dpreg 4]
+ if { [expr { $dpstat & 0xcc000000 }] != 0xcc000000 } {
+ echo "Warn : dpstat_reset failed, DP STAT $dpstat"
+ }
+ $__CHIPNAME.dap dpreg 4 0x50000000
+ dap init
+ poll on
+}
+
+# Rescue reset resets everything except DP and RP_AP
+# Both Cortex-M33 cores stop in bootrom
+proc rescue_reset { { __CHIPNAME "" } } {
+ if { $__CHIPNAME == "" } {
+ global _CHIPNAME
+ set __CHIPNAME $_CHIPNAME
+ }
+ poll off
+ # set bit RESCUE_RESTART in RP_AP: CTRL register
+ $__CHIPNAME.dap apreg 0x80000 0 0x80000000
+ $__CHIPNAME.dap apreg 0x80000 0 0
+ dap init
+ poll on
+ if { [lsearch [target names] $__CHIPNAME.cm0] < 0 } {
+ echo "Info : restart OpenOCD with 'set USE_CORE { cm0 cm1 }' to debug after rescue"
+ }
+}
+
+if { $_RESCUE } {
+ init
+ rescue_reset
+}
-----------------------------------------------------------------------
Summary of changes:
tcl/target/rp2350.cfg | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 206 insertions(+)
create mode 100644 tcl/target/rp2350.cfg
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:33:23
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 2e49c99b1f919c2496c2d0140ada4ea5134c20a0 (commit)
from 15d92076b0c2d6198e2f60381e4dcb645ec9a110 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 2e49c99b1f919c2496c2d0140ada4ea5134c20a0
Author: Tomas Vanek <va...@fb...>
Date: Sat Aug 10 16:10:43 2024 +0200
flash/nor/rp2040: flash bank target switching for RP2350
RP2350 can switch either core to Cortex-M33 or RISC-V.
The different architectures have to be supported as
distinct targets in OpenOCD.
Introduce 'rp2xxx _switch target' Tcl command to adapt flash
bank to architecture changes.
Keep the target and priv pointers intact until a flash operation
is finished to prevent sudden change in the middle of write/erase.
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: I764354ab469e253042128958dfe70c09d04d6411
Reviewed-on: https://review.openocd.org/c/openocd/+/8448
Tested-by: jenkins
Reviewed-by: Antonio Borneo <bor...@gm...>
diff --git a/src/flash/nor/rp2040.c b/src/flash/nor/rp2040.c
index df9284d96..15a04fbb0 100644
--- a/src/flash/nor/rp2040.c
+++ b/src/flash/nor/rp2040.c
@@ -627,16 +627,13 @@ static int rp2350_init_arm_core0(struct target *target, struct rp2040_flash_bank
return err;
}
-static int setup_for_raw_flash_cmd(struct flash_bank *bank)
+static int setup_for_raw_flash_cmd(struct target *target, struct rp2040_flash_bank *priv)
{
- struct rp2040_flash_bank *priv = bank->driver_priv;
- struct target *target = bank->target;
-
int err = ERROR_OK;
if (!priv->stack) {
/* target_alloc_working_area always allocates multiples of 4 bytes, so no worry about alignment */
- err = target_alloc_working_area(bank->target, RP2XXX_MAX_ALGO_STACK_USAGE, &priv->stack);
+ err = target_alloc_working_area(target, RP2XXX_MAX_ALGO_STACK_USAGE, &priv->stack);
if (err != ERROR_OK) {
LOG_ERROR("Could not allocate stack for flash programming code -- insufficient space");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
@@ -644,7 +641,7 @@ static int setup_for_raw_flash_cmd(struct flash_bank *bank)
}
if (!priv->ram_algo_space) {
- err = target_alloc_working_area(bank->target, RP2XXX_MAX_RAM_ALGO_SIZE, &priv->ram_algo_space);
+ err = target_alloc_working_area(target, RP2XXX_MAX_RAM_ALGO_SIZE, &priv->ram_algo_space);
if (err != ERROR_OK) {
LOG_ERROR("Could not allocate RAM code space for ROM calls -- insufficient space");
return ERROR_TARGET_RESOURCE_NOT_AVAILABLE;
@@ -692,7 +689,7 @@ static int setup_for_raw_flash_cmd(struct flash_bank *bank)
.sp = priv->stack->address + priv->stack->size
}
};
- err = rp2xxx_call_rom_func_batch(bank->target, priv, calls, 2);
+ err = rp2xxx_call_rom_func_batch(target, priv, calls, 2);
if (err != ERROR_OK) {
LOG_ERROR("RP2040 flash: failed to exit flash XIP mode");
return err;
@@ -701,15 +698,13 @@ static int setup_for_raw_flash_cmd(struct flash_bank *bank)
return ERROR_OK;
}
-static void cleanup_after_raw_flash_cmd(struct flash_bank *bank)
+static void cleanup_after_raw_flash_cmd(struct target *target, struct rp2040_flash_bank *priv)
{
/* OpenOCD is prone to trashing work-area allocations on target state
transitions, which leaves us with stale work area pointers in our
driver state. Best to clean up our allocations manually after
completing each flash call, so we know to make fresh ones next time. */
LOG_DEBUG("Cleaning up after flash operations");
- struct rp2040_flash_bank *priv = bank->driver_priv;
- struct target *target = bank->target;
if (priv->stack) {
target_free_working_area(target, priv->stack);
priv->stack = 0;
@@ -728,7 +723,7 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
struct target *target = bank->target;
struct working_area *bounce;
- int err = setup_for_raw_flash_cmd(bank);
+ int err = setup_for_raw_flash_cmd(target, priv);
if (err != ERROR_OK)
goto cleanup_and_return;
@@ -780,7 +775,7 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
// accesses, but there's no harm in calling it anyway.
LOG_DEBUG("Flushing flash cache after write behind");
- err = rp2xxx_call_rom_func(bank->target, priv, priv->jump_flush_cache, NULL, 0);
+ err = rp2xxx_call_rom_func(target, priv, priv->jump_flush_cache, NULL, 0);
rp2xxx_rom_call_batch_record_t finishing_calls[3] = {
{
@@ -805,18 +800,19 @@ static int rp2040_flash_write(struct flash_bank *bank, const uint8_t *buffer, ui
goto cleanup_and_return;
}
cleanup_and_return:
- cleanup_after_raw_flash_cmd(bank);
+ cleanup_after_raw_flash_cmd(target, priv);
return err;
}
static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsigned int last)
{
struct rp2040_flash_bank *priv = bank->driver_priv;
+ struct target *target = bank->target;
uint32_t start_addr = bank->sectors[first].offset;
uint32_t length = bank->sectors[last].offset + bank->sectors[last].size - start_addr;
LOG_DEBUG("RP2040 erase %d bytes starting at 0x%" PRIx32, length, start_addr);
- int err = setup_for_raw_flash_cmd(bank);
+ int err = setup_for_raw_flash_cmd(target, priv);
if (err != ERROR_OK)
goto cleanup_and_return;
@@ -855,7 +851,7 @@ static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsig
0xd8 /* block_cmd */
};
- err = rp2xxx_call_rom_func(bank->target, priv, priv->jump_flash_range_erase, args, ARRAY_SIZE(args));
+ err = rp2xxx_call_rom_func(target, priv, priv->jump_flash_range_erase, args, ARRAY_SIZE(args));
keep_alive();
if (err != ERROR_OK)
@@ -866,7 +862,7 @@ static int rp2040_flash_erase(struct flash_bank *bank, unsigned int first, unsig
cleanup_and_return:
- cleanup_after_raw_flash_cmd(bank);
+ cleanup_after_raw_flash_cmd(target, priv);
return err;
}
@@ -973,7 +969,8 @@ COMMAND_HANDLER(rp2040_rom_api_call_handler)
for (unsigned int i = 0; i + 1 < CMD_ARGC && i < ARRAY_SIZE(args); i++)
COMMAND_PARSE_NUMBER(u32, CMD_ARGV[i + 1], args[i]);
- retval = setup_for_raw_flash_cmd(bank);
+ struct rp2040_flash_bank *priv = bank->driver_priv;
+ retval = setup_for_raw_flash_cmd(target, priv);
if (retval != ERROR_OK)
goto cleanup_and_return;
@@ -992,16 +989,51 @@ COMMAND_HANDLER(rp2040_rom_api_call_handler)
* in an event handler, use LOG_INFO instead */
LOG_INFO("RP2xxx ROM API function %.2s @ %04" PRIx16, CMD_ARGV[0], fc);
- struct rp2040_flash_bank *priv = bank->driver_priv;
retval = rp2xxx_call_rom_func(target, priv, fc, args, ARRAY_SIZE(args));
if (retval != ERROR_OK)
command_print(CMD, "RP2xxx ROM API call failed");
cleanup_and_return:
- cleanup_after_raw_flash_cmd(bank);
+ cleanup_after_raw_flash_cmd(target, priv);
return retval;
}
+COMMAND_HANDLER(rp2040_switch_target_handler)
+{
+ if (CMD_ARGC != 2)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+
+ struct target *old_target = get_target(CMD_ARGV[0]);
+ if (!old_target) {
+ command_print(CMD, "Unrecognised old target %s", CMD_ARGV[0]);
+ return ERROR_COMMAND_ARGUMENT_INVALID;
+ }
+
+ struct target *new_target = get_target(CMD_ARGV[1]);
+ if (!new_target) {
+ command_print(CMD, "Unrecognised new target %s", CMD_ARGV[1]);
+ return ERROR_COMMAND_ARGUMENT_INVALID;
+ }
+
+ struct flash_bank *bank;
+ for (bank = flash_bank_list(); bank; bank = bank->next) {
+ if (bank->driver == &rp2040_flash) {
+ if (bank->target == old_target) {
+ bank->target = new_target;
+ struct rp2040_flash_bank *priv = bank->driver_priv;
+ priv->probed = false;
+ return ERROR_OK;
+ } else if (bank->target == new_target) {
+ return ERROR_OK;
+ }
+ }
+ }
+
+ command_print(CMD, "Neither old nor new target %s found in flash bank list",
+ CMD_ARGV[0]);
+ return ERROR_FAIL;
+}
+
static const struct command_registration rp2040_exec_command_handlers[] = {
{
.name = "rom_api_call",
@@ -1010,6 +1042,13 @@ static const struct command_registration rp2040_exec_command_handlers[] = {
.usage = "fc [p0 [p1 [p2 [p3]]]]",
.handler = rp2040_rom_api_call_handler,
},
+ {
+ .name = "_switch_target",
+ .mode = COMMAND_EXEC,
+ .help = "internal use",
+ .usage = "old_target new_target",
+ .handler = rp2040_switch_target_handler,
+ },
COMMAND_REGISTRATION_DONE
};
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2040.c | 77 +++++++++++++++++++++++++++++++++++++-------------
1 file changed, 58 insertions(+), 19 deletions(-)
hooks/post-receive
--
Main OpenOCD repository
|
|
From: openocd-gerrit <ope...@us...> - 2025-04-25 09:31:22
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Main OpenOCD repository".
The branch, master has been updated
via 15d92076b0c2d6198e2f60381e4dcb645ec9a110 (commit)
from ba03d13c29fba9f5e4e97121c47eb3b7857aa92d (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 15d92076b0c2d6198e2f60381e4dcb645ec9a110
Author: Tomas Vanek <va...@fb...>
Date: Wed Jul 17 11:49:55 2024 +0200
flash/nor/rp2040: allow arbitrary ROM API call from Tcl
The new flash command could be handy for a reboot to BOOTSEL mode
and for making (Q)SPI flash content visible at 0x10xxxxxx
address mapping area after a rescue reset.
Signed-off-by: Tomas Vanek <va...@fb...>
Change-Id: I1b532afcc41a4051298313e685658e86c02c53f9
Reviewed-on: https://review.openocd.org/c/openocd/+/8447
Reviewed-by: Antonio Borneo <bor...@gm...>
Tested-by: jenkins
diff --git a/src/flash/nor/rp2040.c b/src/flash/nor/rp2040.c
index 5faba57a0..df9284d96 100644
--- a/src/flash/nor/rp2040.c
+++ b/src/flash/nor/rp2040.c
@@ -938,8 +938,95 @@ FLASH_BANK_COMMAND_HANDLER(rp2040_flash_bank_command)
return ERROR_OK;
}
+
+COMMAND_HANDLER(rp2040_rom_api_call_handler)
+{
+ if (CMD_ARGC < 1)
+ return ERROR_COMMAND_SYNTAX_ERROR;
+
+ struct target *target = get_current_target(CMD->ctx);
+
+ struct flash_bank *bank;
+ for (bank = flash_bank_list(); bank; bank = bank->next) {
+ if (bank->driver != &rp2040_flash)
+ continue;
+
+ if (bank->target == target)
+ break;
+ }
+
+ if (!bank) {
+ command_print(CMD, "[%s] No associated RP2xxx flash bank found",
+ target_name(target));
+ return ERROR_FAIL;
+ }
+
+ int retval = rp2040_flash_auto_probe(bank);
+ if (retval != ERROR_OK) {
+ command_print(CMD, "auto_probe failed");
+ return retval;
+ }
+
+ uint16_t tag = MAKE_TAG(CMD_ARGV[0][0], CMD_ARGV[0][1]);
+
+ uint32_t args[4] = { 0 };
+ for (unsigned int i = 0; i + 1 < CMD_ARGC && i < ARRAY_SIZE(args); i++)
+ COMMAND_PARSE_NUMBER(u32, CMD_ARGV[i + 1], args[i]);
+
+ retval = setup_for_raw_flash_cmd(bank);
+ if (retval != ERROR_OK)
+ goto cleanup_and_return;
+
+ uint16_t symtype_func = is_arm(target_to_arm(target))
+ ? RT_FLAG_FUNC_ARM_SEC : RT_FLAG_FUNC_RISCV;
+
+ uint16_t fc;
+ retval = rp2xxx_lookup_rom_symbol(target, tag, symtype_func, &fc);
+ if (retval != ERROR_OK) {
+ command_print(CMD, "Function %.2s not found in RP2xxx ROM.",
+ CMD_ARGV[0]);
+ goto cleanup_and_return;
+ }
+
+ /* command_print() output gets lost if the command is called
+ * in an event handler, use LOG_INFO instead */
+ LOG_INFO("RP2xxx ROM API function %.2s @ %04" PRIx16, CMD_ARGV[0], fc);
+
+ struct rp2040_flash_bank *priv = bank->driver_priv;
+ retval = rp2xxx_call_rom_func(target, priv, fc, args, ARRAY_SIZE(args));
+ if (retval != ERROR_OK)
+ command_print(CMD, "RP2xxx ROM API call failed");
+
+cleanup_and_return:
+ cleanup_after_raw_flash_cmd(bank);
+ return retval;
+}
+
+static const struct command_registration rp2040_exec_command_handlers[] = {
+ {
+ .name = "rom_api_call",
+ .mode = COMMAND_EXEC,
+ .help = "arbitrary ROM API call",
+ .usage = "fc [p0 [p1 [p2 [p3]]]]",
+ .handler = rp2040_rom_api_call_handler,
+ },
+ COMMAND_REGISTRATION_DONE
+};
+
+static const struct command_registration rp2040_command_handler[] = {
+ {
+ .name = "rp2xxx",
+ .mode = COMMAND_ANY,
+ .help = "rp2xxx flash controller commands",
+ .usage = "",
+ .chain = rp2040_exec_command_handlers,
+ },
+ COMMAND_REGISTRATION_DONE
+};
+
const struct flash_driver rp2040_flash = {
.name = "rp2040_flash",
+ .commands = rp2040_command_handler,
.flash_bank_command = rp2040_flash_bank_command,
.erase = rp2040_flash_erase,
.write = rp2040_flash_write,
-----------------------------------------------------------------------
Summary of changes:
src/flash/nor/rp2040.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 87 insertions(+)
hooks/post-receive
--
Main OpenOCD repository
|