Factory reset d'un Nrf52840 sans Jlink

Tags: électronique

[Quick translation in english : how to remove protection of a NRF5x (E.G. E73 dongle) only with a PC and a ST-LINK V2. Use google translate for the rest.]

J'ai joué avec des Nrf52 (des MCU super-droles de Nordic Semiconducteurs), plus spécifiquement des boards E73 de Ebyte, avec des Nrf52840 dedans. Malheureusement, ils étaient livrés "protégés", et il faut faire un "factory reset" (des fois appelé "mass erase", mais cela peut être trompeur) pour pouvoir en jouir.

Après des recherches sur internet, il semble que c'est un probleme connu, et la solution donnée un peu partout est de passer par "nrfprog" (programme binaire filé par Nordic) via un programmateur JLink pour faire un "mass erase" (via l'option "--recover" de "nrfjprog").

Openocd ne permet apparemment pas de le faire. Pourquoi ? Il semble que le "factory reset" sur les Nrf5x doit se faire via un "access port" spécifique "CTRL-AP", propriétaire à Nordic, mais documenté, et qui n'est pas géré par openocd qui a bien un mass_erase, mais qui ne marche pas sur mon MCU protégé.

Je n'avais pas de JLink sous la main, juste des ST-Link-V2 chinois. Il y a bien des Jlinks chinois pas cher, mais je veux pas attendre 1 mois... Comment alors accéder à mon plaisir sans avoir a passer des heures à comprendre comment faire du SWD from scratch ?

Il y a un logiciel "blackmagic" qui implémente le "factory reset" des nrf5x via le CTRL-AP. Il peut être compilé sur différentes plateformes, dont PC+Stlinkv2 (avec "make PROBE_HOST=pc-stlinkv2")

Deux petits problèmes que j'ai rencontré. Premier, il ne voulait pas de mon dongle chinois pour cause de "mauvaise version de firmware". J'ai désactivé la partie du code que me jettait, et cela avait l'air de passer.

Puis, il faut lancer blackmagic, se connecter avec gdb, faire un scan, et lancer "erase_mass":

$ arm-none-eabi-gdb
GNU gdb (GDB) 9.1
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
[...]
For help, type "help".
Type "apropos word" to search for commands related to "word".
(gdb) target extended-remote localhost:2000
Remote debugging using localhost:2000
(gdb) monitor help
General commands:
        version -- Display firmware version info
        help -- Display help for monitor commands
        jtag_scan -- Scan JTAG chain for devices
        swdp_scan -- Scan SW-DP for devices
        targets -- Display list of available targets
        morse -- Display morse error message
        halt_timeout -- Timeout (ms) to wait until Cortex-M is halted: (Default 2000)
        connect_srst -- Configure connect under SRST: (enable|disable)
        hard_srst -- Force a pulse on the hard SRST line - disconnects target
(gdb) monitor swdp_scan
Target voltage: 3.23V
Available Targets:
No. Att Driver
 1      Nordic nRF52 Access Port 
(gdb) attach 1
Attaching to Remote target
[...]
0x58e6b31a in ?? ()
(gdb) monitor help
General commands:
        version -- Display firmware version info
        help -- Display help for monitor commands
        jtag_scan -- Scan JTAG chain for devices
        swdp_scan -- Scan SW-DP for devices
        targets -- Display list of available targets
        morse -- Display morse error message
        halt_timeout -- Timeout (ms) to wait until Cortex-M is halted: (Default 2000)
        connect_srst -- Configure connect under SRST: (enable|disable)
        hard_srst -- Force a pulse on the hard SRST line - disconnects target
Nordic nRF52 Access Port specific commands:
        erase_mass -- Erase entire flash memory
(gdb) monitor erase_mass

Puis là, pouf, segfault dans blackmagic. Sans doute un bug de gestion de mémoire. Mais un lancement de blackmagic via valgrind pour essayer de trouver le bug, bien que m'affichant des erreurs mémoire, a marché pour faire le factory reset... Pas la peine d'aller plus loin pour ma part avec blackmagic...

Du coup, un nouvel "monitor swdp_scan" fait apparaitre un AP M3/M4 classique... Et openocd semble pouvoir programmer tout comme il faudrait.