hiro99ma blog

何か技術的なこと

Nordic Semiconductor 調査 > Device Firmware Update(DFU)

nRF5340 しか持っていないので、その構成を念頭に記載する。

DFU の種類

image

sysbuild

ncs v2.8 以降は sysbuild がデフォルトになるので、ここでは sysbuild で書いていく。

mcumgr-cli

MCUmgr というしくみを使って DFU を行う。
デバイス側がサーバ、イメージをアップロードする方がクライアントとなる。

クライアント操作をコマンドラインから行うツールが提供されている。
(Apache Mynewt)

Go言語のツールなので事前に go のインストールをしておくこと。

$ go install github.com/apache/mynewt-mcumgr-cli/mcumgr@latest

使い方

$ mcumgr conn add ssci type="serial" connstring="dev=/dev/ttyUSB0,baud=115200,mtu=512"
$ mcumgr -c ssci image list
Images:
 image=0 slot=0
    version: 0.0.0
    bootable: true
    flags: active
    hash: 12f3717c56660de5e287cdabca80419735a89ba84d74bb625a8d3356f8e685b7
 image=0 slot=1
    version: 0.0.0
    bootable: true
    flags:
    hash: 51313bcb36a2d3bba7c8ae8830e978f3976915ad979afb52e27d2ad93dcbfdd8
Split status: N/A (0)
$ mcumgr -c ssci image upload build/l8_e1/zephyr/zephyr.signed.bin
$ mcumgr -c ssci image test <ハッシュ値>
$ mcumgr -c ssci reset

その他のツール

Rustで書かれたツールへのリンク があったので Release ページからバイナリをダウンロードして使うことができるのかもしれないが私は試していない。

DFU over USB(CDC-ACM) であれば nRF Connect for DesktopProgrammer アプリが使用できるかもしれない。

DFU over UART

from MCUboot

MCUboot で DFU モード(Serial Recovery モード)になって DFU を行う。
UART と USB CDC-ACM が使用可能。両立できるかは調べていない。
アプリから行う DFU との両立は可能。

DFU モードで DFU を行う場合、直接アプリイメージを上書きする。
アプリから DFU する場合と違うので注意すること。

DFU モードになるための手段が必要。
ボタンを押したまま起動すると DFUモードになるという機能がデフォルトで備わっている。
DTS ファイルの aliasmcuboot-button0 に割り当てたボタンがそれになる。
また、DFU モードになると LED を点灯させるという機能もある。
これは MCUboot の confファイルに設定がいる。
aliasmcuboot-led0 に割り当てた LED が点灯する。

DFU モード(Serial Recoveryモード)でしか DFU しない場合の confファイル

アプリからも DFU する場合はそちらの設定に合わせること。

via hardware UART (*1)

DFU over UART from MCUboot

UART を使う。
CTS/RTS は無くても動作した。

via virtual COM port (*2)

DFU over USB from MCUboot

USB CDC-ACM を使う。
USB スタックが載る分 MCUboot が大きくなる。

from the application

アプリ側からイメージをダウンロードして空いた Flash のスロットに書き込んだ後に MCUboot が既存のイメージとの入替を行う。

via hardware UART (*3)

DFU over UART from the application

UART を使う。
動かしていないので省略。

via virtual COM port (*4)

DFU over USB from the application

USB を使う。
初回 mcumgr-cli を使うと応答しないようだった。
一度コマンドを使うとそれ以降は有効になるようだったので、さっさと Ctrl+C で止めて進めるとよいだろう。
そのせいか Programmer アプリは使うことができなかった。

via BLE (*5)

FOTA over BLE

MCUboot に BLE を載せるのは重たいため、アプリで BLE が動く。
サンプルの SMP server という扱いだが、ncs 標準のような扱いだろう。
conf を 1つ追加するだけで BLEサービスの登録などもやってくれる(MCUmgrなどの設定も不要)ので、導入は手軽である。

DFU クライアントアプリ

nRF デバイス側が SMP server になり、クライアントアプリが DFU するイメージをアップロードする。

アプリとしては nRF Connect Device Manager がある。
それ以外に nRF Connect for Mobile も DFU 機能を持っている。

自作アプリに機能を組み込むことも可能でライブラリが提供されている。

署名の検証

< Top page