tcl/target: Enable using vectreset for CC3320SF targets 89/5489/4
authorEdward Fewell <efewell@ti.com>
Mon, 2 Mar 2020 20:04:24 +0000 (14:04 -0600)
committerAntonio Borneo <borneo.antonio@gmail.com>
Tue, 24 Mar 2020 17:18:31 +0000 (17:18 +0000)
On CC32xx family of devices, sysrequest is disabled, and
vectreset is blocked by the boot loader (stops in a while(1)
statement). srst reset can leave the target in a state
that prevents debug.

This change enables using vectreset on SF variants by
moving the PC to the start of the user application in
internal flash. This allows for a more reliable reset,
but with two caveats:

1) This only works for the SF variant with internal
   flash.

2) This only resets the CPU and not any peripherals.

Tested on CC3220SF rev B Launchpad in both SWD and
JTAG modes. Confirmed proper behavior of reset,
reset init, reset halt, and reset run commands.

Update: reworked per comment in code review. Re-tested
with CC3220SF Launchpad as both CC3220SF and as
CC32xx board to confirm reset behavior as expected.

Update: Added adapter srst delay 1100 line to the
CC3200 LaunchXL configuration file.

Change-Id: Ibc042d785c846c2223ae55b8f2410b75ed2df354
Signed-off-by: Edward Fewell <efewell@ti.com>
Reviewed-on: http://openocd.zylin.com/5489
Tested-by: jenkins
Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com>
tcl/board/ti_cc3200_launchxl.cfg
tcl/board/ti_cc32xx_launchpad.cfg
tcl/target/ti_cc3220sf.cfg
tcl/target/ti_cc32xx.cfg

index 34f9bff..b37b406 100644 (file)
@@ -18,3 +18,4 @@ set WORKAREASIZE 0x40000
 source [find target/ti_cc32xx.cfg]
 
 reset_config srst_only
+adapter srst delay 1100
index 1df461a..d0f2a83 100644 (file)
@@ -5,3 +5,6 @@ source [find interface/xds110.cfg]
 adapter speed 8500
 transport select swd
 source [find target/ti_cc32xx.cfg]
+
+reset_config srst_only
+adapter srst delay 1100
index f7d9bfe..3e758e6 100644 (file)
@@ -10,3 +10,31 @@ source [find target/ti_cc32xx.cfg]
 
 set _FLASHNAME $_CHIPNAME.flash
 flash bank $_FLASHNAME cc3220sf 0 0 0 0 $_TARGETNAME
+
+#
+# On CC32xx family of devices, sysreqreset is disabled, and vectreset is
+# blocked by the boot loader (stops in a while(1) statement). srst reset can
+# leave the target in a state that prevents debug. The following uses the
+# soft_reset_halt command to reset and halt the target. Then the PC and stack
+# are initialized from internal flash. This allows for a more reliable reset,
+# but with two caveats: it only works for the SF variant that has internal
+# flash, and it only resets the CPU and not any peripherals.
+#
+
+proc ocd_process_reset_inner { MODE } {
+
+       soft_reset_halt
+
+       # Intialize MSP, PSP, and PC from vector table at flash 0x01000800
+       mem2array boot 32 0x01000800 2
+
+       reg msp $boot(0)
+       reg psp $boot(0)
+       reg pc $boot(1)
+
+       if { 0 == [string compare $MODE run ] } {
+               resume
+       }
+
+       cc32xx.cpu invoke-event reset-end
+}
index 6f91d3f..e3e3ebc 100644 (file)
@@ -59,6 +59,3 @@ if { [info exists WORKAREASIZE] } {
 }
 
 $_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
-
-reset_config srst_only
-adapter srst delay 1100