nRF51 での FOTA の仕組み
DFUService というのが mbed の BLE_API だと提供されていて勘違いしたけど、これは実際のファームウェア書きこみ処理は一切行わない。これがやっていることは bootloader を起動するということだけだ。
FOTA の仕組みとしては
- クライアントは DFUService に対してリクエスト
- DFUService はアプリケーション抜けて bootloader として再起動する
- クライアントは再度 DFU を見つけて通信を行う
- bootloader はBLE経由でデータを受けとってFlashに書きこむ
- bootloader はアプリケーションを起動する
という感じですすむ。
mbed 環境でのやりかた
まず、コンパイル済みの bootloader が必要で、これを USB 経由で書きこむ。これで準備完了になるので、これ以降は FOTA だけで書く必要がある。USB 経由で書きこむと bootloader を上書きしてしまうので、FOTA は無効になる 。
bootloader はどれを使うか
https://github.com/RedBearLab/nRF51822-Arduino/tree/S130/bootloader
Arduino IDE 経由で書きこめる bootloader になっているが、FOTA の機能もついている。BLE Nano だとこれ使っておけば良さそう。他のも使ってみたがこれだけ動いた。
mbed からデフォルトでダウンロードされる hex は書けない
ただ、上記 bootloader.hex を書きこんでも、mbed のオンラインコンパイラでコンパイル・リンクして生成される hex ファイルでは基本的に書きこめずに失敗する。これは mbed 環境でコンパイルした場合、親切にも SoftDevice などをマージした状態で hex を作ってくれるから。しかし FOTA するのはアプリケーションの部分だけなので、余計な部分を取り除く必要がある。
これは nRF51_OTA_strip.py を使えばできる。単に引数に入力と出力を与えればアプリケーション部分だけの hex ファイルを吐いてくれる。
ここを変えれば FOTA 版が落とせるみたいです。気付かなかった。ここで FOTA 版を選択すると、DFUService は自動的に組込まれてコンパイルされます。
書きこみかた
できた hex ファイルをなんとかして Android か iPhone に転送する。Google Drive に突っ込むのがてっとり早い。
そして nRF Toolbox を使って DFU をする。このとき、Init packet がどうたらというダイアログがでるが No を選択する。
Device を選択して Upload をタップすれば DFU がはじまる。結構時間がかかる。
bootloader のソースコードは?
https://github.com/ARMmbed/nrf5x-dfu-bootloader
たぶんこれがそれっぽい。ビルドしてないので確認はしてない。
OS X で DFU できないの?
公式ツールは Android / iPhone だけなので、できない。
サードパーティで作ってる人がいる。https://github.com/jeremysf/nrfDFU が、手元だとうまく動かすことができなかった。追試が必要。