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
This commit is contained in:
parent
ec16e522bf
commit
73a5f58adb
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue