実用ライブラリシリーズ:ファームウェアアップデーター

Languages

English version is here: Practical library series : Firmware updater

概要

mbedはネットワークとの親和性も高く、世界各地で様々なアプリケーションに用いられています。

例えば、少し離れた位置に設置されたmbedのファームウェアアップデートを考えた場合、わざわざパソコンに接続してアップデートするのは少し面倒です。

そこで、ここではクラウド上にあるHTTPサーバにファームウェアのアップデーターを用意するだけで、自動的にmbedが自身のファームウェアをアップデートすることのできるクラスを設計実装しました。

これを使えば、遠隔地にあるmbedのファームウェアアップデートも思いのままです。

mbed側はHTTPサーバに設置されたファームウェアバージョンと自身が持つファームウェアバージョンと比較して、HTTPサーバ上にあるファームウェアの方が新しい場合にダウンロードして自己リセットをかける仕組みです。

使い方

mbed側

  1. 通常どおりプログラムをmbedのローカルストレージにダウンロードします。(例:firm.bin) http://mbed.org/media/uploads/shintamainjp/firm.bin
  2. ファームウェアバージョンテキストをmbedのローカルストレージに設置します。(例:firm.txt) http://mbed.org/media/uploads/shintamainjp/firm.txt
10

ロギングをtrueに設定するとログファイルも生成されます。動作を確認したい場合に便利です。

サーバ側の設定

  1. HTTPサーバにファームウェアバイナリを設置します。(例:firm.bin) http://mbed.org/media/uploads/shintamainjp/firm.bin
  2. HTTPサーバにファームウェアバージョンテキストを設置します。(例:firm.txt) http://mbed.org/media/uploads/shintamainjp/firm.txt
25

ライブラリの設定

FirmwareUpdater fwup("http://mbed.org/media/uploads/shintamainjp/", "firm", true); 

動作の説明

ライブラリ関数exist
  • サーバ上のバージョンテキストとローカルファイルシステム上のバージョンテキストを比較します。
  • サーバ上のバージョンテキストに書かれた数値がローカルファイルシステム上のそれよりも大きい場合、0を返します。
ライブラリ関数execute
  • ファームウェアバイナリを一時ファイルにダウンロードします。
  • ファームウェアバージョンファイルを一時ファイルにダウンロードします。
  • ファームウェアバイナリとバージョンテキストファイルの一時ファイルへのダウンロードが成功したら、ローカルファイルシステム上でそれらを.binと.txtにコピーします。
ライブラリ関数reset
  • mbed本体にリセットをかけます。

インターフェース

シンプルなインターフェースでファームウェアアップデートを提供します。

テストプログラム

#include "mbed.h"
#include "FirmwareUpdater.h"
#include "EthernetNetIf.h"

EthernetNetIf eth;
FirmwareUpdater fwup("http://mbed.org/media/uploads/shintamainjp/", "firm", true); 

// There are 2 files for the firmware.
//  1. firm.txt : firmware version file.
//  2. firm.bin : firmware binary file.

void check_newfirm() {
    if (fwup.exist() == 0) {
        printf("Found a new firmware.\n");
        if (fwup.execute() == 0) {
            printf("Update succeed.\n");
            printf("Resetting this system...\n\n\n\n\n");
            fwup.reset();
        } else {
            printf("Update failed!\n");
        }
    }
}

int main(void) {
  
    eth.setup();
 
    check_newfirm();

    // Your application is here.   
}

ライブラリ

よくある質問

どうしてバージョン情報テキストファイルなど用意するのですか?バージョンサフィックスを走査すれば良いのではないですか?

バージョンの検出はローカルファイルシステムとサーバ上で必要になります。
もし、バージョンサフィックスを走査するならば沢山の時間が必要です。
また、バージョンが大量にある場合には更に多くの時間を必要とします。
これらを避ける目的でテキストファイルを設置することにしました。

どうしてバージョン情報テキストファイルに.txtという拡張子を付けるのですか?

mbed.orgにアップロード可能なファイルは拡張子の制限があります。
mbed.orgをアップデート用サーバとして利用することができるようにするためです。

どうして.binファイルにバージョンサフィックスを付けるのですか?

これはmbedのLocalFileSystemの制約から来ています。

mbedのLocalFileSystemを使ってプログラムから書き込む場合
 1.「8+3ファイル名であること。」
 2.「タイムスタンプが付かないこと。」
の制約を考慮する必要があります。

mbedは自身のローカルストレージに新しいバイナリが投入された事を以下のように判定します。
 1.バイナリファイル.binを走査する。
 2.そのバイナリの更新日を検査する。
 3.バイナリが新しければ書き込みを実行する。 

これを先ほどの制約と照らし合わせると以下の事がわかります。
 ・タイムスタンプが付かないので、同名のファイルでは更新を検知できない。
 ・タイムスタンプが付かないので、手動でパソコンなどからコピーしたファイルの方が必ず新しい。

そこで、このライブラリでは
 ・手動でコピーしたバイナリファイル.binが最新と検知されると機能を提供できないため、バイナリファイル.binは全て削除する。
 ・同名ファイルでファームウェアをダウンロードした場合、タイムスタンプが変化しないためmbedが更新を検知できない。これを回避するためにファイル名にバージョンサフィックスを加える。
としました。     

どうしてアプリケーション名は8文字以下でなければならないのですか?

これはmbedのLocalFileSystemの制約から来ています。
他の「よくある質問」の情報もご覧下さい。

なぜmbed上の全ての.binファイルを消してしまうのですか?

これはmbedのLocalFileSystemの制約から来ています。
他の「よくある質問」の情報もご覧下さい。

 

私のストレージはmbed.orgのどこにあるのですか?

あなたのページの「Add new notebook page」"を選択します。
 
ダイアログの「Browse」ボタンを押します。
 
File browserの「Upload file」を押します。
    
ターゲットファイルを選択してください。
 
制限
  • 高信頼性システムへの適用は御遠慮下さい。
  • 原理的にシステムにとって一時的に危険な瞬間が存在します。この処理の間に失敗した場合、通常のファームウェアダウンロード作業を行う必要があります。


0 comments

You need to log in to post a comment