aboutsummaryrefslogtreecommitdiff
path: root/tcl
diff options
context:
space:
mode:
authorTomas Vanek <vanekt@fbl.cz>2019-03-01 13:35:31 +0100
committerTomas Vanek <vanekt@fbl.cz>2020-04-21 16:46:58 +0100
commit73a5f58adba73306b08b7bb22ff8a9511e79869f (patch)
treefb2f86e3b9bc9cf370ba1e611296d40515611f8e /tcl
parentec16e522bf6518f38e8923ed4f271bc9bb23c409 (diff)
downloadriscv-openocd-73a5f58adba73306b08b7bb22ff8a9511e79869f.zip
riscv-openocd-73a5f58adba73306b08b7bb22ff8a9511e79869f.tar.gz
riscv-openocd-73a5f58adba73306b08b7bb22ff8a9511e79869f.tar.bz2
tcl/target/nrf52.cfg: detect AP lock and add command to recover
Change-Id: I8d2e29ed88a957d412473255e42b022a00dfb9cb Signed-off-by: Tomas Vanek <vanekt@fbl.cz> Reviewed-on: http://openocd.zylin.com/4984 Tested-by: jenkins
Diffstat (limited to 'tcl')
-rw-r--r--tcl/target/nrf52.cfg75
1 files changed, 74 insertions, 1 deletions
diff --git a/tcl/target/nrf52.cfg b/tcl/target/nrf52.cfg
index 00901bf..88f2c69 100644
--- a/tcl/target/nrf52.cfg
+++ b/tcl/target/nrf52.cfg
@@ -34,9 +34,82 @@ adapter speed 1000
$_TARGETNAME configure -work-area-phys 0x20000000 -work-area-size $_WORKAREASIZE -work-area-backup 0
-if { ![using_hla] } {
+if { [using_hla] } {
+ echo ""
+ echo "nRF52 device has a CTRL-AP dedicated to recover the device from AP lock."
+ echo "A high level adapter (like a ST-Link) you are currently using cannot access"
+ echo "the CTRL-AP so 'nrf52_recover' command will not work."
+ echo "Do not enable UICR APPROTECT."
+ echo ""
+} else {
cortex_m reset_config sysresetreq
+
+ $_TARGETNAME configure -event examine-fail nrf52_check_ap_lock
}
flash bank $_CHIPNAME.flash nrf5 0x00000000 0 1 1 $_TARGETNAME
flash bank $_CHIPNAME.uicr nrf5 0x10001000 0 1 1 $_TARGETNAME
+
+# Test if MEM-AP is locked by UICR APPROTECT
+proc nrf52_check_ap_lock {} {
+ set dap [[target current] cget -dap]
+ set err [catch {set APPROTECTSTATUS [ocd_$dap apreg 1 0xc]}]
+ if {$err == 0 && $APPROTECTSTATUS != 1} {
+ echo "****** WARNING ******"
+ echo "nRF52 device has AP lock engaged (see UICR APPROTECT register)."
+ echo "Debug access is denied."
+ echo "Use 'nrf52_recover' to erase and unlock the device."
+ echo ""
+ poll off
+ }
+}
+
+# Mass erase and unlock the device using proprietary nRF CTRL-AP (AP #1)
+# http://www.ebyte.com produces modules with nRF52 locked by default,
+# use nrf52_recover to enable flashing and debug.
+proc nrf52_recover {} {
+ set target [target current]
+ set dap [$target cget -dap]
+
+ set IDR [ocd_$dap apreg 1 0xfc]
+ if {$IDR != 0x02880000} {
+ echo "Error: Cannot access nRF52 CTRL-AP!"
+ return
+ }
+
+ poll off
+
+ # Assert reset
+ $dap apreg 1 0 1
+
+ # Reset ERASEALLSTATUS event
+ $dap apreg 1 8 0
+
+ # Trigger ERASEALL task
+ $dap apreg 1 4 0
+ $dap apreg 1 4 1
+
+ for {set i 0} {1} {incr i} {
+ set ERASEALLSTATUS [ocd_$dap apreg 1 8]
+ if {$ERASEALLSTATUS == 1} {
+ echo "$target device has been successfully erased and unlocked."
+ break
+ }
+ if {$i >= 5} {
+ echo "Error: $target recovery failed."
+ break
+ }
+ sleep 100
+ }
+
+ # Deassert reset
+ $dap apreg 1 0 0
+
+ if {$ERASEALLSTATUS == 1} {
+ sleep 100
+ $target arp_examine
+ poll on
+ }
+}
+
+add_help_text nrf52_recover "Mass erase and unlock nRF52 device"