Problems with accessing storage_partition in an MCUBoot-enabled application under Zephyr

I've spent a couple days researching how to write a small amount of data to the storage_partition that is fairly standard in Nordic devicetrees. I haven't been successful and am looking for guidance.

My setup: nrf Connect SDK v2.2.0, Zephyr, nrf52840, using MCUBoot for DFU updates. I believe the fact that my application uses MCUBoot is the crucial bit of information.

Here's my board's Devicetree for the flash partitions.

&flash0 {
	 partitions {
		 compatible = "fixed-partitions";
		 #address-cells = <1>;
		 #size-cells = <1>;
 
		 boot_partition: partition@0 {
			 label = "mcuboot";
			 reg = <0x000000000 0x0000C000>;
		 };
		 slot0_partition: partition@c000 {
			 label = "image-0";
			 reg = <0x0000C000 0x00067000>;
		 };
		 slot1_partition: partition@73000 {
			 label = "image-1";
			 reg = <0x00073000 0x00067000>;
		 };
		 scratch_partition: partition@da000 {
			 label = "image-scratch";
			 reg = <0x000da000 0x0001e000>;
		 };
 
		 /*
		  * The flash starting at 0x000f8000 and ending at
		  * 0x000fffff is reserved for use by the application.
		  */
 
		 /*
		  * Storage partition will be used by FCB/LittleFS/NVS
		  * if enabled.
		  */
		 storage_partition: partition@f8000 {
			 label = "storage";
			 reg = <0x000f8000 0x00008000>;
		 };
	 };
 };

I am able to successfully build and run the following sample program for the nrf52840 DK. This sample does not assume MCUBoot is present.

https://github.com/nrfconnect/sdk-zephyr/blob/v3.2.99-ncs1-branch/samples/drivers/soc_flash_nrf/src/main.c

If I import this sample into my application and board, which includes MCUBoot, it fails. Note that I've changed "slot1_partition" to "storage_partition". It works completely fine if I leave TEST_PARTITION as "slot1_partition".  

#ifdef CONFIG_TRUSTED_EXECUTION_NONSECURE
#define TEST_PARTITION	storage_partition
#else
#define TEST_PARTITION	storage_partition
#endif

#define TEST_PARTITION_OFFSET	FIXED_PARTITION_OFFSET(TEST_PARTITION)
#define TEST_PARTITION_DEVICE	FIXED_PARTITION_DEVICE(TEST_PARTITION)

#define FLASH_PAGE_SIZE   4096
#define TEST_DATA_WORD_0  0x1122
#define TEST_DATA_WORD_1  0xaabb
#define TEST_DATA_WORD_2  0xabcd
#define TEST_DATA_WORD_3  0x1234

#define FLASH_TEST_OFFSET2 0x41234
#define FLASH_TEST_PAGE_IDX 37

void main(void)
{
	const struct device *flash_dev = TEST_PARTITION_DEVICE;
	uint32_t buf_array_1[4] = { TEST_DATA_WORD_0, TEST_DATA_WORD_1,
				    TEST_DATA_WORD_2, TEST_DATA_WORD_3 };
	uint32_t buf_array_2[4] = { TEST_DATA_WORD_3, TEST_DATA_WORD_1,
				    TEST_DATA_WORD_2, TEST_DATA_WORD_0 };
	uint32_t buf_array_3[8] = { TEST_DATA_WORD_0, TEST_DATA_WORD_1,
				    TEST_DATA_WORD_2, TEST_DATA_WORD_3,
				    TEST_DATA_WORD_0, TEST_DATA_WORD_1,
				    TEST_DATA_WORD_2, TEST_DATA_WORD_3 };
	uint32_t buf_word = 0U;
	uint32_t i, offset;

	printf("\nNordic nRF5 Flash Testing\n");
	printf("=========================\n");

	if (!device_is_ready(flash_dev)) {
		printf("Flash device not ready\n");
		return;
	}
..... 

The primary symptom here is that TEST_PARTITION_DEVICE gets processed as NULL, so the device is null and the device_is_ready() test fails.

So to summarize, my MCUBoot-enabled project cannot access storage_partition. It can access slot1_partition.

I've looked into possibly using pm_static.yml, but when I define the storage partition there, my application images don't get placed in the flash.

It would be wonderful if there were a simple way I could add the definition of the storage_partition only, or even better, directly use the devicetree's specification of the storage_partition.

Thanks in advance for looking into this.

Best,

Steve

Related