概要
- nRF52832デバイスの、BLE無線によるファームウェアアップデートするための設定とか手順とかを忘れる前にメモっておく
ちょいメモ
- nRF52832は FLASH 512KBだが、OTA-DFUを使用すると、半分以下しかアプリに使えなくなる。
- MCUBOOT(ブートローダー)に48KB、SettingStorageとして、8KB(デフォルト=0x2000で、設定変更可能)がとられ、のこりうちの半分(から0.5KB引いた分)が、プログラムとして使用できる。
=>(512-48-8)/2 - 0.5 = 227.5KB
- nrf52832のFLASHメモリのPageサイズは4KBなので(ちなみにBlockサイズは512bytes)、nvs関連で2ページ分確保するので、8KBが最小と思われる。
nRF52のPage/Blockサイズ : https://devzone.nordicsemi.com/f/nordic-q-a/19505/page-and-block-size-on-nrf52
- nrf52832のFLASHメモリのPageサイズは4KBなので(ちなみにBlockサイズは512bytes)、nvs関連で2ページ分確保するので、8KBが最小と思われる。
- 後半の228KBは、OTAで受信したファームウェアを一時保存するために使用される。正しいファームウェアが受信できなかった場合は、アップデートされない(のだとおもう)
- (OTAのときにだけ使用されるのだろう、、と実行中のデバッグログとか保存に使用しているのだが、大丈夫だろうか。。 アドバイスいただけたら..)
- MCUBOOT(ブートローダー)に48KB、SettingStorageとして、8KB(デフォルト=0x2000で、設定変更可能)がとられ、のこりうちの半分(から0.5KB引いた分)が、プログラムとして使用できる。
環境
- nRF52832ベースの機材 またはnR52DK
- nRF Connect SDK v2.6.1 (現状v2.7.0は使用してよいのか? 実際のプロジェクトにはv2.4.3を使用している)
- ここでは、サンプルコードの、nrf/samples/bluetooth/peripheral_lbs (LED Button Service)をベースに説明
- スマホアプリ nRF Connect for Mobile (アップデートファイルを送るのに使用)
- Ubuntu 24.04 Desktop、Windows 11/10にて、ビルドしている。
手順
-
nRF Connect Desktopやら、Toolchain Managerやらで、SDKをインストール、VSCodeからサンプルベースにアプリ生成。ターミナルのコマンドは、ToolManagerでSDK環境でターミナルを開く。(うまくツールへのパスとか設定してある。imgtoolとか、westコマンドとか)
-
prj.conf
に以下3行追加# OTA Support CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y CONFIG_BOOTLOADER_MCUBOOT=y
-
custom_key_dir
というフォルダを作って、秘密鍵生成。作ったキーはなくさないように。外部にもらさないように。。mkdir custom_key_dir imgtool keygen -k custom_key_dir/custom_priv.pem -t ecdsa-p256
-
CMakeLists.txtの上の方に↓の2行を追加する。(cmake_minimum_required の下あたり)
# Specify the key file set(mcuboot_CONFIG_BOOT_SIGNATURE_KEY_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/custom_key_dir/custom_priv.pem\")
-
child_image
というフォルダを作って、mcuboot.confをつくるmkdir -p child_image echo -e '\n# Force ECDSA-P256, since this is not nessecarily the default\nCONFIG_BOOT_SIGNATURE_TYPE_ECDSA_P256=y' > child_image/mcuboot.conf
-
最初に、Bootloader付きのをやくので、VSCodeからFLASHするか、
ビルドフォルダ/zephyr/merged.hex
を焼く。 -
OTAアップデートには、
ビルドフォルダ/zephyr/dfu_application.zip
をスマホにおくって、nRF Connectで開く。(ファイル名を、hogehoge-2024-0815-1.zipとかにして、Gmailで送って、スマホで受信して、nRF Connectで開く、とやっている...うまい方法があれば、ぜひ...)
その他
-
"Memory report" => Partitionsタブで、パーティションの割当具合がわかる。
-
Setting Storageサイズは、
prj.conf
に↓のように指定する。パーティションをうまい具合に割ってくれる。CONFIG_PM_PARTITION_SIZE_SETTINGS_STORAGE=0x4000
-
ビルドフォルダ/paritions.yml にパーティション情報がある。
-
DeviceTreeのFLASHの情報は、使用されない、っぽい?のか、自前で、DeviceTreeを合わせるように編集しないといけないのか、わからない。(誰か教えて..)
-
Ubuntu 24.04 で nRF Connect SDKを使用
# 1. appimageがよくわからんけど.. sudo apt install libfuse2t64 chmod a+x ./nrfconnect-*.appimage ./nrfconnect-*.appimage --no-sandbox # 2. SDKをgitで取得しようとして、libunistring.so.2 が見つからん、みたいなエラー対処 cd /usr/lib/x86_64-linux-gnu sudo ln -sf libunistring.so.5 libunistring.so.2