+# SPDX-License-Identifier: GPL-2.0-or-later
+
#
# Nordic nRF52 series: ARM Cortex-M4 @ 64 MHz
#
# 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]}]
+ set err [catch {set APPROTECTSTATUS [$dap apreg 1 0xc]}]
if {$err == 0 && $APPROTECTSTATUS != 1} {
echo "****** WARNING ******"
echo "nRF52 device has AP lock engaged (see UICR APPROTECT register)."
set target [target current]
set dap [$target cget -dap]
- set IDR [ocd_$dap apreg 1 0xfc]
+ set IDR [$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
+ # Reset and 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} {
+ set ERASEALLSTATUS [$dap apreg 1 8]
+ if {$ERASEALLSTATUS == 0} {
echo "$target device has been successfully erased and unlocked."
break
}
- if {$i >= 5} {
+ if {$i == 0} {
+ echo "Waiting for chip erase..."
+ }
+ if {$i >= 150} {
echo "Error: $target recovery failed."
break
}
sleep 100
}
+ # Assert reset
+ $dap apreg 1 0 1
+
# Deassert reset
$dap apreg 1 0 0
- if {$ERASEALLSTATUS == 1} {
- sleep 100
- $target arp_examine
- poll on
- }
+ # Reset ERASEALL task
+ $dap apreg 1 4 0
+
+ sleep 100
+ $target arp_examine
+ poll on
}
add_help_text nrf52_recover "Mass erase and unlock nRF52 device"