Leonardo(32u4):プログラムでそれをブリックする方法


8

Leonardoが導入されたとき、私はいくつかのことをするのに注意することについていくつかの記事を読んだので、新しいスケッチをロードできなくなる可能性があるため、ブートローダーを書き直す必要があります。USBポートなどの未使用のハードウェアコンポーネントを無効にするなど、省電力オプションを使用する予定なので、何か間違ったことを恐れています。

これまでに見つけたレオナルドの珍味の1つ:

  • 割り込みが無効になっている場合、Arduino IDEに「Uploading ...」と表示されてすぐにリセットボタンを押さない限り、新しいスケッチのアップロードは失敗します。

どのようなもの(出力構成されたピンを固定電位に接続するような通常のハードウェア関連の考えを除いて)は、コントローラーを損傷したり、新しいブートローダーでLeonardoを再フラッシュしたりする必要がありますか?


一般的に、Arduinoは、チップ上のヒューズをいじる(またはボードを破壊するロボットを設計する)場合を除いて、ソフトウェアを介してブリックすることは不可能です:D)。
匿名のペンギン

1
ブートローダーは常にあなた自身のプログラムの前に実行されます。そのため、リセットボタンを押すと、ブートローダーが起動し、古いプログラムに問題がある場合でも、新しいプログラムをアップロードできます。特定のコンポーネントの無効化は一時的なものであり、デバイスをリセットすると復元されます。ヒューズを交換することで、特定のオプションを永続的にすることができるため、ヒューズを交換する必要がないようにしてください。
Gerben 14

2
ガーベン、コメントを回答として追加していただけませんか?
トーマスS.

回答:


1

USBコアの速度を変更するプログラムをアップロードした場合、ほとんどブリックになります。これはどうなるでしょう:

  1. 電源を入れ、ブートローダーを起動し、USBデバイスをPCに列挙します。
  2. 数秒後のプログラム開始、USBコア速度の変更、USBデバイスがPCから消える

ここでの問題は、プログラムをリセットする必要があるだけでなく、リセット後に適切なCOMポートをすばやく選択して、プログラムが開始する前にアップロードする必要があることです。

Redbearlab Blend Microでは、ユーザープログラムでUSBコア速度を設定する必要があります。彼らのセットアップ手順には、Arduino main.cppを編集し、そのためのセクションを追加するステップがあります。この手順を怠ると、上記の問題が発生します。


1

私はなんとかATMega128RFA1をブリックウォールしました。ブートローダーとそれにアップロードしたソフトウェアは問題なく動作していました。しかし、ROMの消去/書き込みは不可能でした。

何が起こったかを確認した後、AVRコアの一部のヒューズはROMへの誤った書き込みを保護することを目的としていることがデータシートでわかりました。ある種のセキュリティヒューズ。

これらのバイトで書かれたバグは見つかりませんでした(非常に大きなプログラムであり、コーディングに関与したのは3人だったためです)。そうです、バグのためにヒューズを飛ばしてMCUを失いました。

レオナルドに関しては、いくつかのことが起こる可能性がありますが、この保護ヒューズの1つを切断しない限り、これらのどれもボードをブリックウォールできません。


1

いくつかの本当に賢いコードで、ブートローダーを悪用して自分自身を上書きすることが可能です。

抜粋:

ソリューションは、実際には概念的にはかなり単純です。ブートローダーは、その性質上、新しいファームウェアをデバイスにダウンロードするように設計されています。したがって、少なくとも1つのspm命令が含まれます。spm構成レジスタは、spm命令の4サイクル以内に書き込む必要があるため、実際に発生するシーケンスは非常に少ないことを意味します。sts、spm、またはout、spmシーケンスのみです。したがって、必要なのは、ブートローダーセクションでシーケンスを見つけることだけです。適切なレジスタを設定して呼び出します。

しかし、それにも大きな問題があることがわかりました。V-USBセルフプログラミングブートローダーのspm命令は、きちんとした小さなルーチンではありませんが、メインコードにインライン化されています。したがって、それを呼び出すと、残りのV-USBブートローダーを実行しようとしたときにAVRがクラッシュします。

厄介ですが、解決策があります。CPU周波数でクロックされるタイマー(AVRでは簡単です)を使用して、ブートローダーのout、spmシーケンス用のレジスターをセットアップするルーチンをアセンブラーで作成できます。それを呼び出して、spm自体の最初のサイクルが実行された瞬間に、タイマー割り込みがオフになり、AVRが(アプリケーション空間で)割り込みルーチンにジャンプするはずです。割り込みルーチンは、ブートローダーアドレスをポップしてから、前のコードに戻ります。これは、出力、spmシーケンスをセットアップするルーチンです。ブートローダーセクションにspm命令を適用すると、完了するまでCPUが停止するため、これは機能するはずです。

したがって、基本的には、豪華なプログラミングを行って、ブートローダーにそれ自体をホースさせ、専用のプログラマーがなければMCUを役に立たなくすることができます。


0

私が知っているのは、LeonardをUSBマウスのように動作させて、どこにでもフラップし、ランダムなキーを入力することです。これにより、回避するためのなんらかのトリックを行わないとプログラムを変更できません。しかし、彼らはこれをAPIドキュメントで言及しています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.