Leonardo (32u4): façons de le brique par programme

8

Quand le Leonardo a été introduit, je pense que j'ai lu quelques articles sur la prudence de faire certaines choses, qui pourraient l'empêcher de charger de nouveaux croquis, il faut donc réécrire le chargeur de démarrage. Parce que je prévois d'utiliser des options d'économie d'énergie, par exemple pour désactiver les composants matériels inutilisés comme le port USB, je crains de faire quelque chose de mal.

Une délicatesse Leonardo que j'ai trouvée jusqu'à présent:

  • si les interruptions sont désactivées, le téléchargement de nouveaux croquis échoue à moins que l'on n'appuie sur le bouton Réinitialiser dès que l'IDE Arduino affiche "Téléchargement ..."

Quels éléments (à l'exception des idées habituelles liées au matériel, telles que la connexion de broches configurées en sortie à des potentiels fixes) pourraient endommager le contrôleur ou nécessiter de reflasher le Leonardo avec un nouveau chargeur de démarrage?

Thomas S.
la source
Généralement, les Arduinos sont impossibles à briquer via un logiciel à moins de jouer avec les fusibles sur la puce (ou de concevoir un robot pour détruire la carte: D).
Anonymous Penguin
1
Le chargeur de démarrage est toujours exécuté avant votre propre programme. Ainsi, lorsque vous appuyez sur le bouton de réinitialisation, le chargeur de démarrage démarre et vous pouvez télécharger votre nouveau programme, même si votre ancien programme était défectueux. La désactivation de certains composants n'est que temporaire et ils devraient être restaurés lorsque l'appareil est réinitialisé. En changeant les fusibles, vous pouvez rendre certaines options permanentes, alors essayez d'éviter d'avoir à les changer.
Gerben
2
Gerben, pourriez-vous s'il vous plaît ajouter votre commentaire comme réponse?
Thomas S.

Réponses:

1

Si vous téléchargez un programme qui modifie la vitesse du noyau USB, il serait presque brique. Que se passerait-il:

  1. Allumer, le chargeur de démarrage démarre, le périphérique USB énuméré sur le PC.
  2. Quelques secondes plus tard, démarrage du programme, la vitesse du noyau USB a changé, le périphérique USB disparaît du PC

Le problème ici est que non seulement vous devez appuyer sur réinitialiser le programme, mais après la réinitialisation, vous devez sélectionner rapidement le bon port de communication, puis télécharger avant le démarrage du programme.

Le Redbearlab Blend Micro nécessite une vitesse de base USB à définir dans le programme utilisateur. Dans leurs instructions de configuration, il y a une étape pour modifier le Arduino main.cpp et ajouter une section pour le faire. Si cette étape est manquée, le problème ci-dessus se produit.

geometrikal
la source
1

J'ai réussi à brider un ATMega128RFA1. Le chargeur de démarrage et le logiciel que j'ai téléchargé dessus fonctionnaient bien. Mais il était impossible d'effacer / d'écrire la ROM.

Après avoir vérifié ce qui s'est passé, j'ai découvert dans la fiche technique que certains fusibles du noyau AVR sont destinés à protéger l'écriture accidentelle sur la ROM. Une sorte de fusibles de sécurité.

Je n'ai jamais trouvé le bug qui a écrit dans ces octets (car c'était un très gros programme et nous étions 3 personnes impliquées dans le codage) mais oui, nous avons juste fait sauter un fusible et perdu un MCU à cause d'un bug.

En ce qui concerne le leonardo, plusieurs choses pourraient se produire, mais rien de tout cela ne peut briser votre carte à moins que vous ne souffliez l'un de ces fusibles de protection.

CopperMaze
la source
1

Il est possible, avec du code vraiment intelligent , d'exploiter le chargeur de démarrage pour se remplacer.

Extrait:

La solution est en fait assez simple sur le plan conceptuel. Un chargeur de démarrage, de par sa nature même, est conçu pour télécharger un nouveau firmware sur l'appareil. Il contiendra donc au moins une instruction spm. Étant donné que le registre de configuration spm ne doit pas être écrit plus de 4 cycles avant l'instruction spm, cela signifie qu'il y a très peu de séquences qui se produisent pratiquement: seulement sts, spm ou out, séquences spm. Donc, tout ce dont vous avez besoin est de trouver la séquence dans la section bootloader; mettre en place les bons registres et l'appeler.

Cependant, il s'est avéré que cela posait également un problème majeur. Les instructions spm du chargeur de démarrage auto-programmé V-USB ne sont pas une petite routine soignée, mais sont intégrées dans le code principal; donc l'appeler ferait juste planter l'AVR alors qu'il tentait d'exécuter le reste du chargeur de démarrage V-USB.

Méchant, mais encore une fois, il y a une solution. En utilisant une minuterie cadencée à la fréquence du processeur (ce qui est facile sur un AVR), vous pouvez créer une routine dans l'assembleur qui configure les registres pour la séquence spm de sortie du chargeur de démarrage; l'appelle et juste au moment où il exécute le premier cycle du SPM lui-même, l'interruption de la minuterie se déclenche et l'AVR devrait passer à votre routine d'interruption (dans l'espace d'application). La routine d'interruption fait apparaître l'adresse du chargeur de démarrage, puis revient au code précédent - qui est la routine qui configure la séquence spm de sortie. Cela devrait fonctionner, car lorsque vous appliquez des instructions spm à la section du chargeur de démarrage, le processeur est arrêté jusqu'à ce qu'il soit terminé.

Donc, fondamentalement, vous pouvez faire de la programmation sophistiquée et faire en sorte que le chargeur de démarrage s'auto-arrose, rendant le MCU inutile sans programmeur dédié.

Connor Wolf
la source
0

Celui que je connais fait que le Leonard se comporte comme une souris USB qui claque partout et tape des touches aléatoires afin que vous ne puissiez pas le reprogrammer sans faire une sorte de truc pour le contourner. Mais ils le mentionnent sur les documents de l'API.

EternityForest
la source