I have the following questions about PM and what it generates. My relevant board and config files are below, along with the PM partitions output.
1. Can you explain the mcuboot_pad? Is it needed? When I try to remove it, multi-image builds break.
2. When using mcuboot_pad, how can I get my mcuboot_secondary to match mcuboot_primary size more dynamically? Currently I had to hack my board DTS partition size for slot_1 to get the size to match.
3. Where is PM coming up with the 0xe2000 size for mcuboot_primary? In my DTS, i have slot_0 set to a size of 0xe0000. mcuboot_pad is only 0x200, so why is mcuboot_primary padded by an extra 0x1e00?
4. Why is the "storage" partition in my DTS getting renamed to littlefs_storage by PM?
Board file:
/*
* Copyright (c) 2019 Laird Connectivity
*
* SPDX-License-Identifier: Apache-2.0
*/
/dts-v1/;
#include <nordic/nrf52840_qiaa.dtsi>
/ {
model = "Pinnacle 100 Dev Kit";
compatible = "lairdconnect,pinnacle100-dvk";
chosen {
zephyr,console = &uart0;
zephyr,shell-uart = &uart0;
zephyr,uart-mcumgr = &uart0;
zephyr,bt-mon-uart = &uart0;
zephyr,sram = &sram0;
zephyr,flash = &flash0;
zephyr,code-partition = &slot0_partition;
zephyr,entropy = &rng;
};
leds {
compatible = "gpio-leds";
led1: led_1 {
gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>;
label = "Blue LED 1";
};
led2: led_2 {
gpios = <&gpio1 5 GPIO_ACTIVE_HIGH>;
label = "Green LED 2";
};
led3: led_3 {
gpios = <&gpio1 6 GPIO_ACTIVE_HIGH>;
label = "Red LED 3";
};
led4: led_4 {
gpios = <&gpio1 7 GPIO_ACTIVE_HIGH>;
label = "Green LED 4";
};
};
buttons {
compatible = "gpio-keys";
button1: button_1 {
gpios = <&gpio0 31 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 1";
};
button2: button_2 {
gpios = <&gpio0 3 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 2";
};
button3: button_3 {
gpios = <&gpio0 4 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 3";
};
button4: button_4 {
gpios = <&gpio0 2 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
label = "Push button switch 4";
};
};
/* These aliases are provided for compatibility with samples */
aliases {
led0 = &led1;
led1 = &led2;
led2 = &led3;
led3 = &led4;
sw0 = &button1;
sw1 = &button2;
sw2 = &button3;
sw3 = &button4;
};
};
&adc {
status ="okay";
};
&gpiote {
status ="okay";
};
&gpio0 {
status ="okay";
};
&gpio1 {
status ="okay";
};
&uart0 {
compatible = "nordic,nrf-uart";
status = "okay";
current-speed = <115200>;
tx-pin = <6>;
rx-pin = <8>;
rts-pin = <5>;
cts-pin = <7>;
};
&uart1 {
status = "okay";
current-speed = <115200>;
tx-pin = <14>;
rx-pin = <16>;
rts-pin = <13>;
cts-pin = <15>;
hl7800 {
compatible = "swi,hl7800";
status = "okay";
label = "hl7800";
mdm-reset-gpios = <&gpio1 15 0>;
mdm-wake-gpios = <&gpio1 13 0>;
mdm-pwr-on-gpios = <&gpio1 2 0>;
mdm-fast-shutd-gpios = <&gpio1 14 0>;
mdm-uart-dtr-gpios = <&gpio0 24 0>;
mdm-vgpio-gpios = <&gpio1 11 0>;
mdm-uart-dsr-gpios = <&gpio0 25 0>;
mdm-uart-cts-gpios = <&gpio0 15 0>;
mdm-gpio6-gpios = <&gpio1 12 0>;
};
};
&i2c0 {
status = "okay";
sda-pin = <26>;
scl-pin = <27>;
};
&spi0 {
/* Cannot be used together with i2c0. */
/* status = "okay"; */
sck-pin = <27>;
mosi-pin = <26>;
miso-pin = <29>;
};
&qspi {
status = "okay";
sck-pin = <19>;
io-pins = <20>, <21>, <22>, <23>;
csn-pins = <17>;
mx25r64: mx25r6435f@0 {
compatible = "nordic,qspi-nor";
reg = <0>;
writeoc = "pp4io";
readoc = "read4io";
sck-frequency = <8000000>;
label = "MX25R64";
jedec-id = [c2 28 17];
size = <67108864>;
has-be32k;
has-dpd;
t-enter-dpd = <10000>;
t-exit-dpd = <35000>;
};
};
&flash0 {
/*
* For more information, see:
* http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions
*/
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
/* 96K */
boot_partition: partition@0 {
label = "mcuboot";
reg = <0x000000000 0x00018000>;
};
/* 896K */
slot0_partition: partition@18000 {
label = "image-0";
reg = <0x00018000 0x000E0000>;
};
/*
* The flash starting at 0x000f8000 and ending at
* 0x000fffff is reserved for use by the application.
*/
/*
* Storage partition will be used by FCB/NVS
* if enabled. 30K
*/
storage_partition: partition@fa000 {
label = "storage";
reg = <0x000fa000 0x00006000>;
};
};
};
&mx25r64 {
partitions {
compatible = "fixed-partitions";
#address-cells = <1>;
#size-cells = <1>;
/* 904KB */
slot1_partition: partition@0 {
label = "image-1";
reg = <0x0000000 0x000E2000>;
};
/* 128KB */
scratch_partition: partition@100000 {
label = "image-scratch";
reg = <0x00100000 0x00020000>;
};
/* 4MB starting halfway */
lfs_partition: partition@400000 {
label = "lfs_storage";
reg = <0x00400000 0x000400000>;
};
};
};
&usbd {
compatible = "nordic,nrf-usbd";
status = "okay";
};
pm.yml:
#include <autoconf.h>
#include <devicetree_legacy_unfixed.h>
mcuboot:
size: DT_FLASH_AREA_MCUBOOT_SIZE
placement:
before: [mcuboot_primary]
mcuboot_primary_app:
# All images to be placed in MCUboot's slot 0 should be placed in this
# partition
span: [app]
mcuboot_primary:
span: [mcuboot_pad, mcuboot_primary_app]
mcuboot_secondary:
region: external_flash
address: DT_FLASH_AREA_IMAGE_1_OFFSET
size: DT_FLASH_AREA_IMAGE_1_SIZE
#ifndef CONFIG_BOOT_SWAP_USING_MOVE
mcuboot_scratch:
region: external_flash
address: DT_FLASH_AREA_IMAGE_SCRATCH_OFFSET
size: DT_FLASH_AREA_IMAGE_SCRATCH_SIZE
#endif
lfs_storage:
region: external_flash
address: DT_FLASH_AREA_LFS_STORAGE_OFFSET
size: DT_FLASH_AREA_LFS_STORAGE_SIZE
# Padding placed before image to boot
mcuboot_pad:
# MCUboot pad must be placed before the 'spm' partition if that is present.
# If 'spm' partition is not present, it must be placed before the 'app'.
size: CONFIG_PM_PARTITION_SIZE_MCUBOOT_PAD
placement:
before: [mcuboot_primary_app]
#ifdef CONFIG_FPROTECT
align: { start: CONFIG_FPROTECT_BLOCK_SIZE }
#endif
partitions_pinnacle_100_dvk.yml (output):
app:
address: 0x18200
region: flash_primary
size: 0xe1e00
external_flash:
address: 0x0
region: external_flash
size: 0x800000
lfs_storage:
address: 0x400000
region: external_flash
size: 0x400000
littlefs_storage:
address: 0xfa000
placement:
before:
- end
region: flash_primary
size: 0x6000
mcuboot:
address: 0x0
placement:
before:
- mcuboot_primary
region: flash_primary
size: 0x18000
mcuboot_pad:
address: 0x18000
placement:
before:
- mcuboot_primary_app
region: flash_primary
size: 0x200
mcuboot_primary:
address: 0x18000
orig_span: &id001
- mcuboot_pad
- app
region: flash_primary
size: 0xe2000
span: *id001
mcuboot_primary_app:
address: 0x18200
orig_span: &id002
- app
region: flash_primary
size: 0xe1e00
span: *id002
mcuboot_secondary:
address: 0x0
region: external_flash
size: 0xe2000