FOTA は、
・APP(アプリケーション更新)
・DELTA(モデム差分更新
・FMFU(モデム全体更新)
の3種がある。
(厳密には APP は SMP と MCUBOOT に分かれるがおそらく SMP は使わないと思われる)
各種 FOTA については、サンプルプログラムのソースがわかりやすい。
サンプルコードは、NCS のバージョンによって実装方法が微妙に異なる。
NCS v2.5系までは APP と DELTA がまとまっていて FMFU だけ別実装だった。
NCS v2.6.0 のサンプルコード SLM (Serial Lte Momem)では、FMFUも統合された。
私は、2024年4現在、NCS 2.5.2を使用しているが、NCS 2.6.0 のソースコードを利用して、ヘッダサイズの大きい HTTP ダウンロードから UDP ダウンロードに作り替えて移植してみたので、備忘録を残しておく。
基本構造
基本構造は皆同じで、HTTP (もしくは COAP ) にて、レンジアクセス機能を使い、ファイルイメージを範囲指定してデータを部分要求し、少しずつ、内部のフラッシュメモリ(FMFUはサイズが大きいので外部のSPI-NORフラッシュメモリ)に直接保存している。
ダウンロードが完了したら更新を適用するといった流れだ。
リブート後に更新状況を引き継ぐ必要があるので、NVM を利用して必要な情報を引き継いで、
再起動後に必要な処理を行う。
関連ファイル
SLM source
・slm_fota.h
・slm_fota.c
・slm_settings.h
・slm_settings.c
・main.c
Zephyr source
・fota_download.h
・fota_download.c
・fota_download_client.h
・fota_download_client.c
・fota_download_util.h
・fota_download_util.c
・fota_download_full_modem.h
・fota_download_full_modem.c
ファイル概要
・slm_settings.c
にて、NVM への読み書きを行なっている。
・main.c
では。再起動後の処理や初期化などが実装されている
・fota_download_client.c
FOTA のダウンロードの中心となる ダウンロードスレッドが記述されている。
通信処理を改造するのであれば、このファイルを変更する必要がある。
FMFU (Full Modem Firmware Update)
NCS v2.6.0 の SLMサンプルコードでは、FMFU が統合されただけでなく、
NVS で引き継ぐ情報は、FMFU を行なったか否かだけになった。
APP と DELTA は、ダウンロード終了後、リブートして更新が適用されるだけになっている。
FMFUは、SPI-NOR に保存してリブートしてから NVM に保存したフラグをみて、更新を適用する。
(NCS 2.5系までは、ダウンロードして更新を適用してからリブートしていた)
フラッシュメモリへの保存
・fota_download.c
受信したデータのフラグメントは、上記のファイルにてフラッシュメモリに保存される。
フラッシュメモリへの書き込みには
・dfu_target.c
の関数を利用している。
具体的には dfu_target_write関数だ。
更新処理
ダウンロードが完了すると、
・fota_download.c
にて、dfu_target_done関数、dfu_target_schedule_updateが呼ばれる。
あとは再起動すれば、ダウンロードファイルが適用される。
前述したが、FMFU だけは再起動後にアプリの初期化処理にて、更新処理が実行される。