ncs: sysbuild対応 (1)
2024/11/27
ここしばらく、ncs v2.6.1 環境から v2.7以降への乗り換えを図っている。
- ncs: v2.6 からのアップグレード - hiro99ma blog
- ncs: v2.7.0 対応 (1) - hiro99ma blog
- ncs: v2.7.0 対応 (2) - hiro99ma blog
- ncs: v2.6アプリにMCUbootを組み込む - hiro99ma blog
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_IPC
が Zephyr hci_ipc Bluetooth image、SB_CONFIG_NETCORE_RPC_HOST
が nRF 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
への記載不足だった。
undefined reference to __device_dts_ord_14'
が出ている- Devicetree 関係なのは分かるが何なのか分からない
- ビルドに成功した Raytac の
build/
を grep- map ファイルで
zephyr/drivers/mbox/libdrivers__mbox.a
になっていた
- map ファイルで
- Raytac のボード定義を置いているフォルダを
mbox
で grepKconfig.defconfig
に記載がある。自作にはなかった。
- commit Kconfig.defconfig
ビルドに成功して、開発ボードに焼いてちゃんと動いた。
sysbuild.conf
は作っていないのだが、sysbuild してちゃんと動くのだな。