2011年1月19日水曜日

ATmega1284P Bootloaderについてのまとめ。

制限だらけのBootloaderへのアクセスが増えてるので、作った本人としてまとめ。

optibootにしろ、ATmegaBootにしろ、コンパイルは問題無くできるし、他のいくつかも試した。私自身か改造した物も、動いていたから安心していたら、HEXダンプしてみたら、FC00の64KB の辺りに、コードが置かれていて、なぜこれで動いているのと言う状況だった。

症状は二種類出て、この64KBの辺りに書かれてる物、64KBと128KBの両側に分けれてしまうもの・・何故か、64KBのとこにコードが有る物でも64KBとしてなら、普通に動く物もある、(ロックかかってないし、ベリファイエラーが出て当然なのだが、動く物も有る)

Avrdudeしてみると、ほとんどが、書き込みデーター量64KBと出た。物によっては、シグネチャーが、644Pで出た、つまり、644Pに誤認させて動かしてたとか・・もちろん64KB

変なところに、ブートローダーが有ると、書き込み後に消されちゃうか、ベリファイエラーが出て止まる。
ブートローダーのコードを、1FC00のとこに持って行かなければいけない事になる。

ソースコードを弄って実行すると今度は、「容量オーバー」と出た。1C00まで落とせば、書き込めたが、何か変な位置にコードが入っていた。結果的に、一回動くが、それで上書きされて終わった。

諦めようかと思ったが、HEXその物を開いてみてると。
最初に02から始まる書き込み位置のジャンプコード、それ以降は、相対位置と思われるHEXコードが入っていた。
そこで、初めて、INTEL HEXコードの命令と言うサイトを見て、02の意味は、?ここは、ビックエンディアン?・・で、チェックサムは解るから・・じゃあ強制的に移動してみようか・・で・・・iPodに入れた、HEX電卓片手に、0から、8ビットずつ引き算するチェックサムを計算しながら、二三回書き込んでみると、正しい位置に、コードが書き込まれ、正しく実行出来たので、最適な位置の、1FC00に固定した。

とりあえず、これで、自分の、1284Pは動いたから、安心していた。


欲しいと言う声が有ったので、momo氏に送ると動かないと言う・・そのHEXは、私の環境、CrossPackの中に含まれる、Avrdude 5.8を、GUIである、AVRfuseで書き込む分には、そのまま実行できていた。Lock出来ないので、そこだけは、手動でしていたが・

試しに、Arduino IDEに入れて、書き込みを実行すると、エラーが出まくった。
最新の、AVRdude5.10をダウンロードして、書き込もうとしてもやはりエラーが出た。

最初は、CrossPackのAvradude5.8に、自分で書いた、avrdude,confを疑ったが、書けてるので、この内容を、両方のAvrdudeが読むように交換してみたが、やはり駄目だった。

この時点で、自分の環境でしか書けないと悟り・・・「送ってくれたら、書いて返すよ」としようかと思ったが・・・


動いてるMCUはコピー出来ると言うのを思い出した。一応LOCKbitをFREEにして、5.10の環境で、HEXを読み出して、再書き込みしたら、当然動いた。

それをまた安心して、5.8で書いてみたら、動かなくなってしまったのだ。

じゃあもしかして・・で、ArduinoIDEの中に入れて書き込ませたら、やはり動かない。

こなったらしょうがないね・・と言う事で・・5.10とArduino付属の物で、HEXを別々に起こして、個別の、HEXで実行させたら、Arduino IDEからも、ただしく書き込めるようになった。

たぶん、Arduino付属のAvrdudeも最新のAvrdudeも、私の手書きした、書き込み位置指定のコードをエラーにしたが、何故か、CrossPack付属の5.8では通ったと言う・・完全な偶然で出来たって事になる。


ただどうしても疑問なのは、HEXダンプは、ジャンプコードが無く、本当に、メモリーの中身の地図だ、その地図が、Arduinoと、5.10で結果が違うと言うのが、凄い疑問に残っているが(これはAVRdude,confの差の可能性も有る)

この間に、出来たばかりの、USBtiny ISPで書き込んだら、64KBから先に書いてないっぽいと言う問題も発生したし・・何か書いてるみたいだが、ベリファイエラーが出て、読み出すと、空って表示した。


この条件で、使ってるのがMACで有る事とかまで考慮すると、何処に問題が有るのか解決出来なかった。

WindowsのAVRstudioから書き込みを実行したら、元のコードでもそのまま行けるのかも知れない訳だ。あるいは、Linuxならばと言う事になってしまう。なおかつ、Avrdudeのバージョンでの動作の差・・

ここまで不確定要素が増えると、「なぜか?」が特定できない。無数の条件がありすぎ、1週間くらいかければ、これでコンパイルして、書き込めば、スムーズで、何の問題も無いって言う結論が出るかも知れないが・・そこまで賭けなければいけないほどでは無いので、丸一日の成果として、「動くけど、なぜHEXが二個必要か解らないバージョン」として問題提起として、公開してみてると言うのが現状。

medoelec氏の方で、AVRisp Mk2を持ってるそうなので、ライター依存も疑っているので、AVRstudioからの書き込みや、Win-AVRでのコンパイルをお願いして、ワークファイルを送って有るが・・

他にも研究してみたい方が居れば、ワークファイルごと送りますので、連絡を下さい。


正しく実行出来るようになれば、まさに、世界初かもしれない、ATmega1284PのOptibootの改変者になれるかも知れません。(Optiboot作ってるグーループの方が詳しいと思うけど64KB超えがアン・サポートなのは、私と同じ結果なのでは無いかと、ちょっと考えている。つまり、書き込める環境が限定されるから、サポート出来ないって事なのではと思うのだ。)

また、Avrdudeごとの反応の違いから言って、その理由が、AVRdudeに有るならそれに依存する、Arduinoを含んで、お手上げかも知れない。(違う、AVRdudeで書けないと言う理由で)それはOptibootの開発グループの責任では無い。


違うライター、違う書き込み環境なら、そのまんま行ける可能性も十分あり

USBaspx等で、試してみて欲しい。

当方に全く違う環境として、デジットのライターもあるから、それが、1284Pに対応したらやってみる気は有るが、現状は未対応だった。

OptibootのMakeと、ソースを少しいじってコンパイルしただけの変更だが、ソースごと欲しい方はご連絡下さい。

とりあえず、私の一個は動いたし、momo氏のも動いたそうなので・・私はこれ以上突っ込んで研究する気は有りません。

0 件のコメント:

コメントを投稿