hiro99ma blog

何か技術的なこと

ncs: sysbuild対応 (3)

2024/11/29

前回 で ncs v2.8.0 での sysbuild は成功した。
ログを見ながら warning をなるべく取り除こう。

WSL2での使い勝手

そういえば ncs を Windows ネイティブから WSL2 に移行して数日経ったので経過報告をしておく。

今のところ問題なし。
J-Link を使うときには USBIPD での attach がいる(PCを起動して初回だけ)のは変わらんが vscode の extension があったので手軽になった。
管理者権限もいらないし、あれはデバイスを共有するときだけなんだろうか?
vscode が WSL2 として使用しているときに使える extension だったので切替が不要なところもよろしい。

ファイルシステムは WSL2 側にあるが Windows 側でもアクセスできるので特に困っていない。
ファイル操作を GUI で行いたいときはなるべく Files(Nautilus) を使っている。
気付かない制約はあるのかもしれないが、今のところは特にない。

Windows 側の ncs を削除したので /mnt/c/ncs を見に行くこともなくなったようだ。
見に行くフォルダや見に行かないフォルダを指定できればよいのだが、ぱっと見はそういうのがなかった。

warning 除去

No SOURCES

MCUboot のビルドログである。

CMake Warning at /home/ユーザ/ncs/v2.8.0/zephyr/CMakeLists.txt:952 (message):
  No SOURCES given to Zephyr library: drivers__console

条件はこんな感じか?

あれこれ試したところ MCUboot 側の Kconfig に CONFIG_CONSOLE=n を追加すると良かった。
ブートローダを UART なり USB なりで更新するならコンソール機能は使えないだろう。

ログを出せないなら CONFIG_LOG=n でよいのでは?
やってみたのだが、デフォルトではログが出る状態になっているのでそれらの warning が出た。

「君以外はログを出す気があるようだけど大丈夫か?」という感じで dependency チェックによって出力されているだけだから無視すれば良いのだが、うっとうしい。
これはコピーしてきた MCUboot の prj.conf を変更することで対応できた。

読み込む順番がこうなっていたので mcuboot.confprj.conf を打ち消すように書けば済むかと思ったが、なぜかそれではダメだった。

  1. ボード定義の defconfig ファイル
  2. sysbuild/mcuboot/prj.conf
  3. sysbuild/mcuboot/boards/ の conf ファイル
  4. sysbuild/mcuboot.conf

UPDATEABLE_IMAGE_NUMBER

アプリのビルドログである。

warning: UPDATEABLE_IMAGE_NUMBER (defined at
/home/ユーザ/ncs/v2.8.0/nrf/samples/common/mcumgr_bt_ota_dfu/Kconfig:89, subsys/dfu/Kconfig:95) was
assigned the value '1' but got the value ''. Check these unsatisfied dependencies:
(((BOARD_THINGY53_NRF5340_CPUAPP || BOARD_THINGY53_NRF5340_CPUAPP_NS) && SOC_SERIES_NRF53X &&
NCS_SAMPLE_MCUMGR_BT_OTA_DFU) || (!MCUBOOT && IMG_MANAGER)) (=n). See
http://docs.zephyrproject.org/latest/kconfig.html#CONFIG_UPDATEABLE_IMAGE_NUMBER and/or look up
UPDATEABLE_IMAGE_NUMBER in the menuconfig/guiconfig interface. The Application Development Primer,
Setting Configuration Values, and Kconfig - Tips and Best Practices sections of the manual might be
helpful too.

ログに載っていた URL を見ると、Zephyr オリジナルの依存関係は !MCUBOOT && IMG_MANAGER だけだった。
しかしログには Thingy:53 のことが載っているので、追加されているのかもっと別の設定があるのか。

取りあえず、未定義だから '' だけどデフォルト値が 1 だから 1 にするよ、というだけのことだろう。
これは sysbuild.conf に設定する内容である。
が、設定しても warning が取れない。

サンプルでは sysbuild/mcuboot/boards/ とアプリ直下の boards/ 両方の conf ファイルに設定してある。

