1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Memo] nRF52832 OTA-DFU(ファームウェアアップデート)したい

Last updated at Posted at 2024-08-16

概要

  • nRF52832デバイスの、BLE無線によるファームウェアアップデートするための設定とか手順とかを忘れる前にメモっておく

ちょいメモ

  • nRF52832は FLASH 512KBだが、OTA-DFUを使用すると、半分以下しかアプリに使えなくなる。
    • MCUBOOT(ブートローダー)に48KB、SettingStorageとして、8KB(デフォルト=0x2000で、設定変更可能)がとられ、のこりうちの半分(から0.5KB引いた分)が、プログラムとして使用できる。
      => (512-48-8)/2 - 0.5 = 227.5KB
    • 後半の228KBは、OTAで受信したファームウェアを一時保存するために使用される。正しいファームウェアが受信できなかった場合は、アップデートされない(のだとおもう)
    • (OTAのときにだけ使用されるのだろう、、と実行中のデバッグログとか保存に使用しているのだが、大丈夫だろうか。。 アドバイスいただけたら..)

環境

  • 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にて、ビルドしている。

手順

  1. nRF Connect Desktopやら、Toolchain Managerやらで、SDKをインストール、VSCodeからサンプルベースにアプリ生成。ターミナルのコマンドは、ToolManagerでSDK環境でターミナルを開く。(うまくツールへのパスとか設定してある。imgtoolとか、westコマンドとか)

  2. prj.confに以下3行追加

    # OTA Support
    CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y
    CONFIG_BOOTLOADER_MCUBOOT=y
    
  3. custom_key_dirというフォルダを作って、秘密鍵生成。作ったキーはなくさないように。外部にもらさないように。。

    mkdir custom_key_dir
    imgtool keygen -k custom_key_dir/custom_priv.pem -t ecdsa-p256
    
  4. 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\")
    
  5. 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
    
  6. 最初に、Bootloader付きのをやくので、VSCodeからFLASHするか、ビルドフォルダ/zephyr/merged.hex を焼く。

  7. 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
    
  • Parition size
    image.png

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?