hiro99ma blog

何か技術的なこと

ncs: sysbuild対応 (1)

2024/11/27

ここしばらく、ncs v2.6.1 環境から v2.7以降への乗り換えを図っている。

v2.7 からビルドが multi-image build 方式から sysbuild 方式に置き換わろうとしているので対応しているところである。
今のところ私が multi-image build しているのは MCUboot くらいなので、前回は v2.6.1 に MCUboot を組み込んだのであった。

まず、ncs v2.7.0 にするだけ(no sysbuild)はできた。

次は sysbuild だ。
機能として動作するかどうかは捨てて、まずはビルドに成功したい。

child_image/ にあったファイルをそのまま持っていったのだがビルドエラーになる。
あれこれ変更してようやく UART_INTERRUPT_DRIVEN の warning が出るだけになったがここから進まない。

別に UART での DFU をやりたいわけではないのだが、何も指定しないとそれはそれでダメなのだ。
Nordic Q&A に投稿している人がUART sysbuild のサンプル を上げていた。
記事はこちら
記事が 5ヶ月前の投稿で sysbuild したリポジトリが 2ヶ月前の更新だから、いろいろ解決した後だと思いたい。

warning UART_INTERRUPT_DRIVEN

warning のメッセージが長いので適当に改行する。

warning: UART_INTERRUPT_DRIVEN 
		(defined at 
			boards/shields/sparkfun_sara_r4/Kconfig.defconfig:24, 
			boards/shields/wnc_m14a2a/Kconfig.defconfig:17, 
			drivers/serial/Kconfig:72) 
	has direct dependencies 
		(NETWORKING && SHIELD_SPARKFUN_SARA_R4) || 
		(NETWORKING && SHIELD_WNC_M14A2A) || 
		(SERIAL_SUPPORT_INTERRUPT && SERIAL) 
	with value n, but is currently being y-selected by the following symbols:
 - MCUBOOT_SERIAL 
 		(defined at /home/ユーザ/ncs/v2.7.0/bootloader/mcuboot/boot/zephyr/Kconfig.serial_recovery:7), 
 	with value y, 
 	direct dependencies !BOOT_FIRMWARE_LOADER (value: y), 
 	and select condition !BOOT_FIRMWARE_LOADER (value: y)

機械的なメッセージだろうから仕方ないけど、なんだかわからないよ! “shield” は関係ないから drivers/serial/Kconfig:72(SERIAL_SUPPORT_INTERRUPT && SERIAL) だろうとは思う。

UART?
そういえば・・・ログを出力するのに UART0 を使っているが、あれはボード定義ファイルの方ではなくプロジェクトで DTS を overlay しているな。
つまり、MCUboot の段階では UART が使えるようになっていないから UART_INTERRUPT_DRIVEN みたいなことを言っているということ??
sysbuild/mcuboot/boards/ にある overlay ファイルに追加すると MCUboot のビルドが成功するようになった。

まだビルドに失敗する

まだビルドエラーで終わるのだが、どれがエラーなのかがわからない。

-- Configuring done
-- Generating done
-- Build files have been written to: /home/ユーザ/nrf-ncs/recv-sb1602/build/recv-sb1602
-- Configuring incomplete, errors occurred!
See also "/home/ユーザ/nrf-ncs/recv-sb1602/build/CMakeFiles/CMakeOutput.log".
FATAL ERROR: command exited with status 1: ....

ここに来るまでにもいくつか warning は出ている。
MCUboot を無効にしても同じなので、これは sysbuild にしたことで他にも変更が必要ということなのだろう。

Network core

BLE を使う場合は、v2.6.1 のビルドログに “hci_ipc” があったのでおそらく SB_CONFIG_NETCORE_HCI_IPC=y だろう。
SB_CONFIG_NETCORE_HCI_IPCZephyr hci_ipc Bluetooth imageSB_CONFIG_NETCORE_RPC_HOSTnRF Connect SDK rpc_host Bluetooth image とのこと。
なんとなく ncs では “rpc_host” の方を使うかと思っていたのだがね。

=== child image hci_ipc - CPUNET begin ===
loading initial cache file U:/Prog/BLE/nrf-ncs/recv_sb1602/build/hci_ipc/child_image_preload.cmake
Loading Zephyr default modules (Zephyr base).
-- Application: C:/ncs/v2.6.1/zephyr/samples/bluetooth/hci_ipc

これでビルドすると “samples/bluetooth/hci_ipc” というディレクトリなのがちょっと気に入らないが昔からそうなのか。

   *****************************
   * Running CMake for hci_ipc *
   *****************************

Loading Zephyr default modules (Zephyr base).
-- Application: /home/ユーザ/ncs/v2.7.0/zephyr/samples/bluetooth/hci_ipc

BLE の API を使っているのに SB_CONFIG_NETCORE_ を選択しなかった場合でもエラーにはならなさそうだ(non-working にはなるそうだ)。

peripheral_lbs をビルド

サンプルアプリで確認した方が安全だろう。
LBS サービスが動くだけの peripheral_lbs を使う。
sysbuild.conf などはないが、よく考えたら CPUNET についても普通は conf に書かないのでなくても良い気がしてきた。

自作のボード定義ファイルだとビルドに失敗する。
同じプロジェクトで nRF5340DK や Raytac MDBT5340 だと成功するので、これはボード定義ファイル関係か。
zephyr_pre0.elf で失敗しているのは分かるけど、正常にビルドできた場合のログはそこまで細かく出ないのよねぇ。

見つかった。
ボード定義ファイルの Kconfig.defconfig への記載不足だった。

ビルドに成功して、開発ボードに焼いてちゃんと動いた。

sysbuild.conf は作っていないのだが、sysbuild してちゃんと動くのだな。

< Top page