tcl/target/nrf52.cfg: detect AP lock and add command to recover 84/4984/3
authorTomas Vanek <vanekt@fbl.cz>
Fri, 1 Mar 2019 12:35:31 +0000 (13:35 +0100)
committerTomas Vanek <vanekt@fbl.cz>
Tue, 21 Apr 2020 15:46:58 +0000 (16:46 +0100)
Change-Id: I8d2e29ed88a957d412473255e42b022a00dfb9cb
Signed-off-by: Tomas Vanek <vanekt@fbl.cz>
Reviewed-on: http://openocd.zylin.com/4984
Tested-by: jenkins
tcl/target/nrf52.cfg

index 00901bf..88f2c69 100644 (file)
@@ -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"