2015/11/01

[esp8266]自分でアップグレードしたいとき

「2C-ESP8266__SDK__Programming Guide__EN_v1.4.pdf」の「3.9. Upgrade (FOTA) APIs」に、FOTAでアップグレードするときのAPIが書かれている。

  • system_upgrade_userbin_check()
  • system_upgrade_flag_set()
  • system_upgrade_flag_check()
  • system_upgrade_start()
  • system_upgrade_reboot()

うしろに「_check」が付いているのは、GET系のAPIで、それ以外はなにがしかの動作を起こす。

 

system_upgrade_userbin_check()は、今動作しているuser.binが、UPGRADE_FW_BIN1かBIN2かを返す。
説明文には特に書かれていないけど、examples/at/at_upgrade.cの使い方を見ると、UPGRADE_FW_BIN1が取れたときには"user2.bin"を、UPGRADE_FW_BIN2が取れたときには"user1.bin"をHTTP GETしようとしているから、そうなんじゃなかろうか。

system_upgrade_flag_check()は、現在のアップグレード進行状況を取得するようだ。
ESPRESSIFのサーバを使うならば、アップグレードはsystem_upgrade_start()を使うとうまいことやってくれるようなのだが、自分で何とかしたいとなるとそのAPIが使えないため、ダウンロードして、FLASHに焼いて、というのを自分でやらんといかん。
そこまでは自力でできるのだが、「どっち側のパーティションから起動するか」という情報はSystem Paramが持っているため、そう簡単に変更できない。

それをやってくれるのが、system_upgrade_flag_set()とsystem_upgrade_reboot()のようだ。
読んだ感じでは、

  1. system_upgrade_flag_set()でUPGRADE_FLAG_FINISHをセットする
  2. system_upgrade_reboot()を呼び出す

とすると、新しい方のパーティションで再起動してくれるようだ。


もう少しできてくれないか、期待してしまう。
何かというと、

  • ファーム更新のダウンロードができた
  • ダウンロードしたデータを焼けた
  • FLAG_FINISHをセットして、upgrade_rebootした
  • 再起動したけど、正常に立ち上がらなかった!
  • やっぱり前のパーティションに戻す

赤文字で書いた、最後の2行だ。
せっかく2面持ってやってるんだから、失敗したら元に戻したくなるではないか。

ただ「正常に立ち上がらなかった」を判断するのは、なかなか難しそうだ。
何を持って「正常」と見なすのか。

ブート部がどうなっているか知らないけど、こういうやり方はできるんじゃないかと思う。

  1. 電源ON
  2. System Paramの起動パーティション情報を読む
  3. System ParamのUpgrade Flag情報を読む
  4. Upgrade Flagが「FINISH」だったら、起動パーティションの反対側で起動させる。
    そうでなければ、起動パーティション側で起動させる。
  5. ブートからアプリに切り替わる
  6. アプリの起動が安定した時点で、起動パーティション情報とUpgrade Flag情報を読む
  7. Upgrade Flagが「FINISH」だったら、「IDLE」に書き換える

6の「安定した時点」が、正常起動と見なすタイミングだ。
まあ、これだけだとどうにもならないので、いくつか細工がいる。

まず、WDTはいるだろう。
「起動しない」が固まるとかだったら、WDTでリセット掛けないといかんだろう。

それだけだと再起動を繰り返すだけになるので、再起動起動カウンタみたいなのがいるのかな。
何度か再起動したら、Upgrade Flagを「IDLE」に戻してあきらめる、と。

FLASHの書き換え可能回数もあるだろうから、書き換えを少なくしたいとは思うが、なんかそういうしくみがいるんじゃなかろうかと思う。
system_upgrade_reboot()は、新しいパーティションで再起動する、とは書かれているのだが、この時点でSystem Paramを更新するかどうかまで書かれていないので、もしかしたら・・・という気もするが。


ネットで調べたりしたが、このしくみを使わない人も多く見つかるので、もっと手軽なプラットフォームがあるんだったらそっちを使いたい、という気もする。
Arduinoでやってる人が多く見つかるんだけど、私はそんなにWROOM-02単体で動かしたいって方じゃないので、ATコマンドでホスト側から操作する程度のことができればよいから、なるべくWROOM-02は標準に近くしておきたいのだ。

まあ、標準の方が今ひとつ、というのはしばしばあるけどね・・・。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。