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" --
