This is an automated email from Gerrit.

"Holger Mößinger <[email protected]>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/9268

-- gerrit

commit 7549c47647eb49cbca7a2c595a2e322ba246b994
Author: Holger Mößinger (hm2dev) <[email protected]>
Date:   Wed Nov 26 15:51:56 2025 +0100

    tcl/board/nordic/* Unify nrf5xx recover functions
    
    Rewrite common.cfg to provide _nrf_check_ap_lock and
    _nrf_ctrl_ap_recover functions that can also be
    used for nrf54l.cfg.
    
    Add nrf54l_check_ap_lock and nrf54l_recover to nrf54l.cfg.
    Successfully tested on nRF54L15 hardware.
    
    Rewrite nrf52.cfg to use the functions from common.cfg.
    
    Update nrf91.cfg and nrf53.cfg to adapt to the changed
    parameter list of _nrf_check_ap_lock and
    _nrf_ctrl_ap_recover in common.cfg.
    
    Change-Id: I9083197d6365d31a6532a9ad39f9c958f3e75f07
    Signed-off-by: Holger Mößinger (hm2dev) <[email protected]>

diff --git a/tcl/target/nordic/common.cfg b/tcl/target/nordic/common.cfg
index 2ae5011e4e..c34484b5eb 100644
--- a/tcl/target/nordic/common.cfg
+++ b/tcl/target/nordic/common.cfg
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-or-later
 
 #
-# Nordic nRF52, nRF53 and nRF91 CTRL-AP handling
+# Nordic nRF52, nRF53, nRF91 and nrf54l CTRL-AP handling
 #
 
 if { [using_hla] } {
@@ -14,68 +14,84 @@ if { [using_hla] } {
 } else {
 
        # Test if debug/MEM-AP is locked by UICR APPROTECT
-       proc _nrf_check_ap_lock { ctrl_ap_num unlocked_value } {
+       proc _nrf_check_ap_lock { ctrl_ap_num app_protect_register 
unlocked_value } {
+               set cmdname [lindex [info level 1] 0]
+               set recover_script_name [lindex [split $cmdname "_"] 0]_recover
+               
                set target [target current]
+               
                set dap [$target cget -dap]
-               set err [catch {set APPROTECTSTATUS [$dap apreg $ctrl_ap_num 
0xc]}]
-               if {$err == 0 && $APPROTECTSTATUS < $unlocked_value} {
-                       echo ""
-                       echo "****** WARNING ******"
-                       echo "\[$target\] device has AP lock engaged (see UICR 
APPROTECT register)."
-                       echo "Debug access is denied."
-                       echo "Use 'nrfxx_recover' to erase and unlock the 
device."
-                       echo ""
+               set err [catch {set APPROTECTSTATUS [$dap apreg $ctrl_ap_num 
$app_protect_register]}]
+               if {$err == 0 && $APPROTECTSTATUS > $unlocked_value} {
+                       echo "Warn : \[$cmdname\] "
+                       echo "Warn : \[$cmdname\] ****** WARNING ******"
+                       echo "Warn : \[$cmdname\] $target has AP lock engaged 
(see UICR APPROTECT register)."
+                       echo "Warn : \[$cmdname\] Debug access is denied."
+                       echo "Warn : \[$cmdname\] Use '${recover_script_name}' 
to erase and unlock the device."
+                       echo "Warn : \[$cmdname\] "
                        poll off
                        return 1
+               } else {
+                       echo "Info : \[$cmdname\] Debug access on $target is 
allowed."
                }
                return 0
        }
 
        # Mass erase and unlock the device using proprietary nRF CTRL-AP
-       proc _nrf_ctrl_ap_recover { ctrl_ap_num {is_cpunet 0} } {
+       proc _nrf_ctrl_ap_recover { ctrl_ap_num idr_value app_protect_register 
ready_to_reset_status reset_triger_value {is_cpunet 0} } {
+               
+               set cmdname [lindex [info level 1] 0]
+       
                set target [target current]
                set dap [$target cget -dap]
 
                set IDR [$dap apreg $ctrl_ap_num 0xfc]
-               if {$IDR != 0x12880000} {
-                       echo "Error: Cannot access nRF CTRL-AP!"
+               if {$IDR != $idr_value} {
+                       echo "Error: \[$cmdname\] Cannot access $target 
CTRL-AP!"
                        return
                }
 
                poll off
-
-               # Reset and trigger ERASEALL task
-               $dap apreg $ctrl_ap_num 4 0
+               
+               set APPROTECTSTATUS [$dap apreg $ctrl_ap_num 
$app_protect_register]
+               if {$APPROTECTSTATUS == 0x0} {
+                       echo "Info : \[$cmdname\] $target not locked. Skipping 
recovery."
+                       return
+               }
+                       
+               # Trigger the Erase all
                $dap apreg $ctrl_ap_num 4 1
-
+               
                for {set i 0} {1} {incr i} {
-                       set ERASEALLSTATUS [$dap apreg $ctrl_ap_num 8]
-                       if {$ERASEALLSTATUS == 0} {
-                               echo "\[$target\] device has been successfully 
erased and unlocked."
+                       set ERASEALLSTATUS [$dap apreg $ctrl_ap_num 0x8]
+                       if {$ERASEALLSTATUS == $ready_to_reset_status} {
+                               echo "Info : \[$cmdname\] $target is erased 
ready for reset."
                                break
                        }
                        if {$i == 0} {
-                               echo "Waiting for chip erase..."
+                               echo "Info : \[$cmdname\] Waiting up to 5 
seconds for $target to be erased and ready to reset..."
                        }
-                       if {$i >= 150} {
-                               echo "Error: \[$target\] recovery failed."
+                       if {$i >= 50} {
+                               echo "Error: \[$cmdname\] $target recovery 
failed."
                                break
                        }
                        sleep 100
                }
+               
+               # Trigger the reset
+               $dap apreg $ctrl_ap_num 0 $reset_triger_value
 
-               # Assert reset
-               $dap apreg $ctrl_ap_num 0 1
+               _nrf_check_ap_lock 2 $app_protect_register 0
 
                # Deassert reset
                $dap apreg $ctrl_ap_num 0 0
 
-               # Reset ERASEALL task
+               # Reset ERASEALL task 
                $dap apreg $ctrl_ap_num 4 0
 
                if { $is_cpunet } {
-                       reset init
                } else {
+                       reset init
                        sleep 100
                        $target arp_examine
                        poll on
@@ -84,3 +100,6 @@ if { [using_hla] } {
 
        lappend _telnet_autocomplete_skip _nrf_check_ap_lock 
_nrf_ctrl_ap_recover
 }
+
+
+       
\ No newline at end of file
diff --git a/tcl/target/nordic/nrf52.cfg b/tcl/target/nordic/nrf52.cfg
index 0703b18862..c5b5194aad 100644
--- a/tcl/target/nordic/nrf52.cfg
+++ b/tcl/target/nordic/nrf52.cfg
@@ -53,67 +53,22 @@ if { [using_hla] } {
 flash bank $_CHIPNAME.flash nrf5 0x00000000 0 1 1 $_TARGETNAME
 flash bank $_CHIPNAME.uicr nrf5 0x10001000 0 1 1 $_TARGETNAME
 
+source [find target/nordic/common.cfg]
+
 # 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 [$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
-       }
+       #_nrf_check_ap_lock { ctrl_ap_num app_protect_register unlocked_value }
+       _nrf_check_ap_lock 1 0xc 0
 }
 
+add_help_text nrf52_check_ap_lock "Check lock status of nrf52"
+
 # 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 [$dap apreg 1 0xfc]
-       if {$IDR != 0x02880000} {
-               echo "Error: Cannot access nRF52 CTRL-AP!"
-               return
-       }
-
-       poll off
-
-       # Reset and trigger ERASEALL task
-       $dap apreg 1 4 0
-       $dap apreg 1 4 1
-
-       for {set i 0} {1} {incr i} {
-               set ERASEALLSTATUS [$dap apreg 1 8]
-               if {$ERASEALLSTATUS == 0} {
-                       echo "$target device has been successfully erased and 
unlocked."
-                       break
-               }
-               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
-
-       # Reset ERASEALL task
-       $dap apreg 1 4 0
-
-       sleep 100
-       $target arp_examine
-       poll on
+       #_nrf_ctrl_ap_recover { ctrl_ap_num idr_value app_protect_register 
ready_to_reset_status reset_triger_value {is_cpunet 0} }
+       _nrf_ctrl_ap_recover 1 0x02880000 0xc 0 1 0
 }
 
 add_help_text nrf52_recover "Mass erase and unlock nRF52 device"
diff --git a/tcl/target/nordic/nrf53.cfg b/tcl/target/nordic/nrf53.cfg
index 0dcfd55eca..9bd98b1a13 100644
--- a/tcl/target/nordic/nrf53.cfg
+++ b/tcl/target/nordic/nrf53.cfg
@@ -79,8 +79,8 @@ if { ![using_hla] } {
        $_TARGETNAME_APP cortex_m reset_config sysresetreq
        $_TARGETNAME_NET cortex_m reset_config sysresetreq
 
-       $_TARGETNAME_APP configure -event examine-fail { _nrf_check_ap_lock 2 3 
}
-       $_TARGETNAME_NET configure -event examine-fail { _nrf_check_ap_lock 3 3 
}
+       $_TARGETNAME_APP configure -event examine-fail { _nrf_check_ap_lock 2 
0xc 3 }
+       $_TARGETNAME_NET configure -event examine-fail { _nrf_check_ap_lock 3 
0xc 3 }
 
        $_TARGETNAME_NET configure -event gdb-attach "_nrf53_cpunet_gdb_attach 
$_CHIPNAME"
 
@@ -120,7 +120,7 @@ if { ![using_hla] } {
                $_TARGETNAME_APP mww $RESET_NETWORK_FORCEOFF 1
                set err [catch {$_TARGETNAME_NET arp_examine}]
                if { $err } {
-                       if { ![_nrf_check_ap_lock 3 3] } {
+                       if { ![_nrf_check_ap_lock 3 0xc 3] } {
                                echo "Error: \[$_TARGETNAME_NET\] examination 
failed"
                        }
                        return
@@ -132,15 +132,17 @@ if { ![using_hla] } {
                $_TARGETNAME_APP mww $RESET_NETWORK_FORCEOFF 0
                $_TARGETNAME_APP mww $RESET_NETWORK_WORKAROUND 0
        }
-
+       
        # Mass erase and unlock the device using proprietary nRF CTRL-AP (AP #2 
or #3)
        proc nrf53_cpuapp_recover {} {
-               _nrf_ctrl_ap_recover 2
+               #_nrf_ctrl_ap_recover { ctrl_ap_num idr_value 
app_protect_register ready_to_reset_status reset_triger_value {is_cpunet 0} }
+               _nrf_ctrl_ap_recover 2 0x12880000 0xc 0 1 0
        }
        add_help_text nrf53_cpuapp_recover "Mass erase flash and unlock nRF53 
application CPU"
 
        proc nrf53_recover {} {
-               _nrf_ctrl_ap_recover 3 1
+               #_nrf_ctrl_ap_recover { ctrl_ap_num idr_value 
app_protect_register ready_to_reset_status reset_triger_value {is_cpunet 0} }
+               _nrf_ctrl_ap_recover 3 0x12880000 0xc 0 1 1
        }
        add_help_text nrf53_recover "Mass erase all device flash and unlock 
nRF53"
 }
diff --git a/tcl/target/nordic/nrf54l.cfg b/tcl/target/nordic/nrf54l.cfg
index 3e14055f14..eabd96a8b1 100644
--- a/tcl/target/nordic/nrf54l.cfg
+++ b/tcl/target/nordic/nrf54l.cfg
@@ -57,11 +57,36 @@ target create $_CHIPNAME.aux mem_ap -dap $_CHIPNAME.dap 
-ap-num 1
 $_CHIPNAME.dap apsel 1
 $_CHIPNAME.dap apcsw 0x01000000 0x01000000
 
+# Keep adapter speed less or equal 2000 kHz or flash programming fails!
 adapter speed 1000
 
 # Use main processor as default target.
 targets $_TARGETNAME
 
-if {![using_hla]} {
+source [find target/nordic/common.cfg]
+
+#flash bank $_CHIPNAME.flash nrf54 0x00000000 0 0 0 $_TARGETNAME
+#flash bank $_CHIPNAME.ficr nrf54 0x00FFC000 0 0 0 $_TARGETNAME
+#flash bank $_CHIPNAME.uicr nrf54 0x00FFD000 0 0 0 $_TARGETNAME
+#flash bank $_CHIPNAME.sicr nrf54 0x00FFE000 0 0 0 $_TARGETNAME
+
+#flash bank $_CHIPNAME.ext 0x00000000 0x01000000 2 2 $_TARGETNAME
+
+if { ![using_hla] } {
+
        $_TARGETNAME cortex_m reset_config sysresetreq
-}
+       $_TARGETNAME configure -event examine-fail nrf54l_check_ap_lock
+
+       proc nrf54l_check_ap_lock {} {
+               #_nrf_check_ap_lock { ctrl_ap_num app_protect_register 
unlocked_value }
+               _nrf_check_ap_lock 2 0x14 0
+       }
+       add_help_text nrf54l_check_ap_lock "Check lock status of nrf54l"
+               
+       proc nrf54l_recover {} {
+               #_nrf_ctrl_ap_recover { ctrl_ap_num idr_value 
app_protect_register ready_to_reset_status reset_triger_value {is_cpunet 0} }
+               _nrf_ctrl_ap_recover 2 0x32880000 0x14 1 2 1
+       }
+       add_help_text nrf54l_recover "Mass erase all device flash and unlock 
nRF54l"
+
+}
\ No newline at end of file
diff --git a/tcl/target/nordic/nrf91.cfg b/tcl/target/nordic/nrf91.cfg
index 64ed864e75..e806d42d9c 100644
--- a/tcl/target/nordic/nrf91.cfg
+++ b/tcl/target/nordic/nrf91.cfg
@@ -52,12 +52,13 @@ flash bank $_CHIPNAME.uicr nrf5 0x00FF8000 0 0 0 
$_TARGETNAME
 
 if { ![using_hla] } {
        $_TARGETNAME cortex_m reset_config sysresetreq
-
-       $_TARGETNAME configure -event examine-fail { _nrf_check_ap_lock 4 3 }
+       
+       $_TARGETNAME configure -event examine-fail { _nrf_check_ap_lock 4 0xc 3 
}
 }
 
 # Mass erase and unlock the device using proprietary nRF CTRL-AP (AP #4)
 proc nrf91_recover {} {
-       _nrf_ctrl_ap_recover 4
+       #_nrf_ctrl_ap_recover { ctrl_ap_num idr_value app_protect_register 
ready_to_reset_status reset_triger_value {is_cpunet 0} }
+       _nrf_ctrl_ap_recover 4 0x12880000 0xc 0 1 1
 }
 add_help_text nrf91_recover "Mass erase and unlock nRF91 device"

-- 

Reply via email to