Débogage avancé de la carte Robin Nano (STM32) de MKS

Si vous avez besoin de déboguer le micrologiciel de votre imprimante, vous avez probablement déjà lu mon précédent article. Si ce n'est pas le cas, je vous conseille de le lire.

Ce billet a pour but de résoudre les problèmes et/ou défauts restants du débogage afin qu'une session de débogage soit 100% stable et reproductible.

Exigence

Je me concentre sur la carte Robin Nano v1.2 de MKS parce que c'est celle que j'ai. Les instructions ci-dessous sont assez génériques pour fonctionner sur n'importe quelle carte, mais le fichier bootloader fourni est spécifique à cette carte, donc vous ne devez pas l'utiliser sur une autre carte.

Vous avez besoin d'un dongle USB ST-Link V2 (ou, si vous avez un dongle ST-Link plus ancien, il fonctionnera également).

Vous devez avoir installé OpenOCD (voir le post précédent pour les instructions)

Ce que vous obtiendrez

Après toutes les étapes douloureuses ci-dessous, vous obtiendrez :

  1. Un bootloader déverrouillé
  2. Le GDB pourra réinitialiser la carte sans perdre la connexion
  3. GDB pourra télécharger un microprogramme (donc plus de piratage ni d'échange de carte SD après chaque construction)
  4. Débogage fiable à 100% (l'accès aux registres protégés de GDB fonctionne, vous pourrez donc vider le contenu flash tout en retraçant le code par exemple)
  5. OpenOCD silencieux (toutes les erreurs du ST-Link V2 disparaîtront puisque la plupart d'entre elles sont dues à la protection contre la lecture de la flash)
  6. Les Symboles ! (puisque vous pouvez maintenant lancer run dans GDB, il rechargera les symboles du fichier ELF actuel, donc tous les symboles seront trouvés par GDB)

Situation

Comme vous l'avez peut-être déjà constaté, le débogage avec ST-Link V2 est douloureux lorsqu'un bootloader verrouillé est installé sur la flash (par défaut lorsque vous recevez la carte). Cela vous empêche de manipuler le contenu de la flash (vous devez donc copier le fichier .BIN sur la carte SD après chaque compilation, et définir un point de "synchronisation" spécifique afin de pouvoir faire Ctrl+C dans GDB plus tard et changer d'état pour continuer). Vous avez de nombreuses limitations aux commandes GDB que vous pouvez utiliser (comme le fait que "run" ne fonctionne pas correctement).

Tout cela se produit à cause de l'état de verrouillage de la mémoire flash. Il s'agit d'une protection des microcontrôleurs STM32 afin d'empêcher la lecture du contenu de la mémoire flash et, par conséquent, d'empêcher la perte du secret commercial. Malheureusement, si vous déverrouillez la mémoire flash, le contenu de la mémoire flash est effacé, et vous allez donc perdre le bootloader. Sans chargeur d'amorçage, votre carte ne pourra plus démarrer (ou vous devrez modifier beaucoup de choses dans le noyau interne de Marlin).

Ce qui est stupide avec ce système, c'est que le bootloader implémente une fonction pour effacer / lire et écrire le flash, puisqu'il est capable de mettre à jour le firmware. Donc, rien n'empêche un développeur d'écrire un logiciel qui lie le bootloader et le sauvegarde sur la carte SD, rendant la protection inutile.

Ne vous inquiétez pas, c'était déjà fait et j'ai mis en téléchargement le bootloader de la carte Robin Nano v1.2 afin que vous n'ayez pas à développer un tel programme vous même. Le "bootloader officiel" de ce dépôt de code source ne fonctionne pas, il est juste trop gros.

Attention, le binaire du bootloader ci-dessus ne fonctionne que pour la carte MKS Robin Nano v1.2, si vous avez une carte différente, il échouera et cassera votre imprimante.

Si vous avez une autre carte, vous devez trouver un binaire de bootloader valide pour celle-ci, n'hésitez pas à ajouter dans les commentaires votre bootloader.bin pour votre carte.

Ok, maintenant nous avons tout ce dont nous avons besoin, commençons à pirater !

Etape 1 : Déverrouiller le CPU

Les STM32 disposent d'un système de protection qui, une fois activé, empêche l'accès externe au contenu flash. Par externe, je parle des accès via JTAG/SWD. Cette protection a 3 niveaux :

  1. Niveau 0 : aucune protection
  2. Niveau 1 : les lectures ne sont pas autorisées, mais la protection peut être remise au niveau 0
  3. Niveau 2 : l'interface de débogage est désactivée. Il n'y a aucun moyen de désactiver la protection.

Si vous êtes dans le cas du niveau 2, pas de chance. Cela est très peu probable, car cela signifierait que le chargeur d'amorçage serait beaucoup plus complexe et que le fournisseur maintient 2 versions différentes de sa chaîne de production (donc 2x le coût). Nous allons déverrouiller le CPU pour qu'il se réinitialise au niveau 0. Pour ce faire, il faut effacer la flash, donc assurez-vous d'avoir un fichier .BIN valide avant de tenter quoi que ce soit d'autre, sinon vous allez plantez votre carte

Ok, vous devez donc déclencher OpenOCD et lancer GDB (voir le post précédent). Une fois dans GDB, vous devrez vous connecter au serveur comme ceci :

(gdb) tar ext:3333
blablabla : succès
(gdb)

Ensuite, nous devons envoyer une commande à OpenOCD directement, via la commande GDB "monitor" :

(gdb) moniteur reset halt
(gdb) monitor stm32f1x unlock 0
(gdb) moniteur reset halt

La deuxième ligne efface tout le flash. Cela signifie qu'après avoir appelé cette ligne, votre carte ne démarrera plus (sauf si vous passez à l'étape suivante)

Étape 2 : Programmer à nouveau le bootloader

Une fois que le flash est complètement effacé, vous devrez flasher à nouveau le bootloader. Je le fais via la commande :

(gdb) monitor program bootloader.bin 0x8000000
(gdb) monitor reset run

Après la deuxième commande, l'écran de l'imprimante devrait afficher son habituel "Booting..." avec son affreux carillon. Si cela ne fonctionne pas, vous pouvez utiliser st-flash à partir de st-util, en gros vous voulez flasher le fichier bootloader.bin à l'adresse 0x8000000 (c'est le début de l'adresse flash).

Étape 3 : Profitez-en !

Ok, vous avez fait le plus gros du travail, voyons ce que cela vous apporte :

  1. Vous pouvez lancer gdb sur le fichier ELF pour avoir le symbole et GDB ne sera pas perdu en les mappant
     (gdb) file .pio/build/mks_robin_nano35/firmware.elf
  2. Vous pouvez redémarrer un programme et tous les points d'arrêt précédents seront réinstallés de manière transparente, toute modification du firmware source sera rechargée de manière transparente
     (gdb) run
     Reloading source file because it was modified...
  3. Vous pouvez flasher un nouveau binaire directement à partir de votre débogueur (attention : vous devez sélectionner un fichier bin et régler vous-même l'offset dans la flash ou vous effacerez le bootloader)
    (gdb) monitor program .pio/build/mks_robin_nano35/firmware.bin 0x8007000

J'espère que cela vous aidera !

Article précédent Article suivant

Articles en relation