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.
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)
Après toutes les étapes douloureuses ci-dessous, vous obtiendrez :
run
dans GDB, il rechargera les symboles du fichier ELF actuel, donc tous les symboles seront trouvés par GDB)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 !
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 :
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)
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).
Ok, vous avez fait le plus gros du travail, voyons ce que cela vous apporte :
(gdb) file .pio/build/mks_robin_nano35/firmware.elf
(gdb) run
Reloading source file because it was modified...
(gdb) monitor program .pio/build/mks_robin_nano35/firmware.bin 0x8007000
J'espère que cela vous aidera !