Partition Manager (4)
2024/08/01
前回の続き。
non-secure で Partition Manager を有効にできた、と思ったらできていなかったのでやり直しているところ。
commit履歴を遡っていったが、PMファイルからexternal_flashを削除の手前まではビルドに成功していた。
Pristine Build
Build Configurationはそのままにして Pristine Build だけで済ませていたので、”Extra CMake arguments” が更新されていなかったとかだろうか? しかしCMakeLists.txtを作り直すとあるので、関係ない気もするが CMakeの引数だから別扱いかもしれないし。。。
Pristine Build をすると、おそらくだが build/
の中身は一度消されている。
とすると、nRF Kconfig GUI で「Apply」した設定はbuild/
の下に保存されるので、Pristine Build すると意味がないということか。
よくわからないが、Build Configuration の設定はプロジェクトディレクトリの中ではなく ncs の設定がどこかにあってそこに保存されているのだろうか。
そうじゃないとボード設定ファイルの選択などもプロジェクトディレクトリには保存されていないので Pristine Build したら失われるはずだ。いや、build/
を削除する前に設定を覚えているだけかもしれないから断言はできないか。
ただ、nRF Kconfig GUIで「Apply」したときに保存した設定ファイルは削除されたし、grep しても削除されていた。 説明文の「Reruns the build with the original parameters」は「Apply」したくらいのものも消してしまうということになるし、後から Edit Build Configuration で変更した内容も消えているかもしれない。
ともかく、今回懸念していた「Applyしたものが残っていたかも」を心配する必要はなくなった。
CONFIG_PARTITION_MANAGER_ENABLED
Edit Build Configuration の中に MCUboot 用の conf ファイルを指定する箇所がある。 ビルドしないと反映されないので、自動で設定されるものだろう。
mcuboot_OVERLAY_CONFIG:UNINITIALIZED=
C:/ncs/v2.6.1/nrf/subsys/pcd/pcd.conf;
C:/ncs/v2.6.1/nrf/modules/mcuboot/tfm.conf;
C:/ncs/v2.6.1/nrf/modules/mcuboot/fih_low_enable.conf;
C:/ncs/v2.6.1/nrf/subsys/partition_manager/partition_manager_enabled.conf;
U:/Prog/BLE/nrf-ncs/blinky_devaca/child_image/mcuboot.conf
partition_manager_enabled.conf
があるのは Partition Manager が有効だからだろう。
CONFIG_PARTITION_MANAGER_ENABLEDは Read Only なので設定はできない。
build/
を grepするとempty_net_core/b0n
, empty_net_core/zephyr
, mcuboot/zephyr
, zephyr
などのファイルに出てくるので、どの設定が影響しているのか分からないが有効になっているのだろう。
CONFIG_PM_SINGLE_IMAGE
は設定していないのにautoconf.h
を見ると出てくるし、よくわからん。
Partition Manager
外部Flashを参照しないのでPMファイルからexternal_flashを削除したものの、その置き換えがram_flash
などでよいのかは確認していなかった。
その前のmcuboot_primary_1
が使っていたのでまねしただけである。
書き換えるなら意味を知らねばなるまい。
「Partition Managerを使って multi-imageアプリをビルドする場合、DevicetreeのFlashパーティションは無視される」と書いてある。
DevicetreeのFlashパーティションはこういうのやこういうのだろう。
これもある。
cpunet側もこれ、これなど。
削除したがPM_MCUBOOT_SECONDARY_ID
が見つからないなどのエラーは変わらず。
Devicetree Visual Editor の FLASH 欄は空になってしまった。あれは Partition Manager の設定を見ているわけではないということだ。
Noteに「flash partition」と書いてあったが SRAMパーティションは内蔵だから反映されるのだろうか。
PMファイルにpcd_sram
パーティションの設定があったのだが、これはたぶんcpuappとcpunetの共有RAMだろう。
まあ、そちらは後回しだ。
フォーマット
YAMLファイルなので、このファイルに何を書いていくかという意味のフォーマットだ。
partition_name:
partition_property:
property_value
そのまま例として持ってこよう。
static partition
static partitionはaddress
とsize
が必須。
regionは書いてなければflash_primary
がデフォルト。
region
はパーティションの配置に関するプロパティで、外部Flashや内蔵Flashなどもこれが関係する。
nrf/cmake/partition_manager.cmakeからadd_region()
で定義している箇所を探す。
sram_primary
- if
CONFIG_SOC_SERIES_NRF91X
ORCONFIG_SOC_NRF5340_CPUAPP
otp
flash_primary
- if
ext_flash_dev
external_flash
- if
mcuboot_NRF53_MULTI_IMAGE_UPDATE
ORmcuboot_NRF53_RECOVERY_NETWORK_CORE
ram_flash
ram_flash
は、きっとCONFIG_FLASH_SIMULATOR
関係で、cpunet のアップデートは直接Flashを参照できないとかなんとかの部分だろう。
mcuboot:
address: 0x0
region: flash_primary
size: 0x10000
spanの値はリストかspan
。
縦に書くリストが-
で、インラインで各リストが[...]
か(YAMLに慣れてない)。
tfm_secure:
address: 0x10000
size: 0xc000
span: [mcuboot_pad, tfm]
コンテナーのパーティションということで、複数のパーティションを1つのまとまりのようにできるようだ。 1つのパーティションが複数のコンテナーに属することはできるようで、Thingy:53のPMファイルはこうなっていた。
わかりづらいので、address
とsize
も
orig_span
はなんだ?
mcuboot_primary:
address: 0x10000
orig_span: &id001
- mcuboot_pad
- tfm
- app
region: flash_primary
size: 0xe0000
span: *id001
これをJSON変換するとこうなった。
{
"mcuboot_primary": {
"address": "0x10000",
"orig_span": [
"mcuboot_pad",
"tfm",
"app"
],
"region": "flash_primary",
"size": "0xe0000",
"span": [
"mcuboot_pad",
"tfm",
"app"
]
}
}
3.2.2.2. Anchors and Aliasesによると &
は「node’s anchor property」、*
は「alias node」となっていた。
なのでこれでもよいはずだ。
mcuboot_primary:
address: 0x10000
region: flash_primary
size: 0xe0000
span: [mcuboot_pad, tfm, app]
なんでわざわざorig_span
にしたのかがよくわからない。
プロパティ名に載っていない名前を使えばこういうこともできますよ?とかか。
あまり悩ませないでほしいものだ。
PMファイルの修正
前回適当に変更したPMファイルを考えながら修正しよう。
外部Flashに割り当てられていたパーティション mcuboot_secondary
, mcuboot_secondary_1
, external_flash
をなんとかする。その1つ前のパーティション mcuboot_primary_1
も Flash関係なので気に掛ける。
- MCUboot’s serial recovery of the networking core image
mcuboot_primary
とmcuboot_secondary
はアプリコアイメージのスロットmcuboot_primary_1
はネットコアイメージのスロット- MCUboot +
CONFIG_NRF53_RECOVERY_NETWORK_CORE=y
の場合、cpuapp は cpunet の Flashに直接アクセスできないのでmcuboot_primary_1
はRAMパーティションを中継するようにせんといかん
- MCUboot +
pcd_sram
はアプリコアとネットコア間でコマンドを交換するためのパーティション
- Simultaneous multi-image DFU with nRF5340 DK
mcuboot_primary
とmcuboot_secondary
はアプリコアイメージのスロットmcuboot_primary_1
とmcuboot_secondary_1
はネットコアイメージのスロットmcuboot_primary_1
はram_flash
regionに置いておかなくてはならない
pcd_sram
はアプリコアとネットコア間でコマンドを交換するためのパーティション
なにが “simultaneous” かというと、アプリコアとネットコアの両アプリを同時にということだ。
以前も調べたことだが、simultaneousの場合は外部Flashがいるので、今回は non-simultaneous の更新になる。
- PMファイル
mcuboot_secondary_1
は削除external_flash
は削除mcuboot_primary_1
はram_flash
のままmcuboot_secondary
のregion
はflash_primary
にしておく
- mcuboot.conf
CONFIG_UPDATEABLE_IMAGE_NUMBER=1
CONFIG_BOOT_UPGRADE_ONLY=n
これでもダメでした。。。
前回の反省から、なるべく commit していくことにした。
ダメではあったがPM_MCUBOOT_SECONDARY_ID
がないというエラーではなくなった。
ゼロ割エラーなのでCONFIG_FPROTECT_BLOCK_SIZE
が定義されていないとかだろうと思ったがCONFIG_FPROTECT*の中にBLOCK_SIZE
はない。
-- west build: building application
[5/240] Generating include/generated/version.h
-- Zephyr version: 3.5.99 (C:/ncs/v2.6.1/zephyr), build: v3.5.99-ncs1-1
[4/147] Generating include/generated/version.h
-- Zephyr version: 3.5.99 (C:/ncs/v2.6.1/zephyr), build: v3.5.99-ncs1-1
[2/130] Generating include/generated/version.h
-- Zephyr version: 3.5.99 (C:/ncs/v2.6.1/zephyr), build: v3.5.99-ncs1-1
[37/130] Building C object CMakeFiles/app.dir/src/main.c.obj
FAILED: CMakeFiles/app.dir/src/main.c.obj
C:\ncs\toolchains\cf2149caf2\opt\zephyr-sdk\arm-zephyr-eabi\bin\arm-zephyr-eabi-gcc.exe -DEXT_API_MAGIC=0x281ee6de,0xb845acea,13570 -DFIRMWARE_INFO_MAGIC=0x281ee6de,0x8fcebb4c,13570 -DKERNEL -DNRF5340_XXAA_NETWORK -DPICOLIBC_LONG_LONG_PRINTF_SCANF -DUSE_PARTITION_MANAGER=1 -DVALIDATION_INFO_MAGIC=0x281ee6de,0x86518483,79106 -DVALIDATION_POINTER_MAGIC=0x281ee6de,0x6919b47e,79106 -D_FORTIFY_SOURCE=1 -D_POSIX_C_SOURCE=200809 -D__LINUX_ERRNO_EXTENSIONS__ -D__PROGRAM_START -D__ZEPHYR__=1 -IC:/ncs/v2.6.1/zephyr/include -IU:/Prog/BLE/nrf-ncs/blinky_devaca/build/empty_net_core/b0n/zephyr/include/generated -IC:/ncs/v2.6.1/zephyr/soc/arm/nordic_nrf/nrf53 -IC:/ncs/v2.6.1/zephyr/soc/common/nordic_nrf/. -IC:/ncs/v2.6.1/zephyr/soc/arm/nordic_nrf/common/. -IC:/ncs/v2.6.1/nrf/include -IC:/ncs/v2.6.1/nrf/subsys/bootloader/include -IC:/ncs/v2.6.1/nrf/tests/include -IC:/ncs/v2.6.1/modules/hal/cmsis/CMSIS/Core/Include -IC:/ncs/v2.6.1/zephyr/modules/cmsis/. -IC:/ncs/v2.6.1/modules/hal/nordic/nrfx -IC:/ncs/v2.6.1/modules/hal/nordic/nrfx/drivers/include -IC:/ncs/v2.6.1/modules/hal/nordic/nrfx/mdk -IC:/ncs/v2.6.1/zephyr/modules/hal_nordic/nrfx/. -IC:/ncs/v2.6.1/nrfxlib/crypto/nrf_oberon/include -isystem C:/ncs/v2.6.1/zephyr/lib/libc/common/include -fno-strict-aliasing -Os -imacros U:/Prog/BLE/nrf-ncs/blinky_devaca/build/empty_net_core/b0n/zephyr/include/generated/autoconf.h -fno-printf-return-value -fno-common -g -gdwarf-4 -fdiagnostics-color=always -mcpu=cortex-m33+nodsp -mthumb -mabi=aapcs -mfp16-format=ieee -mtp=soft --sysroot=C:/ncs/toolchains/cf2149caf2/opt/zephyr-sdk/arm-zephyr-eabi/arm-zephyr-eabi -imacros C:/ncs/v2.6.1/zephyr/include/zephyr/toolchain/zephyr_stdint.h -Wall -Wformat -Wformat-security -Wno-format-zero-length -Wno-pointer-sign -Wpointer-arith -Wexpansion-to-defined -Wno-unused-but-set-variable -Werror=implicit-int -fno-pic -fno-pie -fno-asynchronous-unwind-tables -ftls-model=local-exec -fno-reorder-functions --param=min-pagesize=0 -fno-defer-pop -fmacro-prefix-map=C:/ncs/v2.6.1/nrf/samples/nrf5340/netboot=CMAKE_SOURCE_DIR -fmacro-prefix-map=C:/ncs/v2.6.1/zephyr=ZEPHYR_BASE -fmacro-prefix-map=C:/ncs/v2.6.1=WEST_TOPDIR -ffunction-sections -fdata-sections --specs=picolibc.specs -std=c99 -MD -MT CMakeFiles/app.dir/src/main.c.obj -MF CMakeFiles\app.dir\src\main.c.obj.d -o CMakeFiles/app.dir/src/main.c.obj -c C:/ncs/v2.6.1/nrf/samples/nrf5340/netboot/src/main.c
In file included from C:/ncs/v2.6.1/zephyr/include/zephyr/toolchain.h:50,
from C:/ncs/v2.6.1/zephyr/include/zephyr/sys/printk.h:11,
from C:/ncs/v2.6.1/nrf/samples/nrf5340/netboot/src/main.c:8:
C:/ncs/v2.6.1/nrf/samples/nrf5340/netboot/src/main.c: In function 'main':
C:/ncs/v2.6.1/nrf/samples/nrf5340/netboot/src/main.c:31:40: warning: division by zero [-Wdiv-by-zero]
31 | (PM_B0N_CONTAINER_SIZE % CONFIG_FPROTECT_BLOCK_SIZE) == 0,
| ^
grep すると cpunet の方が0
で定義されていた。
cpunet のパーティションは mcuboot_primary_1
である。
region
はram_flash
でCONFIG_FLASH_SIMULATOR
関係だろうが、ビルドログを見るとn
になっている。
mcuboot.conf で y
にしているのだが解除されている。
warning: FLASH_SIMULATOR (defined at drivers/flash/Kconfig.simulator:6) was assigned the value 'y'
but got the value 'n'. Check these unsatisfied dependencies: DT_HAS_ZEPHYR_SIM_FLASH_ENABLED (=n).
See http://docs.zephyrproject.org/latest/kconfig.html#CONFIG_FLASH_SIMULATOR and/or look up
FLASH_SIMULATOR 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_FLASH_SIMULATOR=n
はPMファイルからexternal_flashを削除のときから起きているようだった。
external_flash
を使わなくなったことでそう判定されたのか。
いろいろ試したがCONFIG_FLASH_SIMULATOR
は有効にならない。
よく読み返すと、simultaneous な場合にはCONFIG_FLASH_SIMULATOR
のことを書いているが non-simultaneous の場合には書いていない。
前も書いた気がするが、そもそも Partition Manager を使う必要はあるのだろうか?
nRF5340DK のボード定義ファイルにはDevicetreeにしかパーティション情報がない。
Thingy:53 からではなく nRF5340DK からやっていくのがよかったのか。 以前、Partition Manager が使われていないという理由で調べ始めたのだが、使わなくてもちゃんと動くのであればそれでよいのだ。
こちらが nRF5340DK ベースでやったやつだ。
これでやめたのは PMファイルを参照していないという理由だけでビルドは成功しているので、これを煮詰めるか。