Hi Devzone,
I am facing an issue on my nrf52840-based custom board when I try to set up the USB mass storage class on an external NOR Flash as well as having MCUBoot enabled with the secondary slot partition on that same external flash.
I am able to reproduce the issue on a nRF52840 DK with Zephyr's USB Mass storage sample and the following configuration:
Windows, NCS v2.6.1 (my original issue also happens on v2.7.0, I have not tried v2.7.0 with the DK)
I have a pm_static.yml file defined as follows:
mcuboot_secondary: address: 0x00000 region: external_flash size: 0xdb000 storage_partition: affiliation: disk extra_params: { disk_name: "NAND", disk_cache_size: 4096, disk_sector_size: 512, disk_read_only: 0 } address: 0xdb000 region: external_flash size: 0xf25000
I modified the sample overlay for the nrf52840DK:
/* * Copyright (c) 2019 Peter Bigot Consulting, LLC * * SPDX-License-Identifier: Apache-2.0 */ /delete-node/ &storage_partition; &mx25r64 { partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; mcuboot_secondary: partition@0 { reg = <0x0 0xdb000>; read-only; }; storage_partition: partition@db000 { reg = <0xdb000 0xf25000>; }; }; }; / { chosen { nordic,pm-ext-flash = &mx25r64; }; msc_disk0 { compatible = "zephyr,flash-disk"; partition = <&storage_partition>; disk-name = "NAND"; cache-size = <4096>; }; };
And finally the proj.conf file. I added two configurations to the sample file: CONFIG_APP_MSC_STORAGE_FLASH_FATFS to enable FAT filesystem on the flash device, and CONFIG_BOOTLOADER_MCUBOOT to add MCUBoot
CONFIG_STDOUT_CONSOLE=y #USB related configs CONFIG_USB_DEVICE_STACK=y CONFIG_USB_DEVICE_PRODUCT="Zephyr MSC sample" CONFIG_USB_DEVICE_PID=0x0008 CONFIG_LOG=y CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y CONFIG_USB_MASS_STORAGE=y CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y CONFIG_USB_MASS_STORAGE_LOG_LEVEL_ERR=y CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n CONFIG_MAIN_STACK_SIZE=1536 CONFIG_BOOTLOADER_MCUBOOT=y CONFIG_APP_MSC_STORAGE_FLASH_FATFS=y
With MCUBoot disabled, the program compiles and performs fine, however when I enable MCUBoot I get the following error:
[101/195] Building C object zephyr/drivers/disk/CMakeFiles/drivers__disk.dir/flashdisk.c.obj FAILED: zephyr/drivers/disk/CMakeFiles/drivers__disk.dir/flashdisk.c.obj C:\ncs\toolchains\cf2149caf2\opt\zephyr-sdk\arm-zephyr-eabi\bin\arm-zephyr-eabi-gcc.exe -DKERNEL -DNRF52840_XXAA -DPICOLIBC_LONG_LONG_PRINTF_SCANF -DUSE_PARTITION_MANAGER=1 -D_FORTIFY_SOURCE=1 -D_POSIX_C_SOURCE=200809 -D__LINUX_ERRNO_EXTENSIONS__ -D__PROGRAM_START -D__ZEPHYR_SUPERVISOR__ -D__ZEPHYR__=1 -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/samples/subsys/usb/mass/build/zephyr/include/generated -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/soc/arm/nordic_nrf/nrf52 -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/soc/common/nordic_nrf/. -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/soc/arm/nordic_nrf/common/. -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/subsys/usb/device -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/usb/common/nrf_usbd_common/. -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/eqs-motion-s-zephyr.git/include -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/eqs-motion-s-zephyr.git/include/shared_types -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/nrf/include -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/nrf/tests/include -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/modules/hal/cmsis/CMSIS/Core/Include -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/modules/cmsis/. -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/modules/hal/nordic/nrfx -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/modules/hal/nordic/nrfx/drivers/include -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/modules/hal/nordic/nrfx/mdk -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/modules/hal_nordic/nrfx/. -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/modules/debug/segger/SEGGER -IC:/Users/LPC-008/Documents/eqs-motion-s-zephyr/modules/debug/segger/Config -isystem C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/lib/libc/common/include -isystem C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/nrfxlib/crypto/nrf_cc310_platform/include -Wshadow -fno-strict-aliasing -Os -imacros C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/samples/subsys/usb/mass/build/zephyr/include/generated/autoconf.h -fno-printf-return-value -fno-common -g -gdwarf-4 -fdiagnostics-color=always -mcpu=cortex-m4 -mthumb -mabi=aapcs -mfp16-format=ieee -mtp=soft --sysroot=C:/ncs/toolchains/cf2149caf2/opt/zephyr-sdk/arm-zephyr-eabi/arm-zephyr-eabi -imacros C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/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:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/samples/subsys/usb/mass=CMAKE_SOURCE_DIR -fmacro-prefix-map=C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr=ZEPHYR_BASE -fmacro-prefix-map=C:/Users/LPC-008/Documents/eqs-motion-s-zephyr=WEST_TOPDIR -ffunction-sections -fdata-sections --specs=picolibc.specs -std=c99 -MD -MT zephyr/drivers/disk/CMakeFiles/drivers__disk.dir/flashdisk.c.obj -MF zephyr\drivers\disk\CMakeFiles\drivers__disk.dir\flashdisk.c.obj.d -o zephyr/drivers/disk/CMakeFiles/drivers__disk.dir/flashdisk.c.obj -c C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:484:1: error: return type defaults to 'int' [-Werror=implicit-int] 484 | PM_FOREACH_AFFILIATED_TO_disk(DEFINE_FLASHDISKS_CACHE) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c: In function 'PM_FOREACH_AFFILIATED_TO_disk': C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:523:30: error: storage class specified for parameter 'flash_disks' 523 | static struct flashdisk_data flash_disks[] = { | ^~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:523:15: error: parameter 'flash_disks' is initialized 523 | static struct flashdisk_data flash_disks[] = { | ^~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:524:39: error: 'DEFINE_FLASHDISKS_DEVICE' undeclared (first use in this function) 524 | PM_FOREACH_AFFILIATED_TO_disk(DEFINE_FLASHDISKS_DEVICE) | ^~~~~~~~~~~~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:524:39: note: each undeclared identifier is reported only once for each function it appears in C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:533:1: error: expected declaration specifiers before 'PM_FOREACH_AFFILIATED_TO_disk' 533 | PM_FOREACH_AFFILIATED_TO_disk(VERIFY_CACHE_SIZE_IS_NOT_ZERO_IF_NOT_READ_ONLY) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In file included from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/toolchain/gcc.h:98, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/toolchain.h:50, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/sys/__assert.h:11, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:10: C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:141:44: error: storage class specified for parameter '__init_disk_flash_init' 141 | #define Z_INIT_ENTRY_NAME(init_id) _CONCAT(__init_, init_id) | ^~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/toolchain/common.h:137:26: note: in definition of macro '_DO_CONCAT' 137 | #define _DO_CONCAT(x, y) x ## y | ^ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:141:36: note: in expansion of macro '_CONCAT' 141 | #define Z_INIT_ENTRY_NAME(init_id) _CONCAT(__init_, init_id) | ^~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:208:17: note: in expansion of macro 'Z_INIT_ENTRY_NAME' 208 | Z_INIT_ENTRY_NAME(name) = {.init_fn = {.sys = (init_fn_)}} | ^~~~~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:190:9: note: in expansion of macro 'SYS_INIT_NAMED' 190 | SYS_INIT_NAMED(init_fn, init_fn, level, prio) | ^~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:563:1: note: in expansion of macro 'SYS_INIT' 563 | SYS_INIT(disk_flash_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); | ^~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:206:42: error: parameter '__init_disk_flash_init' is initialized 206 | static const Z_DECL_ALIGN(struct init_entry) \ | ^~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/toolchain/common.h:195:55: note: in definition of macro 'Z_DECL_ALIGN' 195 | #define Z_DECL_ALIGN(type) __aligned(__alignof(type)) type | ^~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:190:9: note: in expansion of macro 'SYS_INIT_NAMED' 190 | SYS_INIT_NAMED(init_fn, init_fn, level, prio) | ^~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:563:1: note: in expansion of macro 'SYS_INIT' 563 | SYS_INIT(disk_flash_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); | ^~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:141:44: error: section attribute not allowed for '__init_disk_flash_init' 141 | #define Z_INIT_ENTRY_NAME(init_id) _CONCAT(__init_, init_id) | ^~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/toolchain/common.h:137:26: note: in definition of macro '_DO_CONCAT' 137 | #define _DO_CONCAT(x, y) x ## y | ^ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:141:36: note: in expansion of macro '_CONCAT' 141 | #define Z_INIT_ENTRY_NAME(init_id) _CONCAT(__init_, init_id) | ^~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:208:17: note: in expansion of macro 'Z_INIT_ENTRY_NAME' 208 | Z_INIT_ENTRY_NAME(name) = {.init_fn = {.sys = (init_fn_)}} | ^~~~~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:190:9: note: in expansion of macro 'SYS_INIT_NAMED' 190 | SYS_INIT_NAMED(init_fn, init_fn, level, prio) | ^~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:563:1: note: in expansion of macro 'SYS_INIT' 563 | SYS_INIT(disk_flash_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); | ^~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:206:42: warning: 'used' attribute ignored [-Wattributes] 206 | static const Z_DECL_ALIGN(struct init_entry) \ | ^~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/toolchain/common.h:195:55: note: in definition of macro 'Z_DECL_ALIGN' 195 | #define Z_DECL_ALIGN(type) __aligned(__alignof(type)) type | ^~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:190:9: note: in expansion of macro 'SYS_INIT_NAMED' 190 | SYS_INIT_NAMED(init_fn, init_fn, level, prio) | ^~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:563:1: note: in expansion of macro 'SYS_INIT' 563 | SYS_INIT(disk_flash_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); | ^~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:141:44: error: alignment may not be specified for '__init_disk_flash_init' 141 | #define Z_INIT_ENTRY_NAME(init_id) _CONCAT(__init_, init_id) | ^~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/toolchain/common.h:137:26: note: in definition of macro '_DO_CONCAT' 137 | #define _DO_CONCAT(x, y) x ## y | ^ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:141:36: note: in expansion of macro '_CONCAT' 141 | #define Z_INIT_ENTRY_NAME(init_id) _CONCAT(__init_, init_id) | ^~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:208:17: note: in expansion of macro 'Z_INIT_ENTRY_NAME' 208 | Z_INIT_ENTRY_NAME(name) = {.init_fn = {.sys = (init_fn_)}} | ^~~~~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:190:9: note: in expansion of macro 'SYS_INIT_NAMED' 190 | SYS_INIT_NAMED(init_fn, init_fn, level, prio) | ^~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:563:1: note: in expansion of macro 'SYS_INIT' 563 | SYS_INIT(disk_flash_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); | ^~~~~~~~ In file included from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/device.h:13, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/sw_isr_table.h:18, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/arch/arm/irq.h:19, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/arch/arm/arch.h:27, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/arch/cpu.h:19, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/kernel_includes.h:37, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/kernel.h:17, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/drivers/disk.h:28, from C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:12: C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:563:10: error: 'disk_flash_init' undeclared (first use in this function) 563 | SYS_INIT(disk_flash_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); | ^~~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:208:64: note: in definition of macro 'SYS_INIT_NAMED' 208 | Z_INIT_ENTRY_NAME(name) = {.init_fn = {.sys = (init_fn_)}} | ^~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:563:1: note: in expansion of macro 'SYS_INIT' 563 | SYS_INIT(disk_flash_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); | ^~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:484:1: error: type of 'DEFINE_FLASHDISKS_CACHE' defaults to 'int' [-Werror=implicit-int] 484 | PM_FOREACH_AFFILIATED_TO_disk(DEFINE_FLASHDISKS_CACHE) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:141:44: error: declaration for parameter '__init_disk_flash_init' but no such parameter 141 | #define Z_INIT_ENTRY_NAME(init_id) _CONCAT(__init_, init_id) | ^~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/toolchain/common.h:137:26: note: in definition of macro '_DO_CONCAT' 137 | #define _DO_CONCAT(x, y) x ## y | ^ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:141:36: note: in expansion of macro '_CONCAT' 141 | #define Z_INIT_ENTRY_NAME(init_id) _CONCAT(__init_, init_id) | ^~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:208:17: note: in expansion of macro 'Z_INIT_ENTRY_NAME' 208 | Z_INIT_ENTRY_NAME(name) = {.init_fn = {.sys = (init_fn_)}} | ^~~~~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/include/zephyr/init.h:190:9: note: in expansion of macro 'SYS_INIT_NAMED' 190 | SYS_INIT_NAMED(init_fn, init_fn, level, prio) | ^~~~~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:563:1: note: in expansion of macro 'SYS_INIT' 563 | SYS_INIT(disk_flash_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT); | ^~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:523:30: error: declaration for parameter 'flash_disks' but no such parameter 523 | static struct flashdisk_data flash_disks[] = { | ^~~~~~~~~~~ C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:565: error: expected '{' at end of input C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:565: warning: control reaches end of non-void function [-Wreturn-type] C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c: At top level: C:/Users/LPC-008/Documents/eqs-motion-s-zephyr/zephyr/drivers/disk/flashdisk.c:415:37: warning: 'flash_disk_ops' defined but not used [-Wunused-const-variable=] 415 | static const struct disk_operations flash_disk_ops = { | ^~~~~~~~~~~~~~ cc1.exe: some warnings being treated as errors [109/195] Building C object zephyr/drivers/usb/device/CMakeFiles/drivers__usb__device.dir/usb_dc_nrfx.c.obj
On different projects I have been able to use both functionalities separately (mass storage on an external flash, and MCUBoot's secondary partition on an external flash), so I am confident the configuration for these individual things is correct, but for some reason I am not able to use these both at the same time ? Can you help me how to resolve the issue please ?
I am happy to provide more information if needed
Thanks in advance
Best regards,
Nicolas Goualard