aboutsummaryrefslogtreecommitdiff
path: root/tcl
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2016-08-26 21:03:27 +0200
committerTomas Vanek <vanekt@fbl.cz>2018-02-14 08:26:40 +0000
commit38030e011542a894237b517c065d22db97525954 (patch)
tree951565e040b97454c1969cfe60650b0fdddaf0c1 /tcl
parent5830bf09a73f38cc96c49ff792bd5a85687a795b (diff)
downloadriscv-openocd-38030e011542a894237b517c065d22db97525954.zip
riscv-openocd-38030e011542a894237b517c065d22db97525954.tar.gz
riscv-openocd-38030e011542a894237b517c065d22db97525954.tar.bz2
psoc4: update for 4x00BLE, L, M, S and PRoC BLE devices
Flash ROM API command PSOC4_CMD_SET_IMO48 is now optional on new devices. Also code tidy up: - improved system ROM call error detection - probe does not require the target to be halted - default_padded_value and erased_value set to 0 - fixed endianess problem in flash write and protection setting - removed fancy chip detection table as it would be updated too often - psoc4 flash_autoerase is now on by default to ease programming psoc4.cfg distinguishes chip family and uses either proprietary acquire function of a KitProg adapter or TEST_MODE workaround to "reset halt" Change-Id: I2c75ec46ed0a95e09274fad70b62d6eed7b9ecdf Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/3807 Tested-by: jenkins Reviewed-by: David Girault <david.f.girault@gmail.com>
Diffstat (limited to 'tcl')
-rw-r--r--tcl/target/psoc4.cfg89
1 files changed, 76 insertions, 13 deletions
diff --git a/tcl/target/psoc4.cfg b/tcl/target/psoc4.cfg
index d443b01..5d6dced 100644
--- a/tcl/target/psoc4.cfg
+++ b/tcl/target/psoc4.cfg
@@ -1,4 +1,4 @@
-# script for Cypress PSoC 41xx/42xx family
+# script for Cypress PSoC 4 devices
#
# PSoC 4 devices support SWD transports only.
@@ -53,8 +53,14 @@ adapter_khz 1500
# set in time frame 400 usec delayed about 1 msec from reset.
#
# OpenOCD have no standard way how to set TEST_MODE in specified time frame.
-# TEST_MODE flag is set before reset instead. It worked for tested chips
-# despite it is not guaranteed by specification.
+# As a workaround the TEST_MODE flag is set before reset instead.
+# It worked for the oldest family PSoC4100/4200 even though it is not guaranteed
+# by specification.
+#
+# Newer families like PSoC 4000, 4100M, 4200M, 4100L, 4200L and PSoC 4 BLE
+# clear TEST_MODE flag during device reset so workaround is not possible.
+# Use a KitProg adapter for theese devices or "reset halt" will not stop
+# before executing user code.
#
# 3) SWD cannot be connected during system initialization after reset.
# This might be a reason for unconnecting ST-Link v2 when deasserting reset.
@@ -66,11 +72,34 @@ if {![using_hla]} {
cortex_m reset_config sysresetreq
}
+proc psoc4_get_family_id {} {
+ set err [catch "mem2array romtable_pid 32 0xF0000FE0 3"]
+ if { $err } {
+ return 0
+ }
+ if { [expr $romtable_pid(0) & 0xffffff00 ]
+ || [expr $romtable_pid(1) & 0xffffff00 ]
+ || [expr $romtable_pid(2) & 0xffffff00 ] } {
+ echo "Unexpected data in ROMTABLE"
+ return 0
+ }
+ set designer_id [expr (( $romtable_pid(1) & 0xf0 ) >> 4) | (( $romtable_pid(2) & 0xf ) << 4 ) ]
+ if { $designer_id != 0xb4 } {
+ echo [format "ROMTABLE Designer ID 0x%02x is not Cypress" $designer_id]
+ return 0
+ }
+ set family_id [expr ( $romtable_pid(0) & 0xff ) | (( $romtable_pid(1) & 0xf ) << 8 ) ]
+ return $family_id
+}
+
proc ocd_process_reset_inner { MODE } {
- if { 0 != [string compare psoc4.cpu [target names]] } {
- return -code error "PSoC 4 reset can handle only one psoc4.cpu target";
+ global PSOC4_USE_ACQUIRE PSOC4_TEST_MODE_WORKAROUND
+ global _TARGETNAME
+
+ if { 0 != [string compare $_TARGETNAME [target names]] } {
+ return -code error "PSoC 4 reset can handle only one $_TARGETNAME target";
}
- set t psoc4.cpu
+ set t $_TARGETNAME
# If this target must be halted...
set halt -1
@@ -87,17 +116,42 @@ proc ocd_process_reset_inner { MODE } {
return -code error "Invalid mode: $MODE, must be one of: halt, init, or run";
}
+ if { ! [info exists PSOC4_USE_ACQUIRE] } {
+ if { 0 == [string compare [adapter_name] kitprog ] } {
+ set PSOC4_USE_ACQUIRE 1
+ } else {
+ set PSOC4_USE_ACQUIRE 0
+ }
+ }
+ if { $PSOC4_USE_ACQUIRE } {
+ set PSOC4_TEST_MODE_WORKAROUND 0
+ } elseif { ! [info exists PSOC4_TEST_MODE_WORKAROUND] } {
+ if { [psoc4_get_family_id] == 0x93 } {
+ set PSOC4_TEST_MODE_WORKAROUND 1
+ } else {
+ set PSOC4_TEST_MODE_WORKAROUND 0
+ }
+ }
+
#$t invoke-event reset-start
$t invoke-event reset-assert-pre
- set TEST_MODE 0x40030014
- if { $halt == 1 } {
- mww $TEST_MODE 0x80000000
+ if { $halt && $PSOC4_USE_ACQUIRE } {
+ catch { [adapter_name] acquire_psoc }
+ $t arp_examine
} else {
- mww $TEST_MODE 0
+ if { $PSOC4_TEST_MODE_WORKAROUND } {
+ set TEST_MODE 0x40030014
+ if { $halt == 1 } {
+ catch { mww $TEST_MODE 0x80000000 }
+ } else {
+ catch { mww $TEST_MODE 0 }
+ }
+ }
+
+ $t arp_reset assert 0
}
- $t arp_reset assert 0
$t invoke-event reset-assert-post
$t invoke-event reset-deassert-pre
if {![using_hla]} { # workaround ST-Link v2 fails and forcing reconnect
@@ -127,7 +181,14 @@ proc ocd_process_reset_inner { MODE } {
set pc [ocd_reg pc]
regsub {pc[^:]*: } $pc "" pc
if { $pc < 0x10000000 || $pc > 0x1000ffff } {
- return -code error [format "TARGET: %s - Not halted in system ROM, use 'reset_config none'" $t]
+ set hint ""
+ set family_id [psoc4_get_family_id]
+ if { $family_id == 0x93 } {
+ set hint ", use 'reset_config none'"
+ } elseif { $family_id > 0x93 } {
+ set hint ", use a KitProg adapter"
+ }
+ return -code error [format "TARGET: %s - Not halted in system ROM%s" $t $hint]
}
# Set registers to reset vector values
@@ -135,7 +196,9 @@ proc ocd_process_reset_inner { MODE } {
reg pc [expr $value(1) & 0xfffffffe ]
reg msp $value(0)
- mww $TEST_MODE 0
+ if { $PSOC4_TEST_MODE_WORKAROUND } {
+ catch { mww $TEST_MODE 0 }
+ }
}
#Pass 2 - if needed "init"