そもそもなんでアプリの方に DFU のビルドログが出るのだろうか?
BLE での OTA だと MCUboot だけでなくアプリにも関係するのか。
よくわかっていないので今回はスキップ。

こちらもアプリログだが、UPDATEABLE_IMAGE_NUMBER をスキップしたのでこちらもスキップ。

warning: MCUBOOT_UPDATE_FOOTER_SIZE (defined at subsys/dfu/Kconfig:54) was assigned the value
'0x2000' but got the value ''. Check these unsatisfied dependencies: MCUBOOT_IMG_MANAGER (=n),
IMG_MANAGER (=n). See
http://docs.zephyrproject.org/latest/kconfig.html#CONFIG_MCUBOOT_UPDATE_FOOTER_SIZE and/or look up
MCUBOOT_UPDATE_FOOTER_SIZE in the menuconfig/guiconfig interface. The Application Development
Primer, Setting Configuration Values, and Kconfig - Tips and Best Practices sections of the manual
might be helpful too.

CONFIG_USB_DEVICE_VID と CONFIG_USB_DEVICE_PID

USB の VID/PID なので無視

globally ENABLED

アプリのビルドログ。

CMake Warning at /home/ユーザ/ncs/v2.8.0/zephyr/CMakeLists.txt:2134 (message):
  __ASSERT() statements are globally ENABLED

prj.confCONFIG_ASSERT=y を設定していたため。
消し忘れないよう warning が出るようになっている。

without pm_static.yml

これは Partition Manager 関係か。

---------------------------------------------------------------------
--- WARNING: Using a bootloader without pm_static.yml.            ---
--- There are cases where a deployed product can consist of       ---
--- multiple images, and only a subset of these images can be     ---
--- upgraded through a firmware update mechanism. In such cases,  ---
--- the upgradable images must have partitions that are static    ---
--- and are matching the partition map used by the bootloader     ---
--- programmed onto the device.                                   ---
---------------------------------------------------------------------

cmake ファイルはここ。

条件はこう(全部のAND)なのだが、sysbuild しているんじゃないの?

LBSサンプルをビルドしても出なかったので、これも MCUboot か DFU 関係だろう。
スキップ!

USB_CDC_ACM_LOG_LEVEL

最後はこちら。

/home/ユーザ/ncs/v2.8.0/zephyr/subsys/usb/device/class/cdc_acm.c:64:2: warning: #warning "USB_CDC_ACM_LOG_LEVEL forced to LOG_LEVEL_NONE" [-Wcpp]
   64 | #warning "USB_CDC_ACM_LOG_LEVEL forced to LOG_LEVEL_NONE"
      |  ^~~~~~~

これはソースコード中の #warning である。

これは局所的な warning だ。

/* Prevent endless recursive logging loop and warn user about it */

ログ出力を USB CDC ACM にしているときに CDC ACM からログ出力するとそれによってさらにログ出力が生じて・・・というループが発生するのを避けるためだろう。
これは仕方ない。

MCUboot サンプル

ncs v2.8.0 のサンプルコードを nRF5340DK の設定でビルドする。
これはかなり標準に近いビルドだろう。

結果…

同じやん!

いや、もう1つサンプルコードがあった。
nRF5340 用のプロジェクトで mcuboot がある。

さすが?なのかはわからないが warning の出方が違った。

このプロジェクトは QSPI に接続されている 外部 Flash を使っている。
そこら辺が影響しているのだろうか?

ともかく、普通に MCUboot を導入しただけでは warning が出てしまうことがわかった。
残りは別途調査ということにしよう。

おわりに

ここまでのボード定義ファイルをデフォルトブランチにする。
しょっちゅうデフォルトブランチを変更してしまって申し訳ない。

これを使ったアプリも ncs v2.8.0 対応したものを main ブランチにする。
v2.7.0 はもうスキップして良かろう。

次は USB 経由での DFU ができるようにしたい。
MCUboot を積んでも DFU ができないのであれば意味が無いし。

< Top page