0
0
mirror of https://git.code.sf.net/p/openocd/code synced 2025-07-05 10:53:08 +00:00
Files
openocd/tcl/target/rp2350.cfg
Jonathan Bell e23a6bbc63 tcl: fix broken Raspberry Pi website links
raspberrypi.com is the home for technical information, raspberrypi.org
is the Foundation's site (though there are intelligent redirects).

Several pages have moved around, fix these.

Also tweak a few comments for style and correctness.

Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
Change-Id: I7f52bcc362fb213b50987e3a42866fe4a6fec883
Reviewed-on: https://review.openocd.org/c/openocd/+/8885
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
2025-06-07 10:06:31 +00:00

235 lines
6.6 KiB
INI

# 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/silicon.html#rp2350
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
}
# 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 {
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
$_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
$_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] } {
# 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 -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
flash bank $_FLASHNAME rp2xxx 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
}
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
